写一个驱动有三种方法:
1.在一个文件中直接分配/设置/注册结构体,硬件的资源跟驱动是在一起。缺点是更换设备需要修改源码
2.使用platform机制,把板子硬件细节写在dev.c文件中,共性驱动部分写在drv.c文件中,当需要更换设备时,只需要更改dev.c即可。缺点:dev.c文件存在于内核中,不同的设备对应不同的dev.c,类似的设备的dev.c有很多共性的部分,造成内核代码冗余
3.设备树是一个描述硬件的数据结构,甚至你可以将其看成一个大结构体(这个结构体就是平台,成员就是具体的设备),将硬件的配置从linux内核的源码中提取出来,放到内核外部。
设备树代替了platform机制下描述硬件细节的dev.c部分,把板级设备细节从dev.c改成dts文件,共性驱动部分仍然写在drv.c文件中。dts文件不在内核中,由bootloder传给platform平台,平台根据dts文件生成dev.c文件。由于dts文件不在内核中,从而解决了类似设备由于共性部分比较多,导致内核代码冗余的问题。
当需要跟换设备时,用户只需要更改设备树,无需再编译内核。