Linux驱动之SOC内部和外设

2019-07-13 07:40发布

从事嵌入式软件的骨子里总带着那么点硬件的影子,比如写个程序会计较一下RAM、ROM占用,编译结果等等。当然写嵌入式应用软件的可能不太在乎。Linux驱动开发是个既清晰有很模糊的事。清晰是指,Linux系统内核和架构都是定型的,当你拿到一份内核源码时,只要按照套路做就是了。很模糊是指很少人能讲清楚这个套路是什么,细节方面怎么做。很多讲Linux驱动开发的书最后把自己也绕进去了。Linux驱动开发应该参照类似单片机驱动开发的套路——单片机驱动可以分为内部驱动和外设驱动:1、内部驱动就是单片机内部控制器驱动一般通过改单片机的寄存器实现,所谓的驱动却大部分都是对寄存器改动、打包、互相调用。当然这部分工作越来越依赖于半导体厂商了,当然这也是他们份内的事,单片机是他们设计、制造的,要说写内部驱动会有比他们写的更好的吗?现在厂家都按照意法半导体的模式了,直接提供内部驱动给你省事多了。2、外设驱动套路就是通过上面写好的内部驱动去读写外设的寄存器、互相调用等。这在单片机领域很常见啊,比如ESP8266外设驱动不就是通过单片机内部串口驱动按照串口时序去读写ESP8266寄存器吗。在外设驱动里我们都会发现里面肯定有单片机内部驱动,比如读取ESP8266某值的函数肯定有单片机内部驱动uart_read。说个题外话,为什么外设制造商不直接提供一份驱动?“臣妾做不到啊!”,鬼才知道你用什么单片机!最多给你提供几个应用广的单片机适配的驱动。单片机供应商更加不会考虑你用什么外设。反正不就是一个套路:外设驱动里包含单片机内部驱动,了事。3、你真的掌握了这个套路了吗?在单片机没有那么深的套路里内部驱动和外部驱动一目了然。可是扔到SOC+Linux里呢?这就复杂了首先SOC内部驱动在2.6-3版本内核时是platform(驱动设备总线)套路;其次外设除了包含内部驱动这个套路,还有个更上层的套路就是驱动设备总线模型;然后大家伙就晕了。把两套驱动设备总线混在一起了,但其实它们的交互API是很直接的,也就是它们各自分别实现各自的驱动设备总线模型,然后通过外设包藏内部驱动,搞定。4、但外设驱动那有那么简单,还有很多子系统框架呢?但它们与platform其实没有关系了。Linux只是希望外设驱动在包藏和调用内部驱动时能更有套路罢了。5、写Linux驱动书的人总是不愿意太Low的说套路这个词,其实慢慢的都是套路,把套路讲清楚了也是真本事!