色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Linux 內(nèi)核驅(qū)動(dòng) - ADC 驅(qū)動(dòng)

Linux 內(nèi)核驅(qū)動(dòng) - ADC 驅(qū)動(dòng) 時(shí)間:2018-03-14      來(lái)源:基于Linux adc 驅(qū)動(dòng)實(shí)現(xiàn)

1. ADC內(nèi)核驅(qū)動(dòng)實(shí)現(xiàn)框架

ADC 內(nèi)核驅(qū)動(dòng)的實(shí)現(xiàn)是基于 ARM ADC BSP 驅(qū)動(dòng) 與 Linux 內(nèi)核驅(qū)動(dòng)的框架進(jìn)行銜接,主要分為以下幾個(gè)部分構(gòu)成:

在底層采用的 Linux 內(nèi)核設(shè)備模型,基于 platform 平臺(tái)總線

在 VFS 層使用的是 Linux 內(nèi)核字符設(shè)備驅(qū)動(dòng)框架,用于實(shí)現(xiàn) VFS 層 相應(yīng)的驅(qū)動(dòng)訪問(wèn)接口

2. ADC 內(nèi)核驅(qū)動(dòng) platfrom 總線實(shí)現(xiàn)

2.1 platfrom 總線的注冊(cè)

基于 platfrom 總線部分,主要用于銜接 BSP 驅(qū)動(dòng) 與上層的 字符設(shè)備驅(qū)動(dòng)的訪問(wèn)接口.

platfrom 總線實(shí)現(xiàn)包含驅(qū)動(dòng)描述與設(shè)備描述,其中設(shè)備描述在 Linux 內(nèi)核設(shè)備樹(shù)中描述. 需要在 exynos4412-fs4412.dts 中添加如下描述
adc@126c0000{
compatible        = "Samsung,exynos4412-adc"; reg  = <0x126c0000 0x20>;
adc-io-channer    = <3>;
clocks            = <&clock 326>;
clock-names       = "adc"; interrupt-parent = <&combiner>;
interrupts           = <10 3>;
= "okay";            status      
};

platfrom 驅(qū)動(dòng)描述結(jié)構(gòu)定義如下:

基于Linux adc 驅(qū)動(dòng)實(shí)現(xiàn)

在上述結(jié)構(gòu)中, of_match_table 成員的描述如下:
#if defined(CONFIG_OF)
static const struct of_device_id exynos_adc_dt_ids[] = {
{ .compatible = "Samsung,exynos4412-adc" },
{ /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, exynos_adc_dt_ids);
#endif
在 platfrom 平臺(tái)總線注冊(cè)與卸載 ADC 驅(qū)動(dòng),具體代碼如下:
int adc_device_init(void)
{
//注冊(cè)  platfrom driver
return platform_driver_register(&exynosadc_driver);
}
void adc_device_exit(void)
{
//卸載  platfrom driver
return platform_driver_unregister(&exynosadc_driver);
}

2.1 probe 函數(shù)的實(shí)現(xiàn)

在 probe 實(shí)現(xiàn)以下功能:

分配 adc 設(shè)備描述結(jié)構(gòu)體的空間獲取 platfrom 驅(qū)動(dòng)私有數(shù)據(jù)

申請(qǐng)中斷資源

獲取IO內(nèi)存資源

申請(qǐng)IO資源的使用

寄存器地址的映射獲取 ADC 的通道注冊(cè) ADC 字符設(shè)備初始化等待隊(duì)列

在 remove 函數(shù)中主要實(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è)備號(hào)int irq_num;//中斷號(hào)

int adc_data;//adc 設(shè)備數(shù)據(jù)

int io_channer;//io 通 道

struct clk *adc_clk;//adc 時(shí)鐘資源

struct resource *res;//adc io 資 源

struct class *cls;//adc 設(shè)備類(lèi)

struct device *dev;//adc 設(shè)備對(duì)象

struct cdev cdev;//adc 字符設(shè)備對(duì)象

wait_queue_head_t read_event_wait;//等待隊(duì)列頭

};

在分配 adc 結(jié)構(gòu)體時(shí),使用的是 kzalloc 函數(shù),具體實(shí)現(xiàn)如下:

