学号20⑶52108论文题目: 基于S3C2410处理器的A/D转换驱动程序设计课 程:ARM嵌入式Linux系统开发与设计学 院: 信息工程学院 专 业: 计算机科学与技术 班 级: 2013级专升本班 作者姓名: 张清芸 目录摘要: 21•绪论 21.1设计目的 21.2设计要求 22. 系统总体方案 32.1开发系统平台构建 32.2系统开发流程 52.3应用程序流程 52.4 Linux操作系统及其常用命令 63. 嵌入式操作系统A/D转换及工作原理 73.1 A/D转换的实现及工作原理 73.2实现程序的主要函数 84. vivi、Linux内核、cramfs文件系统的烧写 104.1 vivi 的烧写 104.3 烧写 cramfs 文件系统 115. 交叉编译 125.1 Makefile 文件编写 125.2交叉编译的过程 126. 程序源代码设计与调试 126.1程序源代码设计 126.2运行调试 137. 总结 13附录一: 14参考文献 27基于S3C2410处理器的A/D转换驱动程序设计张清芸(信息工程学院13级专升本班2013052108)摘要:本文基于S3C2410处理器的开发板上,嵌入式Linux系统环境下,设计A/D转 换器,实现模拟信号向数字信号的转化。
对vivi、Linux内核、cramfs文件系统的烧写, 交叉编译的一系列过程分辨率反映A/D转换器对输入微小变化响应的能力,通常用 数字输出最低位(LSB)所对应的模拟输入的电平值表示具有很高的应用价值关键字:S3C2410处理器;cramfs ;交叉编译1. 绪论1.1设计目的(1) 了解PC机模拟Linux环境下,嵌入式系统开发方法和流程2) 熟悉Linux平台使用技巧以及Linux环境操作命令3) 通过设计掌握Linux嵌入式系统A\D转换器实验,以及相关程序代码的编写1.2设计要求在Samsung公司S3C2410处理器的开发板上,嵌入式Linux系统环境下,设计A/D 转换器,实现模拟信号向数字信号的转化在转化过程中需要的指标如下:(1) 分辨率分辨率反映A/D转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB) 所对应的模拟输入的电平值表示n位A/D能反应1/2n满量程的模拟输入电平由于 分辨率直接与转换器的位数有关,所以一般也可简单地用数字量的位数来表示分辨率, 即n位二进制数,最低位所具有的权值,就是它的分辨率值得注意的是,分辨率与精度是两个不同的概念,不要把两者相混淆。
即使分辨率 很高,也可能由于温度漂移、线性度等原因,而使其精度不够高2) 精度精度有绝对精度(Absolu te Accuracy)和相对精度(Rela tive Accuracy)两种表示方 法① 绝对误差:在一个转换器中,对应于一个数字量的实际模拟输入电压和理想的模拟输入电压之 差并非是一个常数我们把它们之间的差的最大值,定义为“绝对误差”通常以数字 量的最小有效位(LSB)的分数值来表示绝对误差,例如:±1LSB等绝对误差包括量化 误差和其它所有误差② 相对误差:是指整个转换范围内,任一数字量所对应的模拟输入量的实际值与理论值之差,用 模拟电压满量程的百分比表示例如,满量程为10V,10位A/D芯片,若其绝对精度为±1/2LSB,则其最小有效位的 量化单位:9.77mV,其绝对精度为= 4.88mV,其相对精度为0.048%③ 转换时间:转换时间是指完成一次A/D转换所需的时间,即由发出启动转换命令信号到转换 结束信号开始有效的时间间隔转换时间的倒数称为转换速率例如AD570的转换时 间为25us,其转换速率为40KHz④ 电源灵敏度:电源灵敏度是指A/D转换芯片的供电电源的电压发生变化时,产生的转换误差。
一般用电源电压变化1 %时相当的模拟量变化的百分数来表示⑤ 量程:量程是指所能转换的模拟输入电压范围,分单极性、双极性两种类型 例如,单极性量程为0〜+5V,0〜+10V,0〜+20V; 双极性 量程为-5〜+5V,-10〜+10V⑥ 输出逻辑电平:多数A/D转换器的输出逻辑电平与TTL电平兼容在考虑数字量输出与微处理的 数据总线接口时,应注意是否要三态逻辑输出,是否要对数据进行锁存等⑦ 工作温度范围:由于温度会对比较器、运算放大器、电阻网络等产生影响,故只在一定的温度范围内才能 保证额定精度指标一般 A/D转换器的工作温度范围为(0〜700C),军用品的工作温度范围为(-55〜+1250C)设计过程中要求考虑以上因素2. 系统总体方案2.1开发系统平台构建2.1.1开发平台硬件组成① UP-NETARM2410-S核心模块资源*基于ARM9架构的嵌入式芯片S3C2410,主频202MHz* 64MB SDRAM* 64MB FLASH② UP-NETARM2410-S主板资源* 8 寸 640*480TFT 真彩 LCD*触摸屏* 4个主USB 口、1个从USB 口* 2 个 JTAG 接口* 一个100M网卡,预留一个100M网卡*两个串口、一个485接口* CAN总线接口*红外通信收发器* 8通道10位AD转换模块* 2通道10位DA转换模块* PCMCIA 接口* SD/MMC 接口* IDE硬盘接口*笔记本硬盘接口* CF卡接口* IC卡接口*直流电机、步进电机* 8个用户自定义LED数码管* 17键键盘* PS2鼠标、键盘接口*高性能立体声音频模块,支持放音、录音*麦克风接入* 一个168Pin的扩展插座,硬件可无限扩展2.1.2软件系统组成*提供完整的Linux、WinCE、“ C/OS-II操作系统移植* bootloader: vivi*操作系统:linux 2.4.x*驱动程序:提供所有板级设备的驱动程序2.2系统开发流程配置虚拟机安装Rcdllat操作系统17:配W.vivi并编译生成vivi尺K,配K Linux内核并编译生成z 1 mfigH尺K:生成根文件系统镜像'■:编9系统文件源程川;、、/烧写zltna说、根文件系统镜::运行、测试系统性能”图2-2系统开发流程图2.3应用程序流程图2-3应用程序流程图2.4 Linux操作系统及其常用命令在所有的操作系统中,Linux是一个发展最快、应用最为广泛的操作系统。
Linux 本身的种种特性使其成为嵌入式开发中的首选在进入市场的头两年中,嵌入式Linux 设计通过广泛应用获得了巨大的成功随着嵌入式Linux的成熟,提供更小的尺寸和更 多类型的处理器支持很多嵌入式Linux还改造了原来的Linux版本如:RTLinux通 过改造内核实现了实时的Linux; RTAI、Kurt和Linux/RK也提供实时能力;还有uCLinux 去掉了 Linux的MMU (内存管理单元),能够支持没有MMU的处理器等Linux常用命令:基本命令:ls以默认方式显示当前目录文件列表Is -a显示所有文件包括隐藏文件ls -l显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行cd〈目录〉切换到当前目录下的子目录cd /切换到根目录cd ..切换到到上一级目录rm〈file〉删除某一个文件rm -rf dir删除当前目录下叫dir的整个目录(包括下面的文件)cp〈source〉 〈target〉 将文件 source 复制为 targetcp /root/source .将/root下的文件source复制到当前目录mv〈source〉 〈target〉 将文件 source 更名为 targetcat〈file〉 显示文件的内容,和DOS的type相同find/path -name〈file〉 在/path目录下查找看是否有文件filevi〈file〉 编辑文件filemanls读取关于ls命令的帮助startx 运行Linux图形有环境shutdown -h now 关闭计算机reboot重新启动计算机扩展命令tar压缩、解压文件解压文件tar 文件:tar xf xxx.targz 文件: tar xzvfxxx.tar.gzbz2 文件:tar xjvf xxx.tar.bz2压缩文件tar 文件:tar cf xxx.tar /pathgz 文件: tar czvf xxx.tar.gz /pathbz2 文件:tar cjvf xxx.tar.bz2 /pathmount-t ext2 /dev/hdal /mnt 把/dev/hdal 装载到/mntmount -t iso9660 /dev/cdrom /mnt/cdrom 将光驱加载到 /mnt/cdrommount -t nfs 192.168.1.1:/sharedir /mnt 将 nfs 服务的共享目录sharedir 力口载至U /mnt/nfsumount /dev/hda1将/dev/hda1设备卸载,设备必须处于空闲状态ifconfig ethO 192.168.1.1 netmask 255.255.255.0 设置网卡 1 的地址192.168.1.1,掩码为255.255.255.0,不写netmask参数则默认为255.255.255.0 测试与的连接ping 202.96.128.68 测试与 IP: 202.96.128.68 的连接3. 嵌入式操作系统A/D转换及工作原理3.1 A/D转换的实现及工作原理逐次逼近型的A/D转换器。
逐次逼近型(也称逐位比较式)的A/D转换器,应用比 积分型更为广泛,其原理框图如图所示,主要由逐次逼近寄存器SAR、D/A转换器、比 较器以及时序和控制逻辑等部分组成它的实质是逐次把设定的SAR寄存器中的数字 量经D/A转换后得到电压Vc与待转换模拟电压V进行比较比较时,先从SAR的 最高位开始,逐次确定各位的数码应是“ 1”还是“0”,其工作过程如下:转换前,先将SAR寄存器各位清零转换开始时,控制逻辑电路先设定SAR寄存 器的最高位为“ 1”,其余位为“0”,此试探值经D/A转换成电压Vc,然后将Vc与模 拟输入电压Vx比较如果Vx^Vc,说明SAR最高位的“1”应予保留;如果Vx
位数越多,越能准确逼近模拟量,但转换 所需的时间也越长逐次逼近式的A/D转换器的主要特点是:转换速度较快,在1—100/M以内,分 辨率可以达18位,特别适用于工业控制系统转换时间固定,不随输入信号的变化而 变化抗干扰能力相对积分型的差例如,对模拟输入信号采样过程中,若在采样时刻 有一个干扰脉冲迭加在模拟信号上,则采样时,包括干扰信号在内,都被采样和转换为 数字量,这就会造成较大的误差,所以有必要采取适当的滤波措施■(]Qoc)<oEonxoiio)t€i)nS 4 D d1胃护斤耙酗厦・]U) ■贰購返式A/D轉按桑0宀)劭JI血识电嗣E图3-1 A/D转换的实现及工作原理图3.2实现程序的主要函数主要驱动函数如下:static struct file operaiions s3e241 O fops = { owner: THISMODULE,open: s3c241 Oadcopen,read: s3c241 O ade read,write: s3c241 Oadewrite,release: s 3c241 Oadcre lease,static ini s3c241 Oadcopen (slruc l inode * inode, struct file{init_MUTEX( &adcde vlock);i nitw ai iq ueuehead (&(adcdev. wait));adcdev. channel=0;adcdev,prescale=OxfI;MODINCJJ SECOUN T;DPRINTKf "adc opened\ji");return 0;} "AD通道和比例因子初始化static ss)ze_t sJc241 U_adc_wrile(strucl tiJe wliJet const char *bulter, size lcounl, loll_l * ppos){ini 血la;i Bfcounl! ~sizeof(data)) {//error input data sizeDPRINTKf "the size of input data must be %d\n'\ sizeoffdata));rsium (1:}eopy_from_user(&daia1 bufTer, count);adcdev. channe l=ADC_WRIT EGET CH(daia);adcdev prescale=A DCWRITEGETPRE(daia);DPRINTK("set adc channel=%d, prescale^0A%x\n'', adcdev.ehannel, adcdev.prescale);return count;) "告诉内核驱动渎哪一个通道的数据和设置比例因子Mieiine pre^c«iiej xdo ; \ADCCON = PRESCALE_EN [ PRSCVL(prescaIe) | ADC_INPUT((ch)); \ADCCON |- ADC_START; \^whtle(0)//PRESCALE_EN左移14使应比啊因子有效;PRSCVL左移右位设置比例阖子://ADC_INPUT左移3位选择迴逍;//ADrrnN i= a nr start: adccgn o 九罟 i.邯答突隼数抿 static ssizej &5C241U adc reatnstmct tile Tiip, char * butter, $ize_t count, *ppos){mt ret = 0;i f (do wn_i niemipiiblef &』(kd亡 v.lock))return -ERESTARTSYS;STA RT_ADC_AIN(adcdev*chatmelT adcdev.preseale);i ntemiptible s leepjan(&adcdev^wait);ret=ADCDAT0;第t &k Ox3tT; 〃把数据蹇存器内容放入变量retDPRINTK(nAIN[%d] = 0x%04x, adcdev.channel, ret, ADCCON & 0x80 ? 1:0);copy to userfbufrer^ (char *)&埠心 sizeofifret));朋ret变量的内容传给用户缓冲区up(&adcdev. lock);reiurn sizeofftet);1 "中内核栗屢通逍驹韬薛护数抿樹冋宙戸I交4. vivi、Linux内核、cramfs文件系统的烧写4.1 vivi的烧写① 把并口线插到pc机的并口,并把并口与JTAG相连,JTAG与开发板 的14针JTAT 口相连,打开2410-S.② 把整个GIVEIO目录(在\Linux-V6.0\img \flashvivi目录下)拷 贝到C:\WINDOWS下,并把该目录下的giveio.sys文件拷贝到 c:/windows/system32/drivers 下。
③ 在控制面板里,选添加硬件 >下一步〉选一是我已经连接了此硬件 >下一步〉选中一添加新的硬件设备〉下一步〉选中安装我手动从列表选 择的硬件〉下一步 >选择一显示所有设备〉选择一从磁盘安装-浏览,指定 驱动为C:\WINDOWS\GIVEIO\giveio.inf文件,点击确定,安装好驱动④ 在 d 盘新建一目录 bootloader,把 sjf2410-s(在\Linux-V6.0\img \flashvivi目录下)和要烧写的vivi拷贝到该目录下,在程序一附件一 msdos下,进入该目录,运行sjf2410-s命令如下:sjf2410-s /f:vivi 在此后出现的三次要求输入参数,第一次是让选择Flash,选0;第二次 是选择jtag对flash的两种功能,也选0;第三次是让选择起始地址,选 0此后就等待大约3-5分钟的烧写时间,当vivi烧写完毕后选择参数2, 退出烧写4.2 Linux内核的烧写复位2410-s,进入vivivivi>load flash kernel x 回车当出现 Ready for downloading using xmodem...如图帮鼬illoffset = 4390912 size - 61865984 bad_block = 0 parts;offset = 662568: size = 835584 bdd_block 冃 0 vivi> load flash vivi Ready for downloading Waiting…offset = 1245184 size = 3145726 bad_block = Q parti:sssssSssssssssssssssss ^SSSSSSSSSSDownloaded f Found block size - 0x00 Erasing... … doneWriting... ... doneWritten 63872 bytes vivi> load flesh kerne) x Ready for downloading using xmodem . Waiting...SSSSSSSS图4-2 Linux内核烧写点击超级终端任务栏上“传送”下拉菜单中的“发送文件” ,选择好镜像文件 zImage,Enter,协议为Xmodem,点击“发送”,4分钟左右zImage烧写完毕;4.3烧写cramfs文件系统vivi>load flash root x 回车当出现 Ready for downloading using xmodem...如图 root.cramfs,协议为Xmodem,点击“发送",7分钟左右root.cramfs烧写完毕。
图4-3cramfs文件烧写5. 交叉编译5.1 Makefile文件编写Makefile文件源代码如下:TOPDIR = ../include $(TOPDIR)Rules.makEXTRA_LIBS += -lpthreadEXEC= $(INSTALL_DIR)/ad ./adOBJS= main.oall: $(EXEC)$(EXEC): $(OBJS)$(CC) $(LDFLAGS) -o $@ $(OBJS) $(EXTRA_LIBS)$(EXP_INSTALL) $(EXEC) $(INSTALL_DIR)clean:rm -f *.o a.out ad *.gdb5.2交叉编译的过程进入/arm2410s/exp/basic/04_ad目录,使用vi编辑器或其他编辑器阅读理解源代 码运行make生成ad可执行文件frool(ci:zxL /]# cd /arm2410 s/exp/bas i c/04_ad/[rooi^zxi O4_ad]# makearmv41-unknown-linux-gcc -c -o main.o main.carmv41-nnknown-linux-gce -o ../bin/ad main.o -]pthreadarmv41-nnknown-linux-gcc -o ad main.o -lpthreadM ake fi I 巴 bak s3c2410-adc .h[rool@zxl O4_ad]# Isad hardware^ main.obin main.cMakefile readme, txt src6. 程序源代码设计与调试6.1程序源代码设计程序代码详见附录一6.2运行调试换到 minicom 终端窗口,使用 NFS mount开发主机的/arm2410s到/mnt目录。
[rool(fzjzxl root]^ minicom[/mni/yatTs] mouni -I nfs -o no lock 192.168.0.56:/arm241 Os /host[/mni/ya[Ts]cd /ho st/ exp/basic/04_ad/[/hosi/exp/basic/04_ad] ./adPress Enter key exit!a0= 0.0032 al= 3.2968 a2= 3.29687•总结通过本论文的写述过程,我熟悉了整个嵌入式系统构建的基本流程并通过本论文 设计学会了在虚拟机环境下建立Linux操作系统与编程环境通过代码的编写,初步了 解了嵌入式驱动函数的基本书写规律以及如何实现与用户层的接口,同时,我们还学习 到了硬件如何实现用代码的转化,可谓收益匪浅学习嵌入式的道路很漫长,我们不能通过一篇论文就能有很好的了解与掌握,只能通过不断的 努力与学习,积累更多的经验,才能收获更多附录一:程序代码*//* Samsung S3C44B0 *//* tpu vtapu@> */*// / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /#ifndef _ASM_ARCH_HARDWARE_H#define ASM ARCH HARDWARE H#define REGBASE0x01c00000#define REGL(addr)(*(volatile unsigned int *)(REGBASE+addr))#define REGW(addr)(*(volatile unsigned short *)(REGBASE+addr))#define REGB(addr)(*(volatile unsigned char *)(REGBASE+addr))/ / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx //* CPU Wrapper Registers *// / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /#define SYSCFG#define NCACHBE0#define NCACHBE1#define SBUSCONREGL(OxOOOOOO)REGL(0x000004)REGL(0x000008)REGL(0x040000)REGL(0x080000)REGL(0x080004)REGL(0x080008)REGL(0x08000c)REGL(0x080010)REGL(0x080014)/ / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx //* Memory Controller Registers *// / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /#define BWSCON#define BANKCONO#define BANKCON1#define BANKCON2#define BANKCON3#define BANKCON4#define BANKC0N5 REGL(OxO8OO18)#define BANKCON6REGL(0x08001c)#define BANKCON7REGL(0x080020)#define REFRESHREGL(0x080024)#define BANKSIZEREGL(0x080028)#define MRSRB6REGL(0x08002c)#define MRSRB7REGL(0x080030)/ // //* UART Registers*// / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /#define ULCON0REGL(0x100000)#define ULCON1REGL(0x104000)#define UCON0REGL(0x100004)#define UCON1REGL(0x104004)#define UFCON0REGL(0x100008)#define UFCON1REGL(0x104008)#define UMCON0REGL(0x10000c)#define UMCON1REGL(0x10400c)#define UTRSTATOREGL(0x100010)#define UTRSTAT1REGL(0x104010)#define UERSTAT0REGL(0x100014)#define UERSTAT1REGL(0x104014)#define UFSTAT0REGL(0x100018)#define UFSTAT1REGL(0x104018)#define UMSTAT0REGL(0x10001c)#define UMSTAT1REGL(0x10401c)#define UTXH0REGB(0x100020)#define UTXH1REGB(0x104020)#define URXH0REGB(0x100024)#define URXH1REGB(0x104024)#define UBRDIV1 REGL(0x104028)/* SIO Registers */#define SIOCON#define SIODAT#define SBRDR#define ITVCNT#define DCNTZREGL(0x114000)REGL(0x114004)REGL(0x114008)REGL(0x11400c)REGL(0x114010)/* IIS Registers *// / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /#define IISCON#define IISMOD#define IISPSR#define IISFIFCONREGL(0x118000)REGL(0x118004)REGL(0x118008)REGL(0x11800c)#define IISFIF REGW(0x118010)/* I/O Ports Registers */#define PCONA#define PDATA#define PCONB#define PDATB#define PCONC#define PDATCREGL(0x120000)REGL(0x120004)REGL(0x120008)REGL(0x12000c)REGL(0x120010)REGL(0x120014)#define PUPCREGL(0x120018)#define PCONDREGL(0x12001c)#define PDATDREGL(0x120020)#define PCONE#define PDATE#define PUPE#define PCONF#define PDATF#define PUPF#define PCONG#define PDATG#define PUPG#define SPUCR#define EXTINT#define EXTINPNDREGL(0xl20028)REGL(0x12002c)REGL(0x120030)REGL(0x120034)REGL(0x120038)REGL(0x12003c)REGL(0x120040)REGL(0x120044)REGL(0x120048)REGL(0x12004c)REGL(0x120050)REGL(0x120054)#define WTCON#define WTDAT#define WTCNTREGL(0x130000)REGL(0x130004)REGL(0x130008)/* WatchDog Timers Registers *//* A/D Converter Registers *// / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /#define ADCCON#define ADCPSR#define ADCDATREGL(0x140000)REGL(0x140004)REGL(0x140008)/ / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx //* PWM Timer Registers *// / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /#define TCFG0#define TCFG1REGL(0x150000)REGL(0x150004)#define TCONREGL(0x150008)#define TCNTB0REGL(0x15000c)#define TCMPB0REGL(0x150010)#define TCNTO0REGL(0x150014)#define TCNTB1REGL(0x150018)#define TCMPB1REGL(0x15001c)#define TCNTO1REGL(0x150020)#define TCNTB2REGL(0x150024)#define TCMPB2REGL(0x150028)#define TCNTO2REGL(0x15002c)#define TCNTB3REGL(0x150030)#define TCMPB3REGL(0x150034)#define TCNTO3REGL(0x150038)#define TCNTB4REGL(0x15003c)#define TCMPB4REGL(0x150040)#define TCNTO4REGL(0x150044)#define TCNTB5REGL(0x150048)#define TCNTO5REGL(0x15004c)/ // //* IIC Registers*// // /#define IICCONREGL(0x160000)#define IICSTATREGL(0x160004)#define IICADDREGL(0x160008)#define IICDSREGL(0x16000c)/ // //* RTC Registers*// / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /#define RTCCONREGB(0x170040)#define RTCALMREGB(0x170050)#define ALMMIN#define ALMHOUR#define ALMDAY#define ALMMON#define ALMYEAR#define RTCRST#define BCDSEC#define BCDMIN#define BCDHOUR#define BCDDAY#define BCDDATE#define BCDMON#define BCDYEAR#define TICINTREGB(0xl70058)REGB(0x17005c)REGB(0x170060)REGB(0x170064)REGB(0x170068)REGB(0x17006c)REGB(0x170070)REGB(0x170074)REGB(0x170078)REGB(0x17007c)REGB(0x170080)REGB(0x170084)REGB(0x170088)REGB(0x17008c)/* Clock & Power Registers */#define PLLCON#define CLKCON#define CLKSLOW#define LOCKTIMEREGL(0x180000)REGL(0x180004)REGL(0x180008)REGL(0x18000c)/* Interrupt Controller Registers */#define INTCON#define INTPND#define INTMOD#define INTMSK#define I_PSLVREGL(0x200000)REGL(0x200004)REGL(0x200008)REGL(0x20000c)REGL(0x200010)#define I_CSLV#define I_CMST#define I_ISPR#define I_ISPC#define F_ISPR#define F_ISPCREGL(0x200018)REGL(0x20001c)REGL(0x200020)REGL(0x200024)REGL(0x200038)REGL(0x20003c)*//* LCD Controller Registers/ / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /#define LCDCON1REGL(0x300000)#define LCDCON2REGL(0x300004)#define LCDSADDR1REGL(0x300008)#define LCDSADDR2REGL(0x30000c)#define LCDSADDR3REGL(0x300010)#define REDLUTREGL(0x300014)#define GREENLUTREGL(0x300018)#define BLUELUTREGL(0x30001c)#define DP1_2REGL(0x300020)#define DP4_7REGL(0x300024)#define DP3_5REGL(0x300028)#define DP2_3REGL(0x30002c)#define DP5_7REGL(0x300030)#define DP3_4REGL(0x300034)#define DP4_5REGL(0x300038)#define DP6_7REGL(0x30003c)#define LCDCON3REGL(0x300040)#define DITHMODEREGL(0x300044)/* DMA Registers*// / / ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /#define ZDCONO#define ZDISRC0#define ZDIDES0#define ZDICNT0#define ZDCSRC0#define ZDCDES0#define ZDCCNT0#define ZDCON1#define ZDISRC1#define ZDIDES1#define ZDICNT1#define ZDCSRC1#define ZDCDES1#define ZDCCNT1#define BDCON0#define BDISRCO#define BDIDES0#define BDICNT0#define BDCSRC0#define BDCDES0#define BDCCNT0REGL(0x280000)REGL(0x280004)REGL(0x280008)REGL(0x28000c)REGL(0x280010)REGL(0x280014)REGL(0x280018)REGL(0x280020)REGL(0x280024)REGL(0x280028)REGL(0x28002c)REGL(0x280030)REGL(0x280034)REGL(0x280038)REGL(0x380000)REGL(0x380004)REGL(0x380008)REGL(0x38000c)REGL(0x380010)REGL(0x380014)REGL(0x380018)#define BDCON1#define BDISRC1#define BDIDES1#define BDICNT1#define BDCSRC1#define BDCDES1REGL(0x380020)REGL(0x380024)REGL(0x380028)REGL(0x38002c)REGL(0x380030)REGL(0x380034)#define BDCCNT1 REGL(0x380038)I_ISPC = (1<<(n))#define CLEAR_PEND_INT(n)#define INT_DISABLE(n) INTMSK 1= (lvv(n))#define HARD_RESET_NOW()#endif /* _ASM_ARCH_HARDWARE_H */Main.c#include vstdio.h>#include vunistd.h>#include vsys/types.h>#include #include vsys/ioctl.h>#include #include #include "s3c2410-adc.h"#define ADC_DEV "/dev/adc/Oraw"static int adc_fd = -1;static int init_ADdevice(void){if((adc_fd=open(ADC_DEV O_RDWR))v0){printf("Error opening %s adc device'n", ADC_DEV); return -1;}}static int GetADresult(int channel){int PRESCALE=OXFF;int data=ADC_WRITE(channel, PRESCALE);write(adc_fd, & data, sizeof(data));read(adc_fd, & data, sizeof(data));return data;static int stop=0;static void* comMonitor(void* data){getchar();stop=1;return NULL;}int main(void){int i;float d;pthread_t th_com;void * retval;//set s3c44b0 AD register and start AD if(init_ADdevice()vO)return -1;/* Create the threads */pthread_create (&th_com, NULL, comMonitor, 0);printf("\nPress Enter key exit!\n");while( stop==0 ){for(i=0; i<=2; i++){〃采样 0~2 路 A/D 值 d=((float)GetADresult(i)*3.3)/1024.0; printf("a%d=%8.4f\t",i,d);}usleep(1);printf("\r");}/* Wait until producer and consumer finish. */pthread_join(th_com, & retval);printf("\n"); return 0;}s3c2410-adc・h#ifndef _S3C2410_ADC_H_#define _S3C2410_ADC_H_ #define ADC_WRITE(ch, prescale) ((ch)vv16l(prescale))#define ADC_WRITE_GETCH(data) (((data)>>16)&0x7)#define ADC_WRITE_GETPRE(data) ((data)&Oxff)#endif /* _S3C2410_ADC_H_ */s3c2410.h_chip.h#define ADC_CTL_BASE0x58000000#define bADC_CTL(Nb)_REG(ADC_CTL_BASE + (Nb))/* Offset */#define oADCCON0x0。