ARM Linux驅動 ADC驅動(中斷方式)

2021-08-25 23:13:06 字數 2386 閱讀 2733

硬體平台:fl2440

核心版本:2.6.28

主機平台:ubuntu 11.04

核心版本:2.6.39

這個驅動寫了好久,因為原來的linux核心編譯的時候將觸控螢幕驅動編譯進核心了,而觸控螢幕驅動裡的adc中斷在註冊的時候型別選擇的是

irqf_sample_random,不是共享型別,所以,自己寫的adc驅動在每次open的時候,總提示adc中斷註冊失敗。
解決方案:

重新配置核心,選擇觸控螢幕驅動以模組的形式編譯,而不是直接編譯進核心,這樣linux在啟動的時候不會自動載入觸控螢幕驅動,當然,irq_adc中斷號不會被占用。這樣可以測試自己寫的adc驅動了。

以下是驅動源**:

#include #include #include #include /*建立裝置節點*/ #include #include /*定義declare_wait_queue_head*/ #include /*定義了irqreturn_t等*/ #include /*request_irq disable_irq enable_irq*/ #include #include #include /*其中包含了#include "mach/irqs.h" */ #include #include #define adc_major 102 #define adc_name "my_adc" #define success 0 static int adc_open(struct inode *,struct file *); static int adc_release(struct inode *,struct file *); static int __init adc_init(void); static int __exit adc_exit(void); static ssize_t adc_read(struct file *,char *,size_t,loff_t *); volatile unsigned long adc_con; unsigned long adc_dat0; int flag;//等待任務完成標誌 unsigned long buf;//存放轉換完成的資料 //宣告等待佇列 declare_wait_queue_head(adc_wait); struct clk *adc_clk; static irqreturn_t adc_interrupt(int irq,void * dev_id)//中斷處理程式 return irq_handled; } struct file_operations adc_ops = ; static int __init adc_init(void) adc_con=(unsigned long)ioremap(0x58000000,4); adc_dat0=(volatile unsigned long)ioremap(0x58000000+s3c2410_adcdat0,4); if( !(adc_con & adc_dat0) ) printk("initialized.../n"); return success; handle: unregister_chrdev(adc_major,adc_name); return -1; } static int adc_open(struct inode * inode,struct file * file) //開啟裝置函式 return success; } static int adc_release(struct inode * inode,struct file * file) //關閉裝置函式 static ssize_t adc_read(struct file *file, char * buffer, size_t length, loff_t * offset)//裝置讀取函式 static int __exit adc_exit(void) //驅動解除安裝函式 module_init(adc_init); module_exit(adc_exit); module_license("gpl");

makefile檔案:

obj-m := adc.o kerneldir ?= /arm/linux-2.6.28.7-2440 pwd := $(shell pwd) default: $(make) -c $(kerneldir) m=$(pwd) modules clean: rm -f *.o *.ko *.order *.symvers read read: arm-linux-gcc -o read read_adc.c

以下是測試**:

#include #include #include #define adc_device "/dev/my_adc" int main() for(;;) close(ret); return 0; }

首先新建裝置:

mknod /dev/my_adc c 102 32

然後插入驅動 insmod adc.ko

執行測試程式./read

結果如下:

可以看出,調節ad轉換器上的旋鈕,看到ad轉換值的變化,說明驅動工作正常。

ARM Linux驅動 ADC驅動(中斷方式)

硬體平台 fl2440 核心版本 2.6.28 主機平台 ubuntu 11.04 核心版本 2.6.39 這個驅動寫了好久,因為原來的linux核心編譯的時候將觸控螢幕驅動編譯進核心了,而觸控螢幕驅動裡的adc中斷在註冊的時候型別選擇的是 irqf sample random,不是共享型別,所以,...

Linux驅動修煉之道 ADC驅動

對於s3c2440 來說,實現a d 轉換比較簡單,主要應用的是adc 控制暫存器adccon 和adc 轉換資料暫存器adcdat0 暫存器adcdat0 的低10 位用於儲存a d 轉換後的資料。暫存器adccon 的第15 位用於標識a d 轉換是否結束。第14 位用於使能是否進行預分頻,而第...

Linux驅動修煉之道 ADC驅動

對於s3c2440 來說,實現a d 轉換比較簡單,主要應用的是adc 控制暫存器adccon 和adc 轉換資料暫存器adcdat0 暫存器adcdat0 的低10 位用於儲存a d 轉換後的資料。暫存器adccon 的第15 位用於標識a d 轉換是否結束。第14 位用於使能是否進行預分頻,而第...