硬體平台: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 自旋鎖使用 自旋鎖是忙鎖 系統開銷較大,為了減小系統開銷,需要減少等待時間而減...