arm linux ADC驅動(中斷方式)

2021-07-03 07:11:33 字數 2901 閱讀 2647

硬體平台: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 驅動(查詢方式)

主機系統 ubuntu 11.04 核心版本 linux kernel 2.6.39 硬體平台 fl2440 開發板系統 linux kernel 2.6.28 下面是用cpu輪尋的方式來判斷ad轉換完成的 include include include include 建立裝置節點 include...

裝置驅動 中斷

1 關於裝置驅動中的中斷問題 作業系統為了使得快速裝置和慢速裝置合適工作,需要中斷來提高效率,乙個外設要使用乙個中斷就必須註冊中斷號,獲得跟這個中斷號相關的一些資源,並且在中斷發生的時候核心可以進行一些處理,例如 呼叫中斷處理例程來真正的處理裝置中斷。linux處理中斷的方式很大程度上與它在使用者空...

驅動互斥中斷

互斥機制 1 遮蔽中斷 2 原子操作 定義原子變數 atomic t v 初始化 atomic t v atomic init 0 操作atomic t v atomic init 1 open else release 自旋鎖使用 自旋鎖是忙鎖 系統開銷較大,為了減小系統開銷,需要減少等待時間而減...