
DTS-dt b-DTC-I DTS-ODT b-s 3000-OOBJ _ name . dtb source _ name . DTS。
查看dts设备节点- # ls-al/proc/device-tree内核如何解析设备树。2)通过调用machine _ init()-early _ init _ dev tree()函数,获取内核早期初始化所需的bootargs、cmd_line等系统引导参数;3)调用start _ kernel()-setup _ arch()-un flatten _ device _ tree()函数解析dtb文件,构建一个由device_node结构连接的单链表,使用全局变量allnodes pointer保存这个链表的头指针;4)内核调用OF提供的API函数,获取allnodes链表信息,初始化内核的其他子系统和设备。DispAllnodes() -显示DTS设备节点-arch/powerpc/kernel/prom . c Void DispAllnodes(。dn=allnodeswhile (dn) { printk('dn-name=%s 'dn-name);printk('dn-type=%s 'dn-type);printk(' dn-全名=%s 'dn-全名);printk(“”);dn=dn-next;} } EXPORT _ SYMBOL(dispAllnodes);根据DTS文件的设备节点,添加设备Linux-2 . 6 . 28 archpowercootdtsmpc 8548 CDs . DTS-。
# size-cells=;
#中断单元=;device _ type=' soc范围=;reg=;//CCSRBAR 1M总线-频率=;mdio @ 24520 { # address-cells=;# size-cells=;device _ type=' mdiocompatible=' gianfarreg=;phy 0:Ethernet-phy @ 0 { interrupt-parent=;中断=;reg=;device _ type=' Ethernet-phy '};};Linux-2 . 6 . 21 . 7 gfar _ mdio _ of _ init()-platform _ device _ register _ simple()-platform _ device _ add()-device _ add()向平台总线添加mdio设备节点。这种添加方式(单独添加一个节点)比较麻烦,抽象程度不够。每个节点都需要自己的添加代码。不科学还是统一把allnodes加到所有节点下比较好。
static int _ _ initgfar _ mdio _ of _ init(void){.//获取device _ type=' mdio ' compatible=' gian far '的设备节点np=of_find_compatible_node(np,' mdio,' gian far ');of_address_to_resource(np,0,RES);//添加平台设备res.start=e 0024520 platform _ device _ register _ simple(' fsl-gianfar _ mdio 'res . start,RES,1);} arch _ init调用(gfar _ mdio _ of _ init);struct platform _ device * platform _ device _ register _ simple(char * name,unsigned int id,struct resource *res,unsigned int num){.//生成平台_设备//平台_设备-名称=名称;fsl-gian far _ mdio '//platform _ device-id=id;e 0024520 pdev=platform _ device _ alloc(name,id);平台_设备_添加(pdev);}int平台设备添加(结构平台设备*pdev){.//设置pdev-dev。bus _ id=fsl-gian far _ mdioe 0024520//总线标识长度限制为BUS _ ID _ SIZE//# define BUS _ ID _ SIZE KOBJ _ NAME _ LEN//如果%s.%x '字符串的长度超过KOBJ_NAME_LEN,将会造成设备节点名信息丢失//信息的丢失有可能导致设备添加失败,所以需要将KOBJ_NAME_LEN改大(20 - 64) snprintf(pdev-dev.bus_id,BUS_ID_SIZE,' %s.%x 'pdev-name,pdev-ID);device _ add(pdev-dev);}int device_add(结构设备*开发){.//设置ko object-NAME=fsl-gianfar _ mdio。e 0024520//# define KOBJ _ NAME _ l EN 20 ko object _ set _ NAME(dev-KOBJ,' %s 'dev-bus _ id);//在/sys/设备/平台/目录下生成设备节点//设备节点名称为fsl-gian far _ mdio。e 0024520设备_创建_文件(dev,dev-u事件_属性);}设备与驱动的对应关系-static struct device _ driver gian far _ mdio _ driver={ .' fsl-gianfar_mdio '总线=平台总线类型,//该驱动所归属的总线probe=gfar_mdio_probe,remove=gfar_mdio_remove,};cat/sys/devices/platform/fsl-gian far _ mdioe 0024520/modaliasfsl-gian far _ mdio静态结构平台_驱动程序gfar _ driver={ .probe=gfar_probe,remove=gfar_remove,驱动程序={。name='fsl-gianfar '},};cat/sys/devices/platform/fsl-gian far。0/莫达利亚斯-吉安法尔









