100ask 平台上对嵌入式驱动进行学习。

1. led 设备树代码分析。

2. 为了便于学习,使用的是 nfs 文件系统,但是在学习设备树这一节的时候,发现 base 文件夹下面没有出现相应的节点。

首先 Linux_xxx/scripts/dtc/dtc -I dtb -O dts /从板子上/复制出来的/xxx.dtb -o tmp.dts 查看反编译后的 dts 文件,在相应的文件中有相应的 100ask_led 的节点。

然后在网络上搜索,知道 /sys/firmware/fdt 是加载好的 dtb 文件,Linux_xxx/scripts/dtc/dtc -I dtb -O dts /从板子上/复制出来的/xxx.fdt -o tmp.dts 查看反编译后的 dts 文件,在相应的文件中居然没有相应的 100ask_led 的节点。

从这两个文件的差别可以知道, /boot/ dtb 文件和 fdt 文件来自于不同的地方,说明是板子没有加载 /boot 下面的 dtb 文件,而是从其他地方加载了 dtb 文件。 经过在网络上搜索,知道 fdt 文件是由 uboot 加载 dtb 的,放在 0x83000000 处,然后uboot 把这个地址交给 内核,内核从这个地方找到数据,放在 /sys/firmware/fdt 里面,从而加载好设备树。所以问题是处在 uboot 加载 dtb 这一步。

后来发现问题是出现在使用 nfs 文件系统的情况下出现,经过进一步查找,发现在 nfs 文件系统的情况下, zImage 和 dtb 文件是 uboot 通过 tftp 从 pc 机上面下载下来的,而不是从 /boot 下面加载,所以修改后的 dtb 文件,只要放在 tftp 目录即可。

把 dtb 文件,放到 tftp 目录, reboot 开发板,在 /sys/firmware/devicetree/base/ 下发现了 100ask_led 的节点了。

参考: https://community.nxp.com/message/871427

3. /sys/firmware/devicetree/base 下面有节点,/sys/devices/platform 下面没有节点,相应的节点在 /sys/bus/platform/devices 下面。

/sys/firmware/devicetree/base 下面的节点目录里面就是由设备树提供的信息,包括 compatible, name, pin 之类的。

/sys/bus/platform/devices 下面的节点指向 /sys/devices 这个目录下面,比如说 /sys/bus/platform/devices/100ask_led@0 --> /sys/devices/soc0/100ask_led@0

/sys/devices/soc0/100ask_led@0 这个目录下面, of_node --> /sys/firmware/devicetree/base/100ask_led@0, subsystem --> /sys/bus/platform, 当没有加载驱动 ko 文件时,这个目录下面是没有 driver 这个文件的,当加载了驱动后,出现 driver 文件夹, driver --> /sys/bus/platform/drivers/100ask_led

/sys/bus/platform/drivers/100ask_led 下面有 100ask_led@0, 100ask_led@0 --> /sys/devices/soc0/100ask_led@0

具体见图片:

调试的时候,可以打开内核信息打印: echo "7 4 1 7" > /proc/sys/kernel/printk, 关闭打印: echo "1 4 1 7" > /proc/sys/kernel/printk

参考: http://bbs.100ask.net/question/14121

4. pinctrl 情况下的驱动分析如下图:

5. 休眠与唤醒

标签: driver

添加新评论