當前位置:首頁 > 單片機 > 單片機
[導讀]一、開發(fā)環(huán)境主 機:VMWare--Fedora 9開發(fā)板:Mini2440--64MB Nand, Kernel:2.6.30.4編譯器:arm-linux-gcc-4.3.2二、硬件原理分析 S3C2440內部ADC結構圖我們從上面的結構圖和數(shù)據(jù)手冊可以知道,該ADC模塊總共有8個通

一、開發(fā)環(huán)境

主 機:VMWare--Fedora 9

開發(fā)板:Mini2440--64MB Nand, Kernel:2.6.30.4

編譯器:arm-linux-gcc-4.3.2

二、硬件原理分析
S3C2440內部ADC結構圖

我們從上面的結構圖和數(shù)據(jù)手冊可以知道,該ADC模塊總共有8個通道可以進行模擬信號的輸入,分別是AIN0、AIN1、AIN2、AIN3、YM、YP、XM、XP。那么ADC是怎么實現(xiàn)模擬信號到數(shù)字信號的轉換呢?首先模擬信號從任一通道輸入,然后設定寄存器中預分頻器的值來確定AD轉換器頻率,最后ADC將模擬信號轉換為數(shù)字信號保存到ADC數(shù)據(jù)寄存器0中(ADCDAT0),然后ADCDAT0中的數(shù)據(jù)可以通過中斷或查詢的方式來訪問。對于ADC的各寄存器的操作和注意事項請參閱數(shù)據(jù)手冊。

上圖是mini2440上的ADC應用實例,開發(fā)板通過一個10K的電位器(可變電阻)來產(chǎn)生電壓模擬信號,然后通過第一個通道(即:AIN0)將模擬信號輸入ADC。

三、實現(xiàn)步驟

ADC設備在Linux中可以看做是簡單的字符設備,也可以當做是一混雜設備(misc設備),這里我們就看做是misc設備來實現(xiàn)ADC的驅動。注意:這里我們獲取AD轉換后的數(shù)據(jù)將采用中斷的方式,即當AD轉換完成后產(chǎn)生AD中斷,在中斷服務程序中來讀取ADCDAT0的第0-9位的值(即AD轉換后的值)。

1、建立驅動程序文件my2440_adc.c,實現(xiàn)驅動的初始化和退出,代碼如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

/*定義了一個用來保存經(jīng)過虛擬映射后的內存地址*/
staticvoid__iomem*adc_base;

/*保存從平臺時鐘隊列中獲取ADC的時鐘*/
staticstructclk*adc_clk;

/*申明并初始化一個信號量ADC_LOCK,對ADC資源進行互斥訪問*/
DECLARE_MUTEX(ADC_LOCK);

staticint__init adc_init(void)
{
intret;

/*從平臺時鐘隊列中獲取ADC的時鐘,這里為什么要取得這個時鐘,因為ADC的轉換頻率跟時鐘有關。
系統(tǒng)的一些時鐘定義在arch/arm/plat-s3c24xx/s3c2410-clock.c中*/
adc_clk=clk_get(NULL,"adc");
if(!adc_clk)
{
/*錯誤處理*/
printk(KERN_ERR"failed to find adc clock sourcen");
return-ENOENT;
}

/*時鐘獲取后要使能后才可以使用,clk_enable定義在arch/arm/plat-s3c/clock.c中*/
clk_enable(adc_clk);

/*將ADC的IO端口占用的這段IO空間映射到內存的虛擬地址,ioremap定義在io.h中。
注意:IO空間要映射后才能使用,以后對虛擬地址的操作就是對IO空間的操作,
S3C2410_PA_ADC是ADC控制器的基地址,定義在mach-s3c2410/include/mach/map.h中,0x20是虛擬地址長度大小*/
adc_base=ioremap(S3C2410_PA_ADC,0x20);
if(adc_base==NULL)
{
/*錯誤處理*/
printk(KERN_ERR"Failed to remap register blockn");
ret=-EINVAL;
gotoerr_noclk;
}

/*把看ADC注冊成為misc設備,misc_register定義在miscdevice.h中
adc_miscdev結構體定義及內部接口函數(shù)在第②步中講,MISC_DYNAMIC_MINOR是次設備號,定義在miscdevice.h中*/
ret=misc_register(&adc_miscdev);
if(ret)
{
/*錯誤處理*/
printk(KERN_ERR"cannot register miscdev on minor=%d (%d)n",MISC_DYNAMIC_MINOR,ret);
gotoerr_nomap;
}

printk(DEVICE_NAME" initialized!n");

return0;

//以下是上面錯誤處理的跳轉點
err_noclk:
clk_disable(adc_clk);
clk_put(adc_clk);

err_nomap:
iounmap(adc_base);

returnret;
}

staticvoid__exit adc_exit(void)
{
free_irq(IRQ_ADC,1);/*釋放中斷*/
iounmap(adc_base);/*釋放虛擬地址映射空間*/

if(adc_clk)/*屏蔽和銷毀時鐘*/
{
clk_disable(adc_clk);
clk_put(adc_clk);
adc_clk=NULL;
}

misc_deregister(&adc_miscdev);/*注銷misc設備*/
}

/*導出信號量ADC_LOCK在觸摸屏驅動中使用,因為觸摸屏驅動和ADC驅動公用
相關的寄存器,為了不產(chǎn)生資源競態(tài),就用信號量來保證資源的互斥訪問*/
EXPORT_SYMBOL(ADC_LOCK);

