查看: 229|回复: 0

[心得] 在BBB启动时自动加载dtbo(或执行脚本、运行程序)

[复制链接]

36

主题

1

好友

502

积分

举人

Rank: 4

  • TA的每日心情

    2015-8-5 11:09
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-7-20 15:23:57 |显示全部楼层
    启动时自动加载dtbo,实际上就是做了一个cape。

    用uEnv.txt不用eeprom的话,也可以通过修改uEnv.txt文件来实现自动加载dtbo文件。USB连接好BBB以后在电脑里会出现一个盘符,里面有一个叫做uEnv.txt的文件。通过它可以设置系统启动时加载或禁止加载的dtbo。比如我想在系统启加载BB-ADC。我们就可以打开它,在下面添加一行:
    1. optargs=quiet capemgr.enable_partno=BB-ADC  
    复制代码
    然后安全弹出这个盘符,重启BBB就行啦。
    我们知道BBB启动会自动加载HDMI,而HDMI与LCD公用了部分引脚。如果我们想启动后再插上LCD,然后 echo BB-BONE-LCD4-01 > $SLOTS 来加载LCD cape的话,会提示你File exists,就是因为HDMI已经首先加载了,那些引脚就不能再动了。但我们可以配置uEnv.txt使得启动时不自动加载HDMI,方法是在uEnv.txt中添加一行:
    1. optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN  
    复制代码
    就OK啦。
    注意,如果想同时实现上面两个,即禁用HDMI并加载ADC的话,不能简简单单把上面两句话写进去,应该合并成一句话:
    1. optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN capemgr.enable_partno=BB-ADC
    复制代码
    否则会失败。

    所以,使用eeprom的意义就在于方便啦。什么也不用配置,买回来插上就能用。如果你爱折腾的话,那么实现方法就多了去啦。

    用systemd
    上面说的修改uEnv.txt的方法其实跟用eeprom的效果是差不多的——一个不能用的话另一个也不能用= =!

    6月的Angstrom系统(终端输入 uname -a 查看你的BBB里装的是哪个版本的系统)有bug,如果你自己编译了一个dtbo文件,即便放进 /lib/firmware 目录下也不能自动加载(/lib/firmware里原本就有的可以加载是因为它们已经被编译进内核了)。所以除非你自己编译一遍系统,否则不能用这个办法在启动时自动加载自己的cape。刚说了用uEnv.txt跟用eeprom差不多……所以也不行。

    9月的Angstrom系统稍微修改了这个bug,但还是不好用——系统启动时会在加载cape那步停留60秒才继续……本来Angstrom是以启动速度快见长的,只需10秒。这一下拖了太多后腿了。(而且9月的Angstrom系统增添了新的bug——LCD电阻触摸屏指针会漂移!想自己解决这个问题当然依旧只能重新编译系统——不是每个人都有耐心编译系统玩的!所以即便它是新系统,我还是果断使用6月的吧,至少触摸屏正常。)

    总之,无论哪个版本的Angstrom系统,eeprom和uEnv.txt法都不太好使,下面就介绍一个完全不同的招数:使用systemd。

    Step by step教学:

    Step 1.
    在/etc/systemd/system目录下新建一个文件,命名mystartup.service(名字可以自定),内容如下:
    1. [Unit]  
    2.     Description=My script  
    3. [Service]  
    4.     ExecStart=/home/root/mystartup.sh  
    5. [Install]  
    6.     WantedBy=multi-user.target   
    复制代码
    Description是写给自己看的注释,可以随便写。mystartup.sh是要启动时自动执行的脚本。
    注意:不能写成ExecStart=/bin/sh /path/to/script.sh这样的,直接按上面给出的例子写就好了。

    Step 2.
    然后在 /home/root 目录新建一个mystartup.sh,内容如下:
    1. #!/bin/sh  
    2.     echo BB-YOUR-CAPE > /sys/devices/bone_capemgr.8/slots  
    复制代码
    别忘了添加执行权限
    1. chmod a+x mystartup.sh  
    复制代码
    注意:
    1、这里必须用sh脚本,不能用bash脚本。
    2、sh脚本中不能使用bone_capemgr.*这样的通配符,必须是bone_capemgr.8或者.9(根据你的系统来写)
    3、当然,dtbo文件还是必须得放在 /lib/firmware 下才行。
    Step 3.

    最后执行命令:
    1. systemctl enable mystartup.service  
    复制代码
    就可以了。重启BBB会发现成功加载了dtbo。

    如果你执行dmesg | grep capemgr,会发现加载dtbo的时间点跟用eeprom或uEnv.txt不同,所以跟启动以后手动输入 echo 命令的效果类似。

    转自博客魏来之路


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /3 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-9-24 18:15 , Processed in 0.445152 second(s), 9 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部