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 #include string.h>15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #include 23 #include 24 #include 25 #include 26 #include 27 #include 28 #include 29 #include 30
3132
#define ir_gpio gpioh(10) //
外部中斷引腳
3334
35//
定義個資料報
36struct
fsp_event;
4041
42//
物件導向-裝置的型別
43struct
fsp;
53struct fsp *fsp_dev;
5455
56//
void __iomem *adc_base;
//必須是void __iomem型別因為偏移位址不一樣
5758
59volatile unsigned long * adc_ctrl; //
adc控制暫存器
60volatile unsigned long * adc_intc; //
adc中斷控制暫存器
61volatile unsigned long * adc_ints; //
adc中斷狀態暫存器
62volatile unsigned long * adc_dat0; //
adc資料1暫存器
63volatile unsigned long * adc_dat1; //
adc資料2暫存器
6465
66 wait_queue_head_t adcq; //
等待佇列頭
67int flag = 0;68
6970
//中斷服務函式
71 irqreturn_t fsp_irq_svc(int irqno,void *id)
7285
8687
8889
//open介面 adc0
90int fsp_adc_open(struct inode *inode,struct file *filp)
91119
120121
//read介面
122 ssize_t fsp_adc_read(struct file *filp,char __user *ubuf,size_t size,loff_t *off)
123147
148149
150//
close介面
151int fsp_adc_close(struct inode *inode, struct file *filp)
152156
157158
159160
//實現fops
161struct file_operations fops =;
167168
169170
//初始化函式
171static
int __init fsp_init(void
)
172183
184185
//動態申請裝置號
186 ret = alloc_chrdev_region(&fsp_dev->devno,0,1,"
button_drv");
187if(ret < 0
)192
193194
//申請cdev的空間
195 fsp_dev->cdev =cdev_alloc();
196if(is_err(fsp_dev->cdev))
201202
//初始化cdev的成員
203 cdev_init(fsp_dev->cdev,&fops);
204205
//將cdev加入到核心中----鍊錶
206 ret = cdev_add(fsp_dev->cdev,fsp_dev->devno,1
);207
208//
建立裝置檔案
209 fsp_dev->cls = class_create(this_module,"
fsp_dev");
210if(is_err(fsp_dev->cls))
215216 fsp_dev->dev = device_create(fsp_dev->cls,null,fsp_dev->devno,null,"
fsp_eint");
217if(is_err(fsp_dev->dev))
222223
224225
//1.中斷申請
226 fsp_dev->irqno = gpio_to_irq(ir_gpio); //
中斷號227 ret = request_irq(fsp_dev->irqno,fsp_irq_svc,irqf_trigger_falling|irqf_trigger_rising,"
eint-keydown
",null);
228if(ret != 0
)233
234235
//2.位址對映
236 adc_ctrl = ioremap(0x01c24400,8);//
將物理位址對映成虛擬位址
237 adc_intc = adc_ctrl + 1
;238 adc_ints = adc_ctrl + 2
;239 adc_intc = adc_dat0 + 3
;240 adc_intc = adc_dat1 + 4
;241
242243
//writel(255 << 6 | 1 << 14 | 1 << 16,adc_base);
244//
writel(3,adc_base + 0x1c);
245246
247248 init_waitqueue_head(&adcq); //
初始化等待對列頭
249250
return0;
251252
err_device:
253 device_destroy(fsp_dev->cls,fsp_dev->devno);
254err_class:
255 class_destroy(fsp_dev->cls);
256257
err_cdev_del:
258 cdev_del(fsp_dev->cdev);
259260
err_unregister:
261 unregister_chrdev_region(fsp_dev->devno,1
);262
263err_kfree:
264kfree(fsp_dev);
265return
ret;
266267
}268
269270
271static
void __exit fsp_exit(void
)
272282
283284
285module_init(fsp_init);
286module_exit(fsp_exit);
287 module_license("
gpl");
測試:
1 #include 2 #include 3 #include 4 #include 5 #include 678int main(void)9
21close(fd);
22return0;
23 }
部落格:
全志axp驅動功能分析 除錯說明
全志 技術社群 1.axp晶元功能說明 2.驅動原始碼說明 1 drivers power axp power axp22 board.c a.讀取sys config.fex,初始化一些引數 包括 axp221裝置位址 axp221是通過i2c連線到soc上的 電池容量 電池充電電流 電池充電電壓...
ADC驅動例項(簡單)
adc驅動 僅一路輸入 s3c2410 adc.h ifndef s3c2410 adc h define s3c2410 adc h define adc write ch,prescale ch 16 prescale 將頻道和預分頻合併為乙個資料,這樣可以作為乙個引數傳入 define adc...
Linux驅動修煉之道 ADC驅動
對於s3c2440 來說,實現a d 轉換比較簡單,主要應用的是adc 控制暫存器adccon 和adc 轉換資料暫存器adcdat0 暫存器adcdat0 的低10 位用於儲存a d 轉換後的資料。暫存器adccon 的第15 位用於標識a d 轉換是否結束。第14 位用於使能是否進行預分頻,而第...