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