平台firefly-rk3399/AIO-3399C,固件版本:ubuntu18.04
下載編譯ubuntu18固件可以完全按照firefly的官方WiKi來,沒有雷。
firefly提供了兩種下載固件的方式,一種是燒錄統一固件,另外一種是按需燒錄分區固件。在調試的過程中,按需下載分區固件是比較常用的。
如何你更改了u-boot,可以把生成的trust.img和uboot.img一起下載進板子中。如果更改內核,則只需要燒錄boot.img。使用make menuconfig更改內核時,再執行一句make savedefconfig,把生成的.defconfig文件替換掉原來的.defconfig文件(在kernel/arch/arm64/configs/目錄下),每次編譯內核會顯示你所用到的.defconfig文件,如下圖,
再返回編譯內核。下圖是我使用的分區信息。
1、上電開機。
RK3399和AIO-3399C的PMIC為RK808D。其中34引腳VDC是強制上電引腳。在RK808D的芯片手冊上,可以看到VDC的電壓范圍是-0.3~7v。上升沿門限是0.6v,下降沿門限是0.54v。
看到網上有一種說法,RK808D的VDC引腳在上電時電壓維持在0.6~1.8v之間500ms左右遍強制開機。但是在芯片手冊上並沒有找到詳細的描述(關於電壓范圍以及持續時間)。
(參考https://blog.csdn.net/u014411165/article/details/107156253?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-6.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-6.pc_relevant_default&utm_relevant_index=8)
以上圖片來自於RK808D 的datasheet(網上隨手一搜可以找到)中。
在芯片手冊中給出的兩種應用中,VDC的電壓維持在0.6v以上。
但是看firefly-rk3399的原理圖。
發現在去除二極管壓降后根據電阻分壓,VDC引腳大概在3.35v左右,是遠超過上面說的電壓范圍的,甚是不解。這時候又看到一種說法(參考https://blog.csdn.net/weixin_42205910/article/details/113857324),對於RK3399核心板來說,pwr_en是強制開機引腳,大於3v核心板自動開機。猜想兩者之間是不是有什么聯系。這個問題暫時搞不明白,留待探索。
2、上電(插電)待機,按下powerkey開機。
參考:https://blog.csdn.net/win_fu/article/details/114371753?utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~default-1.no_search_link
上面的代碼可以直接用,其中key_is_pressed和key_read函數在u-boot/drivers/input/key_uclass.c里面(感謝博主的分享!)。燈的引腳號改成firefly-rk3399的燈的號。接下來的操作很關鍵。改好代碼之后,打開configs/下的使用的defconfig文件,將CONFIG_DM_KEY=y,CONFIG_RK_KEY=y,CONFIG_RK8XX_PWRKEY=y添在后面。或者可以在u-boot目錄下用menuconfig方式進行更改(與編譯內核一樣的操作),但是要讓它起作用的話,還需要在make menuconfig之后再make savedefconfig,此時會生成一個.defconfig文件,把這個文件替換u-boot當前使用的.defconfig文件替換掉(使用make menuconfig更改內核時一樣的操作)。要讓燈亮的話,設置CONFIG_LED=y,和CONFIG_CPIO_LED=y就可以。
如果讓待機過程中燈閃爍,做一下小小的改動就可以。u-boot里面也提供udelay延時函數。如果自己采用一個循環做延時(加減一個數)貌似是不行的,至於為什么不行,還沒找到原因,留待以后解決。
這種方法實際上使板子卡在u-boot部分,沒有什么特別復雜的。
3、開機之后如何使用powerkry一鍵關機。
在firefly-rk3399的官方固件中,短按下按鍵默認彈出菜單欄(shutdown,reboot,suspend等的選項),長按時拉低power_on引腳一定時間(貌似是5s)斷電關機。現在想改成短按直接軟關機,不彈出菜單欄。
參考:https://www.jianshu.com/p/835d5afbc163
使用的是第四種方法,其他的方法並沒有試,感興趣的可以自己試下。默認情況下HandlePowerKey=ignore,將ignore改為poweroff即可。至於poweroff和shutdown的區別可以參考:https://blog.csdn.net/weixin_34256074/article/details/91891692。
4、如何檢測應用程序的運行狀態
參考:https://blog.csdn.net/weixin_33737134/article/details/91751172
https://blog.csdn.net/weixin_33737134/article/details/91751172
簡單解釋下重點語句:ps -ef| grep XXX|grep -v grep |wc -l的作用
關於ps -ef命令可以參考:https://www.cnblogs.com/jiqing9006/p/10036676.html(非常詳細)。
grep XXX是指找出進程名為XXX的進程。單獨使用時會額外多出一條設計查找XXX的grep指令,如下:
有時候需要過濾掉這條結果避免誤判。
grep -v grep 就是過濾由於grep產生的那條結果。wc -l(字母l)是指查找結果有幾條。
除此之外還會涉及到一些shell腳本的語法,在這把如何寫分支以及如何寫與或非等參考的文章放在下面以供參考。
如何創建.sh腳本文件:終端輸入vim XXX.sh,第一行中寫入#!/bin/bash,后面寫自己的內容。最后保存退出即可。
如何執行.sh腳本文件:1、sh XXX.sh 2、./XXX.sh (加上絕對路徑也可以)
if分支:https://blog.csdn.net/xinshuzhan/article/details/107827399
其中fi是指一個if語句的結束。if與[判斷語句]之間必須得有個空格,即if [XXXX]。
判斷語句(等於不等於啥的):https://blog.csdn.net/weixin_45110196/article/details/104660287?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ELandingCtr%7ERate-3.queryctrv4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ELandingCtr%7ERate-3.queryctrv4&utm_relevant_index=6
與或非:https://blog.csdn.net/weixin_42715225/article/details/107178251
最后再說一下linux中周期性任務的執行辦法:
可以參考:https://zhuanlan.zhihu.com/p/271980834
使用這種方法,在firefly-rkk3399(ubuntu18.04)的板子上,cron會自啟動,也可以用這種辦法到達使程序自啟動的目的。但是crontab的最小間隔是1分鍾,實際可能需要更短的周期,如何用cron實現可參考:https://www.cnblogs.com/zmdComeOn/p/10330482.html
除此之外還有一種方法可以實現周期性的任務使用systemd單元,詳細可參考:https://www.ruanyifeng.com/blog/2018/03/systemd-timer.html和https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
systemd教程:https://blog.csdn.net/KuXiaoQuShiHuai/article/details/113922591
使用這種方法可以實現周期性執行某個腳本文件,但是卻無法執行腳本文件中的執行.py文件的命令,沒有找到問題所在,留待以后解決。
5、開機自啟動程序
在firefly-rk3399(ubuntu18.04)下,把執行程序的命令放在/etc/rc.local文件中即可。
6、關機自啟動程序
參考:https://blog.csdn.net/weixin_39867212/article/details/116626657?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.queryctrv4&spm=1001.2101.3001.4242.2&utm_relevant_index=4
和https://blog.csdn.net/hyklose/article/details/80222070
注意第二個鏈接中的update-rc.d myscript defaults語句可能沒有作用,所以可以一條一條的進行連接ln -s XXX。