大多数函数和代码,是用来
创建数据结构,分配设备描述块,申请内核资源描述块。
填充这些描述块,
为这些设备描述块和内核资源描述块之间创建关联,赋值各个指针成员。
当SYSCALL调用驱动代码时,通过这些设备描述块,能够找到其他的需要的资源描述块。
最终发生硬件操作时,是由spi_write和gpio_set_value来完成的。
而发生文件系统操作时,是由fops里面的函数完成的。
PMOD流程梳理:
首先是编写修饰代码,定义整个驱动的名字,提示信息等。
然后是编写OFDRIVER的驱动框架。
包括PLATDRIVER的描述块,OFDEVICEID的描述块数组。以及把他们用注册宏注册到内核资源池中。
包括probe函数和remove函数的框架。
调用probe函数的caller,会把它的PDEV描述块传给probe。
PDEV内含的DEV成员,它又有一个OFNODE成员,这是一个指向DEVICENODE描述块的指针。DEVICENODE是内核资源。
probe里面,分配内存,
创建PMOD描述块,创建DISP_BUF缓冲区,然后填充PMOD描述块。
创建PDATA描述块,然后填充这个PDATA描述块,创建一个PDEV描述块,然后填充这个PDEV描述块。把刚才创建的PDATA的指针填充到PDEV中。PDEV描述块,有一个成员dev,dev成员有一个platdata成员,这是一个指针,指向PDATA描述块。
填充PMOD描述块的pdev成员,这是一个指针,指向一个PDEV描述块。我们把PMOD和刚才创建的PDEV描述块关联起来。
将刚才创建的PDEV描述块注册到内核资源池中。
填充PMOD的name成员,用传入的DEVICE_NODE的name成员填充。让他和系统中的关联的DEVICE_NODE同名。
将PMOD描述块所需要的资源注册到SPIBUS中。
填充DEVICE_NODE的data成员,把PMOD描述块的指针赋值给data成员。这样,DEVICE_NODE就关联到了创建的PMOD描述块。
分配一个CDEV的ID。
创建一个CLASS描述块。这是为本模块分配的内核资源。在模块中用静态变量保存这个资源指针。
将SPIDRIVER注册到内核中。这是一个模块中的静态变量,在本模块中使用。
创建一个SPIDEVICE,并关联到PMOD描述块中的spi成员。
当SPIDRIVER注册到内核中时,会调用对应的probe函数。
这个probe函数被内核调用时,内核传递一个SPI_DEVICE描述块给它。
配置了SPIDEVICE的参数。
创建了一个CDEV描述块。
初始化了GPIO。
初始化了显示缓冲区。
在创建CDEV的时候,把PMOD内含的cdev成员注册到了内核资源池中。fops用的是模块内的一个静态变量。
注册了CDEV后,为CDEV在系统中添加DEVICE_NODE。