mini2440之ADC驅動分析

2021-06-12 05:24:30 字數 4634 閱讀 6587

一,adc原理

adc,模數轉換器,將模擬量轉換成數字量,取樣,保持電路與ad轉換器整合在一起。ad轉換器模擬輸入訊號是直流電壓訊號,0~3.3v之間。s3c2440有8路模擬輸入訊號,ad轉換器內部有乙個模擬多路選擇器,某一時刻只能將一路模擬輸入訊號,通過模擬多路選擇器接通進行ad轉換,而其他路模擬輸入訊號被斷開

片內adc電路

adc轉換電路

模組圖

xp,xm,yp,ym占用了四個ad通道,用於觸控螢幕操作

功能描述

1.ad轉換時間**換速率)

2.正常轉換模式

二,暫存器操作

adc控制暫存器

adc資料轉換暫存器0([9~0]保留ad轉換之後的資料)

三,adc驅動源**

#include

#include //printk()

#include

#include

#include

#include

#include

#include

#include

#include

#include //包含很多驅動使用的核心api的定義。睡眠函式,變數宣告

#include //定義io對映

#include

#include

#include

#include

#include //adc暫存器的定義

#include

#include

#include

#include "s3c24xx-adc.h"

#undef debug

//#define debug

#ifdef debug

#define dprintk(x...)

#else

#define dprintk(x...) (void)(0)

#endif

#define device_name

"adc"

//經過虛擬位址對映之後的記憶體位址

static void __iomem *base_addr;
typedef struct adc_dev;

//申請並初始化訊號量

declare_mutex(adc_lock);
//adc驅動是否擁有ad轉換器資源的狀態變數

static int ownadc = 0;
static adc_dev adcdev;

static volatile int ev_adc = 0;//標識ad轉換後的資料是否可以讀取,0表示不可讀取

static int adc_data;//儲存讀取後的ad轉換的值,該值在adc中斷中讀取

//儲存從時鐘平台佇列中獲取adc的時鐘

static struct clk	*adc_clock;
//定義adc的暫存器

#define adccon      (*(volatile unsigned long *)(base_addr + s3c2410_adccon))	//adc control

#define adctsc (*(volatile unsigned long *)(base_addr + s3c2410_adctsc)) //adc touch screen control

#define adcdly (*(volatile unsigned long *)(base_addr + s3c2410_adcdly)) //adc start or interval delay

#define adcdat0 (*(volatile unsigned long *)(base_addr + s3c2410_adcdat0)) //adc conversion data 0

#define adcdat1 (*(volatile unsigned long *)(base_addr + s3c2410_adcdat1)) //adc conversion data 1

#define adcupdn (*(volatile unsigned long *)(base_addr + 0x14)) //stylus up/down interrupt status

//以下都定義於adccon中

#define prescale_dis        (0 << 14)//預分頻禁止

#define prescale_en (1 << 14)//預分頻允許

#define prscvl(x) ((x) << 6)//預分頻值設定

#define adc_input(x) ((x) << 3)//模擬輸入通道選擇

#define adc_start (1 << 0)//開始ad轉換

#define adc_endcvt (1 << 15)//ad轉換結束

//設定adc控制器,開啟adc轉換

#define start_adc_ain(ch, prescale) \

dowhile(0)

//中斷服務程式,從adc資料暫存器中讀取ad轉換後的值

static irqreturn_t adcdone_int_handler(int irq, void *dev_id)

return irq_handled;

}

static ssize_t s3c2410_adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)

else

len = sprintf(str, "%d\n", value);

if (count >= len) else

}

//開啟adc,並設定頻道和預分頻值

static int s3c2410_adc_open(struct inode *inode, struct file *filp)

static int s3c2410_adc_release(struct inode *inode, struct file *filp)

//非標準c的用法,gnu c的用法

static struct file_operations dev_fops = ;

static struct miscdevice misc =

//獲取adc時鐘

adc_clock = clk_get(null, "adc");

if (!adc_clock)

clk_enable(adc_clock);//時鐘使能

/* normal adc */

adctsc = 0;

//adc中斷申請,採用共享中斷,

ret = request_irq(irq_adc, adcdone_int_handler, irqf_shared, device_name, &adcdev);

if (ret)

ret = misc_register(&misc);

printk (device_name"\tinitialized\n");

return ret;

}

static void __exit dev_exit(void)

misc_deregister(&misc);

}

//匯出訊號量adc_lock在觸控螢幕驅動中使用,因為觸控螢幕和adc公用暫存器,會產生競爭

//用訊號量保證資源的互斥訪問

export_symbol(adc_lock);
module_init(dev_init);

module_exit(dev_exit);

module_license("gpl");

module_author("friendlyarm inc.");

關於mini 2440 的spi驅動移植及分析

linux2.6.32下spi驅動的移植 mini2440 下面需要修改部分核心 具體操作如下 1.修改arch arm mach s3c2440 mach mini2440.c檔案 在include標頭檔案 行之後增加如下 spi add by shiguang include include s...

mini2440 核心原始碼驅動閱讀

mini2440所有驅動都有共同的地方 linux 2.6.32.2 arch arm mach s3c2440 mach mini2440.c a.使用 dm9000.路徑 linux 2.6.32.2 drivers net dm9000.c 網絡卡的全部操作硬體的驅動。linux 2.6.32...

mini2440 解除安裝模組

我的mini2440買回來這麼久了,一直有個問題很奇怪,就是執行insmod ko一切正行,lsmod也可以看到你插入的模組,但是用rmmod就會出現no such file,一直對這個問題就感覺很奇怪,也google了很多,網上五花八門的答案都有。最後還是仔細看了手冊才找到答案,原來是要把板子上的...