观宋宝华设备树视频的感想

      如果设备写在驱动里面,代码量非常大,而且非常不方便移植。因此将设备放在驱动外,再通过一个接口,和驱动关联,这个接口就叫做总线, 在总线上挂载了设备了驱动。无论是先注册总线还是先注册驱动,注册驱动的时候,会通过匹配找到与之对应的设备;注册设备的时候,会通过匹配找到与之对应的驱动,通过of_match_xxx函数匹配name,id。 当匹配成功的时候,会进入probe函数。在probe函数内会alloc分配一个设备的内存,然后通过private拿到该设备的私有的成员数据(由于一般是多个设备对应一个驱动)。通过一个获取设备硬件资源的接口platform_get_resource()(GPIO、中断号等),拿到这个设备的硬件信息,这一点和C++里面的this指针类似,千万不用把设备声明成全局变量。最后注册这个设备。此外在内核代码中充斥着大量的面向对象的思想。
     设备和驱动就相当于一对情侣,而总线更像是一位月老。设备主要放的是板级的硬件信息,存放在内核源码树的/arm/arch/目录下,驱动则在内核源码树的/drivers目录下。在注册设备成功的时候,匹配的名字是globalfifo开发板/sys/devices/platform目录下会多出一个设备文件 globalfifo ,只有当注册驱动成功的时候,在开发板/sys/bus/platform/drivers 目录下会多出一个驱动文件 globalfifo ,此时/sys/bus/platform/devices / globalfifo 下会生成一个链接文件指向该驱动文件( /sys/bus/platform/drivers/ globalfifo )。
      驱动只管驱动,设备只管设备,总线则负责匹配设备和驱动,而驱动则通过标准的途径拿到板级信息。 
      如何看待sys/class文件?
      比如有两个led设备,在/sys/bus/platform/devices中找,可能会藏的很深,文件路径很长,但是在/sys/class角度下看,就直接存放在此目录下 /sys/class/leds
      另外平台设备模型的另一个好处是方便了电源的管理,是bottm->up,top->down的关系。
       由于设备的代码都是由C语言来描述的,没有太大的技术含量,有很多的垃圾代码。因此采用设备树的方法,将设备的硬件信息的代码用dts脚本来描述,内核代码启动的时候,设备树的节点会被加载并自动的展开为C语言,本质上和原来设备平台模型没有差别,甚至一些硬件的信息,比如GPIO和中断都帮我们赋值好了,不需要再像指向那样手动的赋值。带来的好处好处就是垃圾代码变少了。

你可能感兴趣的:(linux)