以ADC裝置驅動了解設計流程

2021-08-24 18:22:33 字數 2836 閱讀 7767

module -> bus -> char -> mknod -> resource -> hardware -> noblock/signal -> lock(sem)

->module

#include

#include

int __init adc_init(void)

void __exit adc_exit(void)

module_init(adc_init);

module_exit(adc_exit);

#include

int __init adc_init(void)

struct platform_driver adc_driver = ,

};

裝置列表(驅動多類相近裝置時)

struct platform_device_id adc_ids = ,

};

module_device_table(platform, adc_ids);

adc_probe中暫時不做任何操作。

struct adc_cdev;
int adc_probe(struct platform_device *pdev)

cdev_init中新增的fops:

struct file_operations fops = ;
重點看下:adc_open

int adc_open(struct inode *inode, struct file *filp)

需要新增的標頭檔案:

copy_to_user / copy_from_user

#include 

#include

kmalloc

#include
mknod

#include
struct class * adc_class;

adc_probe中新增如下:

device = device_create(adc_class, null, adc->devno, null, "adc");

if (is_err(device))

err_alloc_chrdev_region:

kfree(adc);

adc_remove

int adc_remove(struct platform_device *pdev)

int __init adc_init(void)中新增

class_create(this_module, "adc");
void __exit adc_exit(void)中新增:

class_destroy(adc_class);
現在框架好了 :

實現步驟:

clk設定

1.1 獲取時鐘

1.2 使能時鐘

1.3 設定時鐘頻率(本驅動不做)

iomem配置

2.1 獲取(從裝置中獲取)

2.2 申請/登出

2.3 對映/取消對映

2.4 使用

irq配置

3.1 獲取號

3.2 實現isr

3.3 註冊中斷

硬體驅動

adc_init

adc_read

adc_set_resolution

讀(阻塞)

5.1 建立等待佇列

5.1.1 分配記憶體

裝置的結構體

5.1.2 初始化

probe

5.2 在需要等待的地方等待

file_operations : read

5.3 在需要喚醒的地方喚醒

adc_isr

非阻塞(read/write)

1.1 read

io多路復用

2.1 建立等待佇列

已經完成

2.2 poll(file_operations)

2.3 喚醒

已經完成

建立非同步訊號佇列指標

1.1 分配記憶體

1.2 初始化

建立非同步訊號佇列

銷毀非同步訊號佇列

裝置就緒時,傳送訊號給應用程式

確定競態**範圍

1.1 確定併發**

file_operations和中斷處理函式

1.2 確定同時訪問共享資源的**

file_operations: read、ioctl、poll和adc_isr

file_operations和adc_isr之間沒用共享資源

1.3 確定訪問獨佔共享資源的**

解決競態(自旋鎖、訊號量)

2.1 建立訊號量

2.1.1 分配記憶體

裝置結構體

2.1.2 初始化

probe

2.2 獲取訊號量/釋放訊號量

驅動之路四 adc驅動(input裝置)

開發板 smdk6410 開發環境 linux 突然想起一點,寫這些驅動,核心需要配成支援搶占才行。前面的部落格已經將其它的基本知識都解釋了,這裡也就不過多的闡述了,咱就直接寫 吧 這次寫的是adc驅動,將其做為輸入裝置進行使用,先寫標頭檔案,s3c adc.h ifndef adc h defin...

ADC驅動例項(簡單)

adc驅動 僅一路輸入 s3c2410 adc.h ifndef s3c2410 adc h define s3c2410 adc h define adc write ch,prescale ch 16 prescale 將頻道和預分頻合併為乙個資料,這樣可以作為乙個引數傳入 define adc...

全志 ADC驅動

adc 驅動 1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 include 10 include 11 include 12 include 13 include 14 includ...