module_init(adc_init);
module_exit(adc_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Huang Gang");
MODULE_DESCRIPTION("My2440 ADC Driver");DE>


2、adc_miscdev結構體定義及內部各接口函數(shù)的實現(xiàn),代碼如下:

#include

/*設備名稱*/
#defineDEVICE_NAME"my2440_adc"

/*定義并初始化一個等待隊列adc_waitq,對ADC資源進行阻塞訪問*/
staticDECLARE_WAIT_QUEUE_HEAD(adc_waitq);

/*用于標識AD轉換后的數(shù)據(jù)是否可以讀取,0表示不可讀取*/
staticvolatileintev_adc=0;

/*用于保存讀取的AD轉換后的值,該值在ADC中斷中讀取*/
staticintadc_data;

/*misc設備結構體實現(xiàn)*/
staticstructmiscdevice adc_miscdev=
{
.minor=MISC_DYNAMIC_MINOR,/*次設備號,定義在miscdevice.h中,為255*/
.name=DEVICE_NAME,/*設備名稱*/
.fops=&adc_fops,/*對ADC設備文件操作*/
};

/*字符設備的相關操作實現(xiàn)*/
staticstructfile_operations adc_fops=
{
.owner=THIS_MODULE,
.open=adc_open,
.read=adc_read,
.release=adc_release,
};

/*ADC設備驅動的打開接口函數(shù)*/
staticintadc_open(structinode*inode,structfile*file)
{
intret;

/*申請ADC中斷服務,這里使用的是共享中斷:IRQF_SHARED,為什么要使用共享中斷,因為在觸摸屏驅動中
也使用了這個中斷號。中斷服務程序為:adc_irq在下面實現(xiàn),IRQ_ADC是ADC的中斷號,這里注意:
申請中斷函數(shù)的最后一個參數(shù)一定不能為NULL,否則中斷申請會失敗,如果中斷服務程序中用不到這個
參數(shù),就隨便給個值就好了,我這里就給個1*/
ret=request_irq(IRQ_ADC,adc_irq,IRQF_SHARED,DEVICE_NAME,1);
if(ret)
{
/*錯誤處理*/
printk(KERN_ERR"IRQ%d error %dn",IRQ_ADC,ret);
return-EINVAL;
}

return0;
}

/*ADC中斷服務程序,該服務程序主要是從ADC數(shù)據(jù)寄存器中讀取AD轉換后的值*/
staticirqreturn_t adc_irq(intirq,void*dev_id)
{
/*保證了應用程序讀取一次這里就讀取AD轉換的值一次,
避免應用程序讀取一次后發(fā)生多次中斷多次讀取AD轉換值*/
if(!ev_adc)
{
/*讀取AD轉換后的值保存到全局變量adc_data中,S3C2410_ADCDAT0定義在regs-adc.h中,
這里為什么要與上一個0x3ff,很簡單,因為AD轉換后的數(shù)據(jù)是保存在ADCDAT0的第0-9位,
所以與上0x3ff(即:1111111111)后就得到第0-9位的數(shù)據(jù),多余的位就都為0*/
adc_data=readl(adc_base+S3C2410_ADCDAT0)&0x3ff;

/*將可讀標識為1,并喚醒等待隊列*/
ev_adc=1;
wake_up_interruptible(&adc_waitq);
}

returnIRQ_HANDLED;
}

/*ADC設備驅動的讀接口函數(shù)*/
staticssize_t adc_read(structfile*filp,char*buffer,size_tcount,loff_t*ppos)
{
/*試著獲取信號量(即:加鎖)*/
if(down_trylock(&ADC_LOCK))
{
return-EBUSY;
}

if(!ev_adc)/*表示還沒有AD轉換后的數(shù)據(jù),不可讀取*/
{
if(filp->f_flags&O_NONBLOCK)
{
/*應用程序若采用非阻塞方式讀取則返回錯誤*/
return-EAGAIN;
}
else/*以阻塞方式進行讀取*/
{
/*設置ADC控制寄存器,開啟AD轉換*/
start_adc();

/*使等待隊列進入睡眠*/
wait_event_interruptible(adc_waitq,ev_adc);
}
}

/*能到這里就表示已有AD轉換后的數(shù)據(jù),則標識清0,給下一次讀做判斷用*/
ev_adc=0;

/*將讀取到的AD轉換后的值發(fā)往到上層應用程序*/
copy_to_user(buffer,(char*)&adc_data,sizeof(adc_data));

/*釋放獲取的信號量(即:解鎖)*/
up(&ADC_LOCK);

returnsizeof(adc_data);
}

/*設置ADC控制寄存器,開啟AD轉換*/
staticvoidstart_adc(void)
{
unsignedinttmp;

tmp=(1<<14)|(255<<6)|(0<<3);/* 0 1 00000011 000 0 0 0 */
writel(tmp,adc_base+S3C2410_ADCCON);/*AD預分頻器使能、模擬輸入通道設為AIN0*/

tmp=readl(adc_base+S3C2410_ADCCON);
tmp=tmp|(1<<0);/* 0 1 00000011 000 0 0 1 */
writel(tmp,adc_base+S3C2410_ADCCON);/*AD轉換開始*/
}

/*ADC設備驅動的關閉接口函數(shù)*/
staticintadc_release(structinode*inode,structfile*filp)
{
return0;
}

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