添加内核驱动模块(6)(mydriver.c+ Konfig+Makefile )
大多數(shù)函數(shù)和代碼,是用來
創(chuàng)建數(shù)據(jù)結構,分配設備描述塊,申請內(nèi)核資源描述塊。
填充這些描述塊,
為這些設備描述塊和內(nèi)核資源描述塊之間創(chuàng)建關聯(lián),賦值各個指針成員。
當SYSCALL調(diào)用驅動代碼時,通過這些設備描述塊,能夠找到其他的需要的資源描述塊。
最終發(fā)生硬件操作時,是由spi_write和gpio_set_value來完成的。
而發(fā)生文件系統(tǒng)操作時,是由fops里面的函數(shù)完成的。
PMOD流程梳理:
首先是編寫修飾代碼,定義整個驅動的名字,提示信息等。
然后是編寫OFDRIVER的驅動框架。
包括PLATDRIVER的描述塊,OFDEVICEID的描述塊數(shù)組。以及把他們用注冊宏注冊到內(nèi)核資源池中。
包括probe函數(shù)和remove函數(shù)的框架。
調(diào)用probe函數(shù)的caller,會把它的PDEV描述塊傳給probe。
PDEV內(nèi)含的DEV成員,它又有一個OFNODE成員,這是一個指向DEVICENODE描述塊的指針。DEVICENODE是內(nèi)核資源。
probe里面,分配內(nèi)存,
創(chuàng)建PMOD描述塊,創(chuàng)建DISP_BUF緩沖區(qū),然后填充PMOD描述塊。
創(chuàng)建PDATA描述塊,然后填充這個PDATA描述塊,創(chuàng)建一個PDEV描述塊,然后填充這個PDEV描述塊。把剛才創(chuàng)建的PDATA的指針填充到PDEV中。PDEV描述塊,有一個成員dev,dev成員有一個platdata成員,這是一個指針,指向PDATA描述塊。
填充PMOD描述塊的pdev成員,這是一個指針,指向一個PDEV描述塊。我們把PMOD和剛才創(chuàng)建的PDEV描述塊關聯(lián)起來。
將剛才創(chuàng)建的PDEV描述塊注冊到內(nèi)核資源池中。
填充PMOD的name成員,用傳入的DEVICE_NODE的name成員填充。讓他和系統(tǒng)中的關聯(lián)的DEVICE_NODE同名。
將PMOD描述塊所需要的資源注冊到SPIBUS中。
填充DEVICE_NODE的data成員,把PMOD描述塊的指針賦值給data成員。這樣,DEVICE_NODE就關聯(lián)到了創(chuàng)建的PMOD描述塊。
分配一個CDEV的ID。
創(chuàng)建一個CLASS描述塊。這是為本模塊分配的內(nèi)核資源。在模塊中用靜態(tài)變量保存這個資源指針。
將SPIDRIVER注冊到內(nèi)核中。這是一個模塊中的靜態(tài)變量,在本模塊中使用。
創(chuàng)建一個SPIDEVICE,并關聯(lián)到PMOD描述塊中的spi成員。
當SPIDRIVER注冊到內(nèi)核中時,會調(diào)用對應的probe函數(shù)。
這個probe函數(shù)被內(nèi)核調(diào)用時,內(nèi)核傳遞一個SPI_DEVICE描述塊給它。
配置了SPIDEVICE的參數(shù)。
創(chuàng)建了一個CDEV描述塊。
初始化了GPIO。
初始化了顯示緩沖區(qū)。
在創(chuàng)建CDEV的時候,把PMOD內(nèi)含的cdev成員注冊到了內(nèi)核資源池中。fops用的是模塊內(nèi)的一個靜態(tài)變量。
注冊了CDEV后,為CDEV在系統(tǒng)中添加DEVICE_NODE。
總結
以上是生活随笔為你收集整理的添加内核驱动模块(6)(mydriver.c+ Konfig+Makefile )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 官网下载storage manager方
- 下一篇: BIOS详解