u-boot如何传入一个自定义参数给内核
我想在u-boot启动的时候自定义一个参数,然后传给内核,内核解析后,根据参数传入的不同而初始化不同的硬件。这个该怎么设计?
uboot里面有一个命令叫linux_args,是一个字符串描述,uboot启动linux时将linux_args作为参数传给linux, linux把这个启动参数叫cmdline, 在linux启动过程中,相应的模块会捕获这个cmdline里的内容,一旦发现有自身模块的相关描述, 那么就会按照这些描述来实现初始化。
我的uboot里的linux_args里有有描述了flash相关有关的内容: Dream 5220 # printenv linux_args=mtdparts=octeon_nor0:1m(BOOT),7m(LINUX),21m(CONFIG),3m(MD)
linux启动后, /mtd/cmdlinepart.c 会捕获到"mtdparts="部分的内容, 之后按照这些描述来初始化flash分区。
在linux启动阶段,start_kernel 也会把这个cmdline 打印出来: Kernel command line: bootoctlinux 0x1dd00000 coremask=0x1 mtdparts=octeon_nor0:1m(BOOT),7m(LINUX),21m(CONFIG),3m(MD) console=t0
你在shell界面下可以查看到这个cmdline的内容: root@(none):~# cat /proc/cmdline bootoctlinux mtdparts=octeon_nor0:1m(BOOT),7m(LINUX),24m(CONFIG) console=ttyS0,115200
你只需要做三件事: 第一, 在uboot界面下使用linux_args命令添加你的描述. 第二, __setup() 函数就是linux的模块里用来捕获cmdline里有关自身描述的。你查一下这个资料。 第三, 实现你的module.
另外, 你也可以将你的描述信息在uboot里面用现成的命令写到eeprom等设备里面,之后你在linux添加一个module去eeprom里面查找相关的信息,同样可以实现根据不同的参数来init 不同的hw。这个办法也是可行的。 linux_args 是一个uboot的环境变量,用setenv设置的,比如实现上面的设置,就用: setenv linux_args mtdparts=octeon_nor0:1m(BOOT),7m(LINUX),21m(CONFIG),3m(MD)
|