2.2.2 設(shè)置 platform 平臺(tái)私有數(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 平臺(tái)總線設(shè)備描述結(jié)構(gòu)

@param data : 需要存儲(chǔ)的

這里主要是將對(duì)應(yīng)的 struct adc_device 對(duì)象的地址存儲(chǔ)在 struct device 結(jié)構(gòu)體中的

driver_data 成員中,方便其他函數(shù)訪問(wèn),主要是針對(duì)有過(guò)平臺(tái)設(shè)備時(shí),不同的平臺(tái)設(shè)備有不同

的結(jié)構(gòu)來(lái)描述,在匹配成功之后要進(jìn)行區(qū)分

2.2.3 獲取中斷資源

這里獲取中斷資源主要是獲取中斷號(hào),通過(guò) platform_get_irq 函數(shù)來(lái)實(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è)備樹(shù)已經(jīng)有相應(yīng)的描述

2.2.5 IO資源的占用

在 Linux 內(nèi)核中,相應(yīng)的寄存器資源需要申請(qǐng)才能使用,一旦申請(qǐng)成功之后,則不允許別人來(lái)訪問(wèn)這段空間.

一般在映射寄存器地址空間之前,就需要申請(qǐng),這里需要調(diào)用 ****

#define request_mem_region(start,n,name)

@param start : 申請(qǐng)資源開(kāi)始的地址

@param n : 申請(qǐng)資源的長(zhǎng)度

@param name : 申請(qǐng)的資源的設(shè)備的名字

具體實(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 資源時(shí),則需要調(diào)用 release_resource 函數(shù)

int release_resource(struct resource *old)

參數(shù):

@param resource : 指定 adc 資源結(jié)構(gòu)對(duì)象的指針

2.2.6 獲取 adc 的數(shù)據(jù)通道

adc 的數(shù)據(jù)通道是在設(shè)備樹(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ū)動(dòng)實(shí)現(xiàn)文章請(qǐng)?zhí)砑観Q:(1912904432)索要完整版文章

上一篇:51單片機(jī)最小系統(tǒng)

下一篇:基于ARM開(kāi)發(fā)板的SD卡掛載及后臺(tái)程序自啟動(dòng)

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專(zhuān)線:010-82525158 企業(yè)培訓(xùn)洽談專(zhuān)線:010-82525379 院校合作洽談專(zhuān)線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見(jiàn)科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5京公海網(wǎng)安備11010802025203號(hào)

回到頂部

主站蜘蛛池模板: 国产成人午夜福利在线播放 | 人成午夜免费视频无码 | 一区二区三区精品视频免费看 | 少妇人妻88久久中文字幕 | 新狼窝色AV性久久久久久 | 最近2019免费中文字幕8 | 久久精品中文字幕免费 | 真人一级毛片免费完整视频 | 荡女精品导航 | 97超级碰碰碰免费公开在线观看 | 中文字幕日韩三级片 | 67194成l人在线观看 | 日韩人妻少妇一区二区 | 不卡无在线一区二区三区观 | WWW夜插内射视频网站 | 中文字幕乱码一区二区免费 | 和岳每晚弄的高潮嗷嗷叫视频 | 天美传媒AV成人片免费看 | 久久99精品九九九久久婷婷 | 狼群社区WWW在线资源 | 日韩亚洲中字无码一区二区三区 | 国产午夜精品无码理论片 | 欧美大屁股xxxx高潮喷水 | 国模无码一区二区三区不卡 | 亚洲va中文字幕 | 亚洲国产成人A精品不卡在线 | 永久免费av无码国产网站 | www.在线观看麻豆 | 99热在线精品国产观看 | 亚洲自偷自偷在线成人网站传媒 | 玩弄CHANEL妇熟女 | 男女做aj视频免费的网站 | 无码帝国www无码专区色综合 | 欧美三级不卡在线播放 | 国产超级va在线观看视频 | 爽爽午夜影视窝窝看片 | 国产人妻人伦精品熟女 | 人妻内射AV六九无码一零八零P | 亚洲AV成人影视在线观看 | 无码日韩做暖暖大全免费不卡 | 品色堂永远的免费论坛 |