系统web启动时加载类,dts 是怎么被加载的

linux驱动(70)
原文地址:.cn/thread--1.html,感觉有用先存着,感谢作者分享!
如果你买来BBB是为了搞跟硬件相关的项目,那你八成需要制作一个cape。cape是BBB官方的叫法,其实就是指BBB的软件和硬件外设。通过学习device tree我们了解到BBB是使用capemgr和device tree来控制cape的,通过向$SLOTS传入dtbo文件来加载某个cape,像这样:
echo BB-ADC & $SLOTS
但有时候我们不想每次都手动输入这样一条命令来启用某个cape,而是想让它开机自动启动。这时就需要用到本文讲的内容了。
要做到开机自动启动,你只需要增加一个eeprom(官方推荐的型号是CAT24C256),并把它接到特定的引脚上,里面写上符合规定格式的内容就行了。系统在启动时会检查特定引脚上有没有符合规定格式的eeprom,如果有的话,就按照eeprom里面的内容自动加载相应的dtbo文件。
还记得我们 cat $SLOTS 看到了什么吗?
cat /sys/devices/bone_capemgr.*/slots&&
0: 54:PF---& &
1: 55:PF---& &
2: 56:PF---& &
3: 57:PF---& &
4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G&&
5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
这里前4项为什么是空的呢?因为它们就是给那些有EEPROM的实体cape预留的位置。不难看出,这样的实体cape最多只能插4个。
二、eeprom的连接
这里的知识比较零散,我将分点阐述:
eeprom的地址必须在0x54到0x57之间,否则系统不会加载。科普一下:不管什么牌子的eeprom芯片,它们的地址都是一样的,高4位是1010,低3位对应着芯片的A2,A1,A0这3个引脚的电平(有的芯片只有A1和A0),所以通过外接电路就能改变eeprom的地址。也就是说eeprom的地址只可能是0x50到0x57这8种,如果A2保持高电平,那么就只有0x54到0x57这4个地址可用了(这就是SRM(BBB官方参考手册)里eeprom电路中把A2接高电平的原因。eeprom必须连接到BBB的I2C2_SCL和I2C2_SDA引脚上(在系统中看到的是i2c-1)。因为I2C2这两个引脚的默认功能就是i2c功能。这也告诉我们,程序中尽量不要永久改变这两个引脚的功能复用,否则就没法加载cape了。BBB最多只支持同时插4个eeprom,它们的地址必须互不相同。如果一次插入多个eeprom,会依次读取之。准确来说,读取顺序就是从0x54到0x57的顺序。为什么如此强调overlay的加载顺序呢?因为一旦前面加载的overlay占用了某些片上资源,其他overlay就不能再用了。比如我要做的LCD使用的引脚跟默认加载的HDMI用的引脚是有重叠的,当系统启动时首先加载了LCD的overlay,那么HDMI就不能再加载了。eeprom上WP引脚是写保护用的,一旦上拉,就不能进行写入了。所以自己做电路的时候可以把它悬空或者拉低。
三、eeprom的读写
下面先介绍如何进行读写,再介绍该写入什么东西。
首先确定eeprom的地址。由A0,A1,A2三个引脚的电平确,按照上面刚刚说的,比如我把A0,A1接地,A2拉高,地址就是0x54。
然后在命令行操作:
cd /sys/bus/i2c/devices/1-0054/&&#到eeprom目录中&&
cat eeprom | hexdump -C&&#读取eeprom内容并以字符形式显示&&
echo -e &\xaa\x55\x33\xeeA1Beaglebone LCD4 Cape\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0000A1BeagleboardToys\x00BB-BONE-LCD4-01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00& & eeprom&&#写入内容&&
cat eeprom | hexdump -C&&#确认是否写入成功&&
其中\x开头的字符代表按ASCII码值写入。上面就写入了官方LCD4 cape的eeprom内容。如果你想自制LCD cape,使用的LCD面板参数跟官方的一样的话,那么系统使用的驱动程序就是一样的,所以就可以直接用上面的eeprom内容加载BBB自带的dtbo文件了,就不必自己重写dtbo文件了。
写入内容时,要按照SRM里的标准(如下图),最重要的是要把头6个字节\xaa\x55\x33\xeeA1以及后面的版本号00A1和要调用的dtbo文件名BB-BONE-LCD4-01写对,其他的比Number of Pins什么的都无所谓。空余的地方必须用\x00补全,用其他字符会产生错误。
经过上面的方法配置好eeprom后,系统就能在启动时自动加载对应的dtbo文件了。但是这里还是再强调一下dts文件编写的注意事项。
四、编写dts文件的注意事项
文件名必须是 boardname-version.dts 的形式,比如 BB-BONE-LCD4-01-00A0.dts。这里面BB-BONE-LCD4-01就是boardname,00A0就是version号。(其实dts的名字无所谓了。。关键是编译出来的dtbo名字必须是它,为了统一,就都这么规定吧)。version必须是00AX的形式,X从0开始按版本依次增加,而且,想命名00A1,必须有00A0的存在才行!不能跨越版本!dts文件里面会有part-number和version这两项,其内容必须跟文件名相符!part-number就是boardname。编译完的dtbo文件必须放到 /lib/firmware/ 目录中才可以加载。
OK,上面介绍了所有cape通用的内容。具体某个cape需要加载特定的驱动,那就是如何写dts文件和配置驱动的问题了,在此就不做讨论啦。
五、其实不用eeprom也能做——uEnv.txt
其实不用eeprom的话,也可以通过修改uEnv.txt文件来实现自动加载dtbo文件。USB连接好BBB以后在电脑里会出现一个盘符,里面有一个叫做uEnv.txt的文件。通过它可以设置系统启动时加载或禁止加载的dtbo。比如我想在系统启加载BB-ADC。我们就可以打开它,在下面添加一行:
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中添加一行:
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
注意,如果想同时实现上面两个,即禁用HDMI并加载ADC的话,不能简简单单把上面两句话写进去,应该合并成一句话:
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN capemgr.enable_partno=BB-ADC
否则会失败。
所以,使用eeprom的意义就在于方便啦。什么也不用配置,买回来插上就能用。如果你爱折腾的话,那么实现方法就多了去啦。
六、其实不用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教学:
在/etc/systemd/system目录下新建一个文件,命名mystartup.service(名字可以自定),内容如下:
Description=My script
ExecStart=/home/root/mystartup.sh
WantedBy=multi-user.target
Description是写给自己看的注释,可以随便写。mystartup.sh是要启动时自动执行的脚本。
注意:不能写成ExecStart=/bin/sh /path/to/script.sh这样的,直接按上面给出的例子写就好了。
然后在 /home/root 目录新建一个mystartup.sh,内容如下:
echo BB-YOUR-CAPE & /sys/devices/bone_capemgr.8/slots
1、这里必须用sh脚本,不能用bash脚本。
2、sh脚本中不能使用bone_capemgr.*这样的通配符,必须是bone_capemgr.8或者.9(根据你的系统来写)
3、当然,dtbo文件还是必须得放在 /lib/firmware 下才行。
最后执行命令:
systemctl enable myscript.service
就可以了。重启BBB会发现成功加载了dtbo。
如果你执行dmesg | grep capemgr,会发现加载dtbo的时间点跟用eeprom或uEnv.txt不同,所以跟启动以后手动输入 echo 命令的效果类似。
我当然推荐第六种方法。预计在找到更好的办法之前,这就是我将来在Development Kit里采用的办法了。想要使用我的Kit的话建议掌握这个小技巧。
最后这句写给能看懂的人,看不懂就不必深究了:crontab @reboot 在BBB的Angstrom里不好使,不用尝试了。似乎会被系统kill掉。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19923次
排名:千里之外
转载:103篇
(8)(16)(10)(1)(15)(1)(4)(11)(33)(4)19121人阅读
&DTS是Device Tree Source的缩写,用来描述设备的硬件细节。在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data。为了去掉这些垃圾代码,Linux采用DTS这种新的数据结构来描述硬件设备。采用Device
Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。
& & & &有关DTS的语法格式,网上有很多资料,这里我就不再赘述了。本文主要讲Linux是怎样加载DTS设备节点的流程。下面以高通QCT8974平台(Linux内核)为例进行讲解:
(1)使用DTS注册平台总线的过程
& & & &在讲注册过程之前,我们先看看DTS是怎样描述平台总线结构的,以i2c总线为例:
从上面可知,系统平台上挂载了很多总线,如i2c、spi、uart等等,每一个总线分别被描述为一个节点。Linux在启动后,到C入口时,会执行以下操作,加载系统平台上的总线和设备:
start_kernel() --& setup_arch() --& unflatten_device_tree()&
unflatten_device_tree()的代码如下:
&在执行完unflatten_device_tree()后,DTS节点信息被解析出来,保存到allnodes链表中,allnodes会在后面被用到。
随后,当系统启动到board文件时,会调用.init_machine,高通8974平台对应的是msm8974_init()。接着调用of_platform_populate(....)接口,加载平台总线和平台设备。至此,系统平台上的所有已配置的总线和设备将被注册到系统中。注意:不是dtsi文件中所有的节点都会被注册,在注册总线和设备时,会对dts节点的状态作一个判断,如果节点里面的status属性没有被定义,或者status属性被定义了并且值被设为“ok”或者“okay”,其他情况则不被注册到系统中。
(2)使用DTS注册总线设备的过程
& & & &上面讲了Linux怎样使用DTS注册平台总线和平台设备到系统中,那么其他设备,例如i2c、spi设备是怎样注册到系统中的呢?下面我们就以i2c设备为例,讲解Linux怎样注册i2c设备到系统中。
&以高通8974平台为例,在注册i2c总线时,会调用到qup_i2c_probe()接口,该接口用于申请总线资源和添加i2c适配器。在成功添加i2c适配器后,会调用of_i2c_register_devices()接口。此接口会解析i2c总线节点的子节点(挂载在该总线上的i2c设备节点),获取i2c设备的地址、中断号等硬件信息。然后调用request_module()加载设备对应的驱动文件,调用i2c_new_device(),生成i2c设备。此时设备和驱动都已加载,于是drvier里面的probe方法将被调用。后面流程就和之前一样了。
& & & &简而言之,Linux采用DTS描述设备硬件信息后,省去了大量板文件垃圾信息。Linux在开机启动阶段,会解析DTS文件,保存到全局链表allnodes中,在掉用.init_machine时,会跟据allnodes中的信息注册平台总线和设备。值得注意的是,加载流程并不是按找从树根到树叶的方式递归注册,而是只注册根节点下的第一级子节点,第二级及之后的子节点暂不注册。Linux系统下的设备大多都是挂载在平台总线下的,因此在平台总线被注册后,会根据allnodes节点的树结构,去寻找该总线的子节点,所有的子节点将被作为设备注册到该总线上。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:292102次
积分:3905
积分:3905
排名:第7875名
原创:119篇
转载:52篇
评论:15条
(2)(4)(3)(2)(2)(2)(3)(2)(4)(5)(4)(3)(1)(1)(2)(3)(3)(2)(7)(5)(4)(2)(3)(5)(2)(5)(3)(10)(2)(4)(4)(13)(1)(8)(10)(2)(1)(6)(13)(10)(2)(1)openwrt(4)
原文地址:&作者:
1. 在\kernel\of\fdt.c 中有如下初始化函数& 注释上:展开设备树,创建device_nodes到全局变量allnodes中
void __init&unflatten_device_tree(void)
&&& __unflatten_device_tree(initial_boot_params, &allnodes,
&&& &&& &&& &&& early_init_dt_alloc_memory_arch);
&&& /* Get pointer to &/chosen& and &/aliasas& nodes for use everywhere */
&&& of_alias_scan(early_init_dt_alloc_memory_arch);
unflatten_device_tree函数被setup_arch函数调用,
因为我们使用得是arm平台所以存在\kernel\arch\arm\kernel\setup.c中
void __init&setup_arch(char **cmdline_p)
unflatten_device_tree()
setup_arch函数在kernel启动是被调用,如下启动kernel存在\kernel\init\main.c中&
asmlinkage void __init start_kernel(void)
& setup_arch(&command_line);
这些工作完成解析DTS文件。保存到全局链表allnodes中。
2、在makefile中有这段话来编译dts文件:
$(obj)/A20%.dtb: $(src)/dts/A20%.dts FORCE
&&& $(call if_changed_dep,dtc)
$(obj)/A68M%.dtb: $(src)/dts/A68M%.dts FORCE
&&& $(call if_changed_dep,dtc)
和.c文件生成.o文件一样 回生成.dtb文件。在
/home/liyang/workspace/SZ_JB-mr1-8628-bsp-1012/out/target/product/msm8226/obj/KERNEL_OBJ/arch/arm/boot
目录下,与zimage一个目录。
在 board-8226.c中有初始化函数--&启动自动掉用
void __init msm8226_init(void)
&& of_platform_populate(NULL, of_default_bus_match_table, adata, NULL);
of_platform_populate在kernel\driver\of\platform.c中定义,回查询
&&& root = root ? of_node_get(root) : of_find_node_by_path(&/&);
&&& for_each_child_of_node(root, child)&
&&& &&& rc = of_platform_bus_create(child, matches, lookup, parent, true);
&&& &&& if (rc)
&&& &&& &&&
&&& of_node_put(root);
在这里用到得函数of_find_node_by_path会最终调用到kernel\driver\of\base.c中得函数
struct device_node *of_find_node_by_path(const char *path)
& 遍历第1步中得allnodes找到根节点
&of_platform_bus_create()函数中创建得内容存在了 adata中。
以下内容为转载:
(2)使用DTS注册总线设备的过程& &&
&以高通8974平台为例,在注册i2c总线时,会调用到qup_i2c_probe()接口,该接口用于申请总线资源和添加i2c适配器。在成功添加i2c适配器后,会调用of_i2c_register_devices()接口。此接口会解析i2c总线节点的子节点(挂载在该总线上的i2c设备节点),获取i2c设备的地址、中断号等硬件信息。然后调用request_module()加载设备对应的驱动文件,调用i2c_new_device(),生成i2c设备。此时设备和驱动都已加载,于是drvier里面的probe方法将被调用。后面流程就和之前一样了。
& & & &简而言之,Linux采用DTS描述设备硬件信息后,省去了大量板文件垃圾信息。Linux在开机启动阶段,会解析DTS文件,保存到全局链表allnodes中,在掉用.init_machine时,会跟据allnodes中的信息注册平台总线和设备。值得注意的是,加载流程并不是按找从树根到树叶的方式递归注册,而是只注册根节点下的第一级子节点,第二级及之后的子节点暂不注册。Linux系统下的设备大多都是挂载在平台总线下的,因此在平台总线被注册后,会根据allnodes节点的树结构,去寻找该总线的子节点,所有的子节点将被作为设备注册到该总线上。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19638次
排名:千里之外
转载:42篇
(3)(1)(1)(3)(1)(1)(6)(1)(1)(1)(3)(9)(1)(3)(1)(1)(2)(7)(4)本帖最后由 wytalfred 于
00:11 编辑
如果你买来BBB是为了搞跟硬件相关的项目,那你八成需要制作一个cape。cape是BBB官方的叫法,其实就是指BBB的软件和硬件外设。通过学习device tree我们了解到BBB是使用capemgr和device tree来控制cape的,通过向$SLOTS传入dtbo文件来加载某个cape,像这样:echo BB-ADC & $SLOTS复制代码但有时候我们不想每次都手动输入这样一条命令来启用某个cape,而是想让它开机自动启动。这时就需要用到本文讲的内容了。
要做到开机自动启动,你只需要增加一个eeprom(官方推荐的型号是CAT24C256),并把它接到特定的引脚上,里面写上符合规定格式的内容就行了。系统在启动时会检查特定引脚上有没有符合规定格式的eeprom,如果有的话,就按照eeprom里面的内容自动加载相应的dtbo文件。
还记得我们 cat $SLOTS 看到了什么吗?
cat /sys/devices/bone_capemgr.*/slots&&
0: 54:PF---& &
1: 55:PF---& &
2: 56:PF---& &
3: 57:PF---& &
4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G&&
5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI复制代码这里前4项为什么是空的呢?因为它们就是给那些有EEPROM的实体cape预留的位置。不难看出,这样的实体cape最多只能插4个。
二、eeprom的连接
eeprom.png (34.22 KB, 下载次数: 8)
14:04 上传
这里的知识比较零散,我将分点阐述:
eeprom的地址必须在0x54到0x57之间,否则系统不会加载。科普一下:不管什么牌子的eeprom芯片,它们的地址都是一样的,高4位是1010,低3位对应着芯片的A2,A1,A0这3个引脚的电平(有的芯片只有A1和A0),所以通过外接电路就能改变eeprom的地址。也就是说eeprom的地址只可能是0x50到0x57这8种,如果A2保持高电平,那么就只有0x54到0x57这4个地址可用了(这就是SRM(BBB官方参考手册)里eeprom电路中把A2接高电平的原因。eeprom必须连接到BBB的I2C2_SCL和I2C2_SDA引脚上(在系统中看到的是i2c-1)。因为I2C2这两个引脚的默认功能就是i2c功能。这也告诉我们,程序中尽量不要永久改变这两个引脚的功能复用,否则就没法加载cape了。BBB最多只支持同时插4个eeprom,它们的地址必须互不相同。如果一次插入多个eeprom,会依次读取之。准确来说,读取顺序就是从0x54到0x57的顺序。为什么如此强调overlay的加载顺序呢?因为一旦前面加载的overlay占用了某些片上资源,其他overlay就不能再用了。比如我要做的LCD使用的引脚跟默认加载的HDMI用的引脚是有重叠的,当系统启动时首先加载了LCD的overlay,那么HDMI就不能再加载了。eeprom上WP引脚是写保护用的,一旦上拉,就不能进行写入了。所以自己做电路的时候可以把它悬空或者拉低。
三、eeprom的读写
下面先介绍如何进行读写,再介绍该写入什么东西。
首先确定eeprom的地址。由A0,A1,A2三个引脚的电平确,按照上面刚刚说的,比如我把A0,A1接地,A2拉高,地址就是0x54。
然后在命令行操作:
cd /sys/bus/i2c/devices/1-0054/&&#到eeprom目录中&&
cat eeprom | hexdump -C&&#读取eeprom内容并以字符形式显示&&
echo -e &\xaa\x55\x33\xeeA1Beaglebone LCD4 Cape\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0000A1BeagleboardToys\x00BB-BONE-LCD4-01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00& & eeprom&&#写入内容&&
cat eeprom | hexdump -C&&#确认是否写入成功&&复制代码其中\x开头的字符代表按ASCII码值写入。上面就写入了官方LCD4 cape的eeprom内容。如果你想自制LCD cape,使用的LCD面板参数跟官方的一样的话,那么系统使用的驱动程序就是一样的,所以就可以直接用上面的eeprom内容加载BBB自带的dtbo文件了,就不必自己重写dtbo文件了。
写入内容时,要按照SRM里的标准(如下图),最重要的是要把头6个字节\xaa\x55\x33\xeeA1以及后面的版本号00A1和要调用的dtbo文件名BB-BONE-LCD4-01写对,其他的比Number of Pins什么的都无所谓。空余的地方必须用\x00补全,用其他字符会产生错误。
contents.png (67.02 KB, 下载次数: 7)
14:09 上传
经过上面的方法配置好eeprom后,系统就能在启动时自动加载对应的dtbo文件了。但是这里还是再强调一下dts文件编写的注意事项。
四、编写dts文件的注意事项
文件名必须是 boardname-version.dts 的形式,比如 BB-BONE-LCD4-01-00A0.dts。这里面BB-BONE-LCD4-01就是boardname,00A0就是version号。(其实dts的名字无所谓了。。关键是编译出来的dtbo名字必须是它,为了统一,就都这么规定吧)。version必须是00AX的形式,X从0开始按版本依次增加,而且,想命名00A1,必须有00A0的存在才行!不能跨越版本!dts文件里面会有part-number和version这两项,其内容必须跟文件名相符!part-number就是boardname。编译完的dtbo文件必须放到 /lib/firmware/ 目录中才可以加载。
OK,上面介绍了所有cape通用的内容。具体某个cape需要加载特定的驱动,那就是如何写dts文件和配置驱动的问题了,在此就不做讨论啦。
五、其实不用eeprom也能做——uEnv.txt
其实不用eeprom的话,也可以通过修改uEnv.txt文件来实现自动加载dtbo文件。USB连接好BBB以后在电脑里会出现一个盘符,里面有一个叫做uEnv.txt的文件。通过它可以设置系统启动时加载或禁止加载的dtbo。比如我想在系统启加载BB-ADC。我们就可以打开它,在下面添加一行:
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中添加一行:
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN复制代码就OK啦。
注意,如果想同时实现上面两个,即禁用HDMI并加载ADC的话,不能简简单单把上面两句话写进去,应该合并成一句话:
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN capemgr.enable_partno=BB-ADC复制代码否则会失败。
所以,使用eeprom的意义就在于方便啦。什么也不用配置,买回来插上就能用。如果你爱折腾的话,那么实现方法就多了去啦。
六、其实不用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教学:
在/etc/systemd/system目录下新建一个文件,命名mystartup.service(名字可以自定),内容如下:
[Unit]
Description=My script
[Service]
ExecStart=/home/root/mystartup.sh
[Install]
WantedBy=multi-user.target 复制代码Description是写给自己看的注释,可以随便写。mystartup.sh是要启动时自动执行的脚本。
注意:不能写成ExecStart=/bin/sh /path/to/script.sh这样的,直接按上面给出的例子写就好了。
然后在 /home/root 目录新建一个mystartup.sh,内容如下:
#!/bin/sh
echo BB-YOUR-CAPE & /sys/devices/bone_capemgr.8/slots复制代码注意:
1、这里必须用sh脚本,不能用bash脚本。
2、sh脚本中不能使用bone_capemgr.*这样的通配符,必须是bone_capemgr.8或者.9(根据你的系统来写)
3、当然,dtbo文件还是必须得放在 /lib/firmware 下才行。
最后执行命令:
systemctl enable myscript.service复制代码就可以了。重启BBB会发现成功加载了dtbo。
如果你执行dmesg | grep capemgr,会发现加载dtbo的时间点跟用eeprom或uEnv.txt不同,所以跟启动以后手动输入 echo 命令的效果类似。
我当然推荐第六种方法。预计在找到更好的办法之前,这就是我将来在Development Kit里采用的办法了。想要使用我的Kit的话建议掌握这个小技巧。
最后这句写给能看懂的人,看不懂就不必深究了:crontab @reboot 在BBB的Angstrom里不好使,不用尝试了。似乎会被系统kill掉。
<p id="rate_480" onmouseover="showTip(this)" tip="很给力!&芯币 + 1 枚
" class="mtn mbn">
更多BBB经验分享,请访问我的博客
在线时间1272 小时
威望1955分
芯币21977枚
E金币129枚
TA的帖子TA的资源
谢谢分享,学习啦
多谢支持~~&
在线时间211 小时
TA的帖子TA的资源
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
谢谢分享,学习啦
多谢支持~~
更多BBB经验分享,请访问我的博客
在线时间520 小时
芯币8631枚
TA的帖子TA的资源
一粒金砂(高级), 积分 474, 距离下一级还需 26 积分
一粒金砂(高级), 积分 474, 距离下一级还需 26 积分
不错学习了&&
在线时间554 小时
威望2549分
芯币8076枚
E金币3412枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 2549, 距离下一级还需 951 积分
五彩晶圆(初级), 积分 2549, 距离下一级还需 951 积分
楼主csdn上关于cape的文章很精彩。支持~
多谢多谢~~哈哈&
这孩子,成熟的象征,理智的典范。
在线时间3519 小时
威望5155分
芯币12026枚
E金币218枚
TA的帖子TA的资源
本帖最后由 chenzhufly 于
15:42 编辑
& &不错 不错!
不过也不一定就需要eeprom的
可以直接改启动文件,把要加载的cape导入进去
确实,修改uEnv也可以。不过有个问题比较让人头疼。Angstrom最近两个版本的系统都有bug。6月那个版本根本没法加载自己写的dtbo文件,9月那个版本倒是能加载了,但是会延迟60秒才能加载成功……而且9月这个版本触摸屏&
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
在线时间211 小时
TA的帖子TA的资源
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
不错 不错!
不过也不一定就需要eeprom的
确实,修改uEnv也可以。不过有个问题比较让人头疼。Angstrom最近两个版本的系统都有bug。6月那个版本根本没法加载自己写的dtbo文件,9月那个版本倒是能加载了,但是会延迟60秒才能加载成功……而且9月这个版本触摸屏算法有bug会导致指针漂移……难道非得自己编译系统么。。。。
我刷了个debian的系统,是可以的&
更多BBB经验分享,请访问我的博客
在线时间211 小时
TA的帖子TA的资源
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
楼主csdn上关于cape的文章很精彩。支持~
多谢多谢~~哈哈
更多BBB经验分享,请访问我的博客
在线时间3519 小时
威望5155分
芯币12026枚
E金币218枚
TA的帖子TA的资源
确实,修改uEnv也可以。不过有个问题比较让人头疼。Angstrom最近两个版本的系统都有bug。6月那个版本根本 ...
我刷了个debian的系统,是可以的
官方最新出的那个吗?&
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
在线时间211 小时
TA的帖子TA的资源
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
我刷了个debian的系统,是可以的
官方最新出的那个吗?
更多BBB经验分享,请访问我的博客
在线时间3519 小时
威望5155分
芯币12026枚
E金币218枚
TA的帖子TA的资源
最近没时间写文章,都没好好总结,哈哈
是的吧,7.2的那个
哈哈,工作太忙了吧~
我也刷一个看看~谢啦&
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
在线时间211 小时
TA的帖子TA的资源
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
最近没时间写文章,都没好好总结,哈哈
是的吧,7.2的那个
哈哈,工作太忙了吧~
我也刷一个看看~谢啦
更多BBB经验分享,请访问我的博客
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
不错,学习中
在线时间622 小时
芯币1297枚
TA的帖子TA的资源
纯净的硅(中级), 积分 810, 距离下一级还需 390 积分
纯净的硅(中级), 积分 810, 距离下一级还需 390 积分
debian 下载已经更新到7.4了。。。
但是占用的emmc太大。。。
刷了ubuntu& &资源倒是用的少,但是做Qt开发的时候各种问题。。。。
我在sd卡上运行了一下debian,本身不大,但是啥软件都没有。。自己安装全了也差不多了。&
在线时间211 小时
TA的帖子TA的资源
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
debian 下载已经更新到7.4了。。。
但是占用的emmc太大。。。
刷了ubuntu& &资源倒是用的少,但 ...
我在sd卡上运行了一下debian,本身不大,但是啥软件都没有。。自己安装全了也差不多了。
那些软件除了终端还有cloud9
没一个是用得着的&
更多BBB经验分享,请访问我的博客
在线时间622 小时
芯币1297枚
TA的帖子TA的资源
纯净的硅(中级), 积分 810, 距离下一级还需 390 积分
纯净的硅(中级), 积分 810, 距离下一级还需 390 积分
我在sd卡上运行了一下debian,本身不大,但是啥软件都没有。。自己安装全了也差不多了。
那些软件除了终端还有cloud9
没一个是用得着的
好吧……但似乎Angstrom采用了很多比较“先进”的技术哎,device tree,systemd,sysfs什么的。不过我不知道别的系统是什么样的,胡言乱语啦&
在线时间211 小时
TA的帖子TA的资源
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
纯净的硅(初级), 积分 670, 距离下一级还需 130 积分
那些软件除了终端还有cloud9
没一个是用得着的
好吧……但似乎Angstrom采用了很多比较“先进”的技术哎,device tree,systemd,sysfs什么的。不过我不知道别的系统是什么样的,胡言乱语啦
设备树是11年的时候linus骂人之后就开始引进内核的ARM分支的,在这之前已经有支持设备树的内核了。。。其他两个好像是早就有了&
更多BBB经验分享,请访问我的博客
在线时间622 小时
芯币1297枚
TA的帖子TA的资源
纯净的硅(中级), 积分 810, 距离下一级还需 390 积分
纯净的硅(中级), 积分 810, 距离下一级还需 390 积分
好吧……但似乎Angstrom采用了很多比较“先进”的技术哎,device tree,systemd,sysfs什么的。不过我不 ...
设备树是11年的时候linus骂人之后就开始引进内核的ARM分支的,在这之前已经有支持设备树的内核了。。。其他两个好像是早就有了
在线时间1239 小时
威望3321分
芯币3222枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 3321, 距离下一级还需 179 积分
五彩晶圆(初级), 积分 3321, 距离下一级还需 179 积分
好文章,学习与膜拜中
在线时间1439 小时
威望2116分
芯币6220枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 2116, 距离下一级还需 1384 积分
五彩晶圆(初级), 积分 2116, 距离下一级还需 1384 积分
看老大的文章就是长知识!都好实用啊!正好适合我这种菜鸟入门!又学到了知识了!
EEWORLD 官方微信
Powered by

我要回帖

更多关于 dts 加载过程 的文章

 

随机推荐