平台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。