Linux 內(nèi)核驅(qū)動 - ADC 驅(qū)動
時間:2018-03-14作者:華清遠(yuǎn)見
1. ADC內(nèi)核驅(qū)動實現(xiàn)框架 ADC 內(nèi)核驅(qū)動的實現(xiàn)是基于 ARM ADC BSP 驅(qū)動 與 Linux 內(nèi)核驅(qū)動的框架進(jìn)行銜接,主要分為以下幾個部分構(gòu)成: 在底層采用的 Linux 內(nèi)核設(shè)備模型,基于 platform 平臺總線 在 VFS 層使用的是 Linux 內(nèi)核字符設(shè)備驅(qū)動框架,用于實現(xiàn) VFS 層 相應(yīng)的驅(qū)動訪問接口 2. ADC 內(nèi)核驅(qū)動 platfrom 總線實現(xiàn) 2.1 platfrom 總線的注冊 基于 platfrom 總線部分,主要用于銜接 BSP 驅(qū)動 與上層的 字符設(shè)備驅(qū)動的訪問接口.
platfrom 總線實現(xiàn)包含驅(qū)動描述與設(shè)備描述,其中設(shè)備描述在 Linux 內(nèi)核設(shè)備樹中描述. 需要在 exynos4412-fs4412.dts 中添加如下描述 platfrom 驅(qū)動描述結(jié)構(gòu)定義如下:
在上述結(jié)構(gòu)中, of_match_table 成員的描述如下: 2.1 probe 函數(shù)的實現(xiàn) 在 probe 實現(xiàn)以下功能: 分配 adc 設(shè)備描述結(jié)構(gòu)體的空間獲取 platfrom 驅(qū)動私有數(shù)據(jù) 申請中斷資源 獲取IO內(nèi)存資源 申請IO資源的使用 寄存器地址的映射獲取 ADC 的通道注冊 ADC 字符設(shè)備初始化等待隊列 在 remove 函數(shù)中主要實現(xiàn)相關(guān)資源的釋放 2.2.1 adc 設(shè)備描述與內(nèi)存分配 在 Linux 內(nèi)核中描述 ADC 使用下面的結(jié)構(gòu),這是我們自己定義的: struct adc_device { void *reg;//寄存器映射地址int major_num;//主設(shè)備號int irq_num;//中斷號 int adc_data;//adc 設(shè)備數(shù)據(jù) int io_channer;//io 通 道 struct clk *adc_clk;//adc 時鐘資源 struct resource *res;//adc io 資 源 struct class *cls;//adc 設(shè)備類 struct device *dev;//adc 設(shè)備對象 struct cdev cdev;//adc 字符設(shè)備對象 wait_queue_head_t read_event_wait;//等待隊列頭 }; 在分配 adc 結(jié)構(gòu)體時,使用的是 kzalloc 函數(shù),具體實現(xiàn)如下:
2.2.2 設(shè)置 platform 平臺私有數(shù)據(jù) 獲取 platform 私有數(shù)據(jù),需要調(diào)用 platform_set_drvdata 數(shù)據(jù) static inline void platform_set_drvdata(struct platform_device *pdev,void *data) @param pdev : platform 平臺總線設(shè)備描述結(jié)構(gòu) @param data : 需要存儲的 這里主要是將對應(yīng)的 struct adc_device 對象的地址存儲在 struct device 結(jié)構(gòu)體中的 driver_data 成員中,方便其他函數(shù)訪問,主要是針對有過平臺設(shè)備時,不同的平臺設(shè)備有不同 的結(jié)構(gòu)來描述,在匹配成功之后要進(jìn)行區(qū)分 2.2.3 獲取中斷資源 這里獲取中斷資源主要是獲取中斷號,通過 platform_get_irq 函數(shù)來實現(xiàn) padc->irq_num = platform_get_irq(pdev, 0); if(padc->irq_num < 0){ printk("Fail to platform_get_irq\n"); ret = padc->irq_num; goto err_platform_get_irq; } 2.2.4 獲取 IO 內(nèi)存資源 這里獲取的資源為 ADC 寄存器的資源,具體代碼如下:
在設(shè)備樹已經(jīng)有相應(yīng)的描述 2.2.5 IO資源的占用 在 Linux 內(nèi)核中,相應(yīng)的寄存器資源需要申請才能使用,一旦申請成功之后,則不允許別人來訪問這段空間. 一般在映射寄存器地址空間之前,就需要申請,這里需要調(diào)用 **** #define request_mem_region(start,n,name) @param start : 申請資源開始的地址 @param n : 申請資源的長度 @param name : 申請的資源的設(shè)備的名字 具體實現(xiàn)如下: if(!request_mem_region(padc->res->start,io_resource_size,pdev->name)) { printk("Fail to request_mem_region\n"); ret = -EBUSY; goto err_request_mem_region; 當(dāng)需要解除相應(yīng)的 IO 資源時,則需要調(diào)用 release_resource 函數(shù) int release_resource(struct resource *old) 參數(shù): @param resource : 指定 adc 資源結(jié)構(gòu)對象的指針 2.2.6 獲取 adc 的數(shù)據(jù)通道 adc 的數(shù)據(jù)通道是在設(shè)備樹中進(jìn)行描述,在這里只是獲取,具體需要調(diào)用: of_property_read_u32(pdev->dev.of_node, "adc-io-channer", &padc->io_cha nner); 由于文章字?jǐn)?shù)有限,更多基于Linux adc 驅(qū)動實現(xiàn)文章請?zhí)砑観Q:(1912904432)索要完整版文章 相關(guān)資訊
發(fā)表評論
|
全國咨詢電話:400-611-6270,雙休日及節(jié)假日請致電值班手機(jī):15010390966
在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)
企業(yè)培訓(xùn)洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)
Copyright 2004-2018 華清遠(yuǎn)見教育科技集團(tuán) 版權(quán)所有 ,京ICP備16055225號,京公海網(wǎng)安備11010802025203號