Soc里怎么知道设备的存在? 我高中的时候就曾想过,Windows怎么知道我电脑上有什么硬件呢?后来刚接触驱动这一块时,被Soc上设备的创建困惑了好一阵子。当然现在看起来已经清晰不少了。Linux下的SPI与I2C算是轻量级框架了,是去熟悉Linux驱动模型一个不错的切入点。当初在学校尽去关心操作系统的实现而无视驱动开发这一块,后来找工作时才发现,满大街招的都是搞驱动的。于是转回去熟悉Linux的设备驱动模型。实习的时候接触了第一个子系统是I2C,当初强行看了四五天,愣是看出一点名堂。可惜后面没有从事相关方面的项目,也没有及时总结,后来都忘的差不多了。
歪题了。因为简历上写了SPI与I2C的内容,今天大致浏览了一下两个子系统的代码。比较在意的是SPI设备与I2C设备的创建。Soc中,SPI控制器与I2C控制器是由platform_device与platform_driver带入系统中来的。其对应的probe与两个子系统交互,从而告知系统自身的存在。如果系统中有四个相同型号的控制器,那么就有4个platform_device和1个platform_driver。注册到子系统这一过程,最主要是把自己加到子系统维护的控制器列表里。SPI里是spi_register_master,I2C里是i2c_register_adapter。然而,这两个函数里还有一个任务:把挂在控制器(总线)上的设备带到系统中来。
这样做其实相当无奈。像PCI,USB这类协议,设备都是即时产生的,你把设备插上去,系统就能知道它的存在。而Soc上没有这么动态,系统上有什么设备必需在平台相关的代码写出来。这件事就在注册控制器的时候做。spi_register_master的最后会遍历一个叫board_list的链表,平台相关文件会把平台上有的SPI设备一相相关信息挂在上面。