s3c2440linux dac下怎么写外接dac的控制程序

Linxu S3C2440 LCD驱动 测试程序_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Linxu S3C2440 LCD驱动 测试程序
来源:Linux社区&
作者:gzliu_hit
主机:VM -
开发板:FL2440,linux-2.6.12
arm-linux-gcc:3.4.1
对应的LCD设备驱动参见:
#include&&unistd.h& &&
#include&&stdio.h& &&
#include&&fcntl.h& &&
#include&&linux/fb.h& &&
#include&&sys/mman.h& &&
#define&RED_COLOR565&&&&0x0F100 &&
#define&GREEN_COLOR565&&0x007E0 &&
#define&BLUE_COLOR565&&&0x0001F &&
int&main(void)&&
&&&&int&fd_fb&=&0;&&
&&&&struct&fb_var_screeninfo&&&
&&&&struct&fb_fix_screeninfo&&&
&&&&long&int&screen_size&=&0;&&
&&&&short&*fbp565&=&NULL;&&
&&&&int&x&=&0,&y&=&0;&&
&&&&fd_fb&=&open("/dev/fb0",&O_RDWR);&&
&&&&if&(!fd_fb)&&
&&&&&&&&printf("Error:&cannot&open&framebuffer&device.\n");&&
&&&&&&&&exit(1);&&
&&&&if&(ioctl(fd_fb,&FBIOGET_FSCREENINFO,&&finfo))&&
&&&&&&&&printf("Error&reading&fixed&information.\n");&&
&&&&&&&&exit(2);&&
&&&&if&(ioctl(fd_fb,&FBIOGET_VSCREENINFO,&&vinfo))&&
&&&&&&&&printf("Error&reading&variable&information.\n");&&
&&&&&&&&exit(3);&&
&&&&screen_size&=&vinfo.xres&*&vinfo.yres&*&vinfo.bits_per_pixel&/&8;&&
&&&&printf("%dx%d,&%dbpp,&screen_size&=&%d\n",&vinfo.xres,&vinfo.yres,&vinfo.bits_per_pixel,&screen_size&);&&
&&&&fbp565&=&(short&*)mmap(0,&screen_size,&PROT_READ&|&PROT_WRITE,&MAP_SHARED,&fd_fb,&0);&&
&&&&if&((int)fbp565&==&-1)&&
&&&&&&&&printf("Error:&failed&to&map&framebuffer&device&to&memory.\n");&&
&&&&&&&&exit(4);&&
&&&&if(vinfo.bits_per_pixel&==&16)&&
&&&&&&&&printf("16&bpp&framebuffer\n");&&
&&&&&&&&&&
&&&&&&&&printf("Red&Screen\n");&&
&&&&&&&&for(y&=&0;&y&&&vinfo.yres/3;&&y++)&&
&&&&&&&&{&&
&&&&&&&&&&&&for(x&=&0;&x&&&vinfo.xres&;&x++)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&*(fbp565&+&y&*&vinfo.xres&+&x)&=&RED_COLOR565;&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&&&
&&&&&&&&printf("Green&Screen\n");&&
&&&&&&&&for(y&=&vinfo.yres/3;&y&&&(vinfo.yres*2)/3;&y++)&&
&&&&&&&&{&&
&&&&&&&&&&&&for(x&=&0;&x&&&vinfo.&x++)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&*(fbp565&+&y&*&vinfo.xres&+&x)&=GREEN_COLOR565;&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&&&
&&&&&&&&printf("Blue&Screen\n");&&
&&&&&&&&for(y&=&(vinfo.yres*2)/3;&y&&&vinfo.&y++)&&
&&&&&&&&{&&
&&&&&&&&&&&&for(x&=&0;&x&&&vinfo.&x++)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&*(fbp565&+&y&*&vinfo.xres&+&x)&=&BLUE_COLOR565;&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&else&&
&&&&&&&&printf("warnning:&bpp&is&not&16\n");&&
&&&&munmap(fbp565,&screen_size);&&
&&&&close(fd_fb);&&
&&&&return&0;&&
}&&#include &unistd.h&
#include &stdio.h&
#include &fcntl.h&
#include &linux/fb.h&
#include &sys/mman.h&
#define RED_COLOR565
#define GREEN_COLOR565
#define BLUE_COLOR565
int main(void)
int fd_fb = 0;
struct fb_var_
struct fb_fix_
long int screen_size = 0;
short *fbp565 = NULL;
int x = 0, y = 0;
fd_fb = open("/dev/fb0", O_RDWR);
if (!fd_fb)
printf("Error: cannot open framebuffer device.\n");
// Get fixed screen info
if (ioctl(fd_fb, FBIOGET_FSCREENINFO, &finfo))
printf("Error reading fixed information.\n");
// Get variable screen info
if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &vinfo))
printf("Error reading variable information.\n");
// the size of the screen in bytes
screen_size = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
printf("%dx%d, %dbpp, screen_size = %d\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel, screen_size );
// map framebuffer to user memory
fbp565 = (short *)mmap(0, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
if ((int)fbp565 == -1)
printf("Error: failed to map framebuffer device to memory.\n");
if(vinfo.bits_per_pixel == 16)
printf("16 bpp framebuffer\n");
// Red Screen
printf("Red Screen\n");
for(y = 0; y & vinfo.yres/3;
for(x = 0; x & vinfo. x++)
*(fbp565 + y * vinfo.xres + x) = RED_COLOR565;
// Green Screen
printf("Green Screen\n");
for(y = vinfo.yres/3; y & (vinfo.yres*2)/3; y++)
for(x = 0; x & vinfo. x++)
*(fbp565 + y * vinfo.xres + x) =GREEN_COLOR565;
// Blue Screen
printf("Blue Screen\n");
for(y = (vinfo.yres*2)/3; y & vinfo. y++)
for(x = 0; x & vinfo. x++)
*(fbp565 + y * vinfo.xres + x) = BLUE_COLOR565;
printf("warnning: bpp is not 16\n");
munmap(fbp565, screen_size);
close(fd_fb);
测试结果,由上往下颜色分别为红、绿、蓝,图像有色差。
相关资讯 & & &
& (03月20日)
& (12/27/:30)
& (05/03/:33)
& (01月29日)
& (10/06/:08)
& (10/27/:33)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款当前位置:
一种基于ARM的多路同步的A/D和D/A设计
一种基于ARM的高精度多路同步的数据采集与输出控制系统的设计方法。设计选用德州仪器公司生产的AD芯片ADS8556和DA芯片DAC8574,分别采用SPI接口和IIC接口与ARM9芯片S3C2440连接,阐明其硬件设计与软件设计方法。系统可实现多路且同步、高速高精度的数据采集与输出控制功能。
  2.3 DAC8574的接口程序设计  DAC8574作为从机,S3C2440作为主机,根据高速模式传输协议编写DAC8574的接口程序。图4所示为设计的DAC8574接口程序的流程图。主机先产生一个开始状态,随后产生高速主机编码的串行数据00001XXX。从机设备不需要确认高速主机编码,但必须能够识别并改变自身内部设置以支持3.4Mbit/s的高速传输。主机产生一个重复开始状态,接着发送一个有效的从机地址字节,本设计的从机地址字节为,包括7位DAC8574的地址位读写控制位0(主机写入从机)。地址匹配的从机识别地址后产生确认信号。本设计将控制字节设置为,主机发送控制字节设置从机运行模式后,从机产生确认信号。随后,主机发送数据最高有效位MSB,从机产生确认信号,主机再发送数据最低有效位LSB,从机产生确认信号并开始数据更新,这样DAC8574就完成了一次数据接收与数模转换。之后主机可以继续向从机发送数据,最后主机产生停止状态结束当前的数据传输。  图4 DAC8574 工作程序流程图  本文论述了一种基于ARM的实时、高速、同步、高精度、多通道的数据采集与输出控制的设计方法。可以通过对程序的修改而改变其通道数、转换速率、传输速率,因而具有一定的灵活性。而基于ARM处理器设计的系统还具有成本低、功耗低、实时性能好、智能程度高、可靠性高、体积小、易扩展、功能强、开发周期短等优点,在、信息技术领域有着广阔的应用空间。
&&&&&&&&&&
责任编辑:Davis
免责声明:
本文仅代表作者个人观点,与
OFweek电子工程网
无关。其原创性以及文中陈述文字和内容未经本站证实,
对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅
作参考,并请自行核实相关内容。
邮箱/用户名:
忘记密码?
用其他账号登录: QQ
请输入评论
广东省/深圳市
四川省/成都市
广东省/深圳市
广东省/深圳市
广东省/深圳市
广东省/深圳市
北京市/海淀区
广东省/深圳市
广东省/深圳市
广东省/惠州市
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
《基于S3C2440和嵌入式Linux的输入输出设备驱动开发》.pdf70页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:168 &&
《基于S3C2440和嵌入式Linux的输入输出设备驱动开发》.pdf
你可能关注的文档:
··········
··········
青岛大学 硕士学位论文
基于S3C2440和嵌入式Linux的输入输出设备驱动开发 姓名:孙垂莲 申请学位级别:硕士 专业:计算机应用技术 指导教师:杨厚俊 座机电话号码 摘要 针对迅速发展的嵌入式产品市场,利用ARM处理器和嵌入式操作系统开发产品已 成为工程师的优选方案。本课题采用的移植平台是以$3C2440A微处理器为核心的 loader 本课题是vi QQ2440开发板,深入分析了引导程序Boot vi 和Linux内核的基本 原理,并具体实现两者在QQ2440开发板上的移植。本文还深入研究了输入输出设备 在嵌入式系统中的重要性,编写YLCD显示器、触摸屏和IIS音频流等输入输出设备 的驱动程序。 论文的主要研究内容包括: 构,各组成模块的功能、构成以及信号定义。 件系统是目前比较先进的yaffs系统,并制作成映像文件加载到内核来运行。 3 LCD显示器驱动程序:分析了LCD的显示接口以及NEC3.5英寸液晶显示器与 冲 的LCD显示驱动程序,并显示出清晰的画面。 4 触摸屏驱动程序:分析了触摸屏的工作原理和硬件设计方案,重点实现了
触摸屏的数据处理和校准。为使获得的触摸屏坐标点更加精确,基于触摸屏点坐标
的旋转和变相问题,提出了三点校准方法,这是本文的一个创新点。
动程序的编写,最终可实现数字化声音文件的播放和输出音频文件的混音处理。
关键词:嵌入式系统;ARM;vivi;Linux;IIS Abstract 、聊ththe of embedded useofARM rapiddevelopment productsmarket,the processors andembedded for hasbecomea of operatingsystemdevelopment
preferred program onthe asa usedthe current engineer.BasedQQ2440transplantplatform,which
popular themechanismsofthe Samsung$3C2440Aanalysis processor,in-depth Bootloader vivi and themtothe has Linux,finallytransplanted platform.nispaperresearchedthe of
正在加载中,请稍后...s3c2440的IIS应用——放音与录音
第2页_Linux编程_Linux公社-Linux系统门户网站
你好,游客
s3c2440的IIS应用——放音与录音
来源:Linux社区&
作者:jianping_shen
上面的程序可以实现简单的播放内存中固有音频数据的功能,下面的程序实现了录制一段音频数据,然后再播出的功能。我们用UART来控制录、放音:当s3c2440接收到0x51时录音,接收到0x55时停止录音,接收到0x66时放音。
……&& ……
#define L3C (1&&4)&&&&&&&&&&&&& //GPB4 = L3CLOCK
#define L3D (1&&3)&&&&&&&&&&&&& //GPB3 = L3DATA
#define L3M (1&&2)&&&&&&&&&&&&& //GPB2 = L3MODE
unsigned char record_buffer[1000000];&&&&&&&&&&&&&&&&&&&& //用于存放录制的音频数据
char stop,
//UART中断
void __irq uartISR(void)
&&&&&& rSUBSRCPND |= 0x1;
&&&&&& rSRCPND |= 0x1&&28;
&&&&&& rINTPND |= 0x1&&28;
&&&&&& ch=rURXH0;
&&&&&& switch(ch)
&&&&&& case 0x51:&&&&&&&&&&&&&&&&&&& //开始录音
&&&&&&&&&&&&& cmd=0x01;
&&&&&&&&&&&&&
&&&&&& case 0x55:&&&&&&&&&&&&&&&&&&& //停止录音
&&&&&&&&&&&&& stop=1;&&&&&&&&&&&&&&&&& //置退出录音标志
&&&&&&&&&&&&&
&&&&&& case 0x66:&&&&&&&&&&&&&&&&&&& //放音
&&&&&&&&&&&&& cmd=0x03;
&&&&&&&&&&&&&
&&&&&& rUTXH0=
……&& ……
//输入参数为数组,输出参数为所录制数据的字节长度
int record(unsigned char * buffer)
&&&&&& int count,i;
&&&&&& rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C); //L3开始传输: L3M=H, L3C=H
&&&&&& //配置UDA1341
&&&&&& WriteL3(0x14 + 2,1);&&&&&&&&&&& //状态模式(000101xx+10)
&&&&&& WriteL3(0x60,0);&&&&&&&&& //0,1,10, 000,0 : 状态0,复位
&&&&&& WriteL3(0x14 + 2,1);&&&&&&&&&&& //状态模式 (000101xx+10)
&&&&&& WriteL3(0x10,0);&&&&&&&&& //0,0,01, 000,0 : 状态0, 384fs,IIS,no DC-filtering
&&&&&& WriteL3(0x14 + 2,1);&&&& //状态模式 (000101xx+10)
&&&&&& WriteL3(0xa2,0);&&&&&&&&&& //1,0,1,0, 0,0,10 状态1
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //Gain of DAC 0 dB,Gain of ADC 6dB,ADC non-inverting,
//DAC non-inverting,Single speed playback,ADC-On DAC-Off
&&&&&& WriteL3(0x14 + 0,1);&&&& //DATA0 (000101xx+00)
&&&&&& WriteL3(0x7b,0);&&&&&&&&& //01,11 10,11 : Data0, Bass Boost 18~24dB, Treble 6dB
&&&&&& WriteL3(0xc4,0);&&&&&&&&&& //& : Extended addr(3bits), 100
&&&&&& WriteL3(0xf0,0);&&&&&&&&&& //111,1 00,00 : DATA0, Enable AGC, 00, input amplifier gain channel 2 (2bits)
&&&&&& WriteL3(0xc0,0);&&&&&&&&&& //& : Extended addr(3bits), 000&&&&&&&&&
&&&&&& WriteL3(0xe0,0);&&&&&&&&&& //111, 00000& : MA = 0dB
&&&&&& WriteL3(0xc1,0);&&&&&&&&&& //& : Extended addr(3bits), 001
&&&&&& WriteL3(0xe0,0);&&&&&&&&&& //111, 00000& : MB = 0dB
&&&&&&&&&&&&&
&&&&&& WriteL3(0xc2,0);&&&&&&&&&& //& : Extended addr(3bits), 010
&&&&&& WriteL3(0xf9,0);&&&&&&&&&& //111,1 10,11 : DATA0, MIC Amplifier Gain 27dB, input 1 X MA + input 2 X MB
&&&&&& //配置s3c2440的IIS寄存器
//预分频器为3,所以CDCLK=PCLK/(3+1)=16.928kHz
&&&&&& rIISPSR = 3&&5|3;
&&&&&& //无效DMA,输出空闲,预分频器有效
rIISCON& = (0&&5)|(0&&4)|(1&&3)|(0&&2)|(1&&1);&&&
&&&&&& //PCLK为时钟源,输入模式,IIS模式,每个声道16位,CODECLK=384fs,SCLK=32fs
rIISMOD = (0&&9)|(0&&8)|(1&&6)|(0&&5)|(0&&4)|(1&&3)|(1&&2)|(1&&0);
&&&&&& rIISFCON = (0&&14)|(1&&12);&&&&&&&&&& //输入FIFO正常模式,输入FIFO使能
&&&&&& count=0;
&&&&&& //开启IIS
&&&&&& rIISCON |= 0x1;
&&&&&& while(stop==0)
&&&&&&&&&&&&& if((rIISCON & (1&&6))==0)&&&&&&&&&&&&&& //检查输入FIFO是否为满
&&&&&&&&&&&&& {&&&&
&&&&&&&&&&&&&&&&&&&& //FIFO中的数据为16位,深度为32
&&&&&&&&&&&&&&&&&&&& //当输入FIFO为满时,一次性读取FIFO中的32个16位数据
&&&&&&&&&&&&&&&&&&&& for(i=0;i&32;i++)
&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& temp=rIISFIFO;
&&&&&&&&&&&&&&&&&&&&&&&&&&& record_buffer[count+2*i]=(unsigned char)
&&&&&&&&&&&&&&&&&&&&&&&&&&& record_buffer[count+2*i+1]=(unsigned char)(temp&&8);&&&
&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&& count+=64;
&&&&&&&&&&&&&&&&&&&& if(count&1000000)
&&&&&&&&&&&&&&&&&&&&&&&&&&& stop=1;&&&&&&&&&&&&&&&&& //当录制的数据超过数组长度时,退出
&&&&&&&&&&&&& }&
&&&&&& rIISCON=0;&&&&&&&&&&&&&&&& //关闭IIS
&&&&&&&&&&&&&&&&&&&&&& //返回录制数据长度
void Main(void)
……&& ……
&&&&&& //由于改变了PCLK,所以需要重新计算UART波特率因子
rUBRDIV0 = 36;
……&& ……
&&&&&& stop=0;
&&&&&& cmd=0;
&&&&&& play=0;
&&&&&& while(1)
&&&&&&&&&&&&& switch(cmd)
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&& case 0x01:&&&&&&&&&&&&&&&&&&& //录音
&&&&&&&&&&&&&&&&&&&&&&&&&&& bufferlength=record(record_buffer);
&&&&&&&&&&&&&&&&&&&&&&&&&&& play=1;&&&&&&&&& //置录音标志
&&&&&&&&&&&&&&&&&&&&&&&&&&& cmd=0;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&& case 0x03:&&&&&&&&&&&&&&&&&&& //放音
&&&&&&&&&&&&&&&&&&&&&&&&&&& if(play)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& playsound(record_buffer,bufferlength);
&&&&&&&&&&&&&&&&&&&&&&&&&&& else&&&&&&&&&&&&&&& //还没有录制音频数据
&&&&&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& while(!(rUTRSTAT0 & 0x2));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& rUTXH0 = 0
&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&& cmd=0;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&& }
应大家的要求,我把UDA1341的L3通信协议详细介绍一下。
顾名思义,L3就是line 3(3条线)的意思,它只有L3DATA(数据线:用于传输数据)、L3MODE(模式线:用于选择模式)、L3CLOCK(时钟线:用于传输时钟)。L3一共有两个模式:地址模式和数据传输模式,先传输地址模式数据,再传输数据模式数据。L3MODE为低时是地址模式,L3MODE为高时是数据传输模式。L3DATA和L3CLOCK相互作用,完成8位数据的传输,传输的顺序是先低位数据,再高位数据。
地址模式是用于选择设备和定义目标寄存器,在这种模式下,8位数据的含义是:高6位是设备地址(UDA1341的地址为000101),低两位是后面数据模式下寄存器的类型(00:DATA0,01:DATA1,10:STATUS)。只要没有再改变地址模式下的数据,则数据模式下的数据始终是传输到上一个地址模式所定义的寄存器内。
在传输数据模式下,STATUS是用于设置复位,系统时钟频率、数据输入模式、DC滤波等内容。DATA0分为直接寻址模式和扩展寻址模式,直接寻址模式是直接进行模式的控制,包括音量、静音等等,而扩展寻址模式是在直接寻址模式下先设置3位扩展地址,再在直接寻址模式下设置5位扩展数据。在DATA1下,可以读取到被检测峰值。至于具体的DATA0、DATA1、STATUS下,每一位数据具体的含义,还请自己查阅手册。2
相关资讯 & & &
& (03月20日)
& (12/27/:30)
& (05/03/:33)
& (01月29日)
& (10/06/:08)
& (10/27/:33)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
热热 发表于 热基于S3C2440和嵌入式Linux的扩展串口设计
作者:Icbuy
</a>" title="现场总线">现场总线" title="现场总线">现场总线等技术的广泛使用,串口通讯在各种场合的应用越来越广泛。在集中控制系统中,需要在多个串口间进行通信,而在一般计算机上,只有1~3个串口,为了实现对多点的控制,需要对串口进行扩展。
  ARM芯片是目前在嵌入式系统中应用比较广泛的一种芯片,由于可以运行操作系统,以及拥有包括LCD、串口通讯、网络通讯、存储芯片等大量外围接口芯片的支持,使得ARM广泛应用于检测、通讯、控制等领域。
  本文以核的作为微控制器,在TQ2440开发板进行串口扩展,利用开发板上的系统总线接口和通用输入输出接口分别与扩展串口相连,达到同时与多台串口设备并行通信的目标。
  1 硬件介绍
  1.1 异步通信芯片&&TL16C554A
  TL16C554A含有4路(Asynchronous Communications Element ACE),每路ACE均可接收外围设备的串行数据,并将其转换为并行数据供CPU使用,也可将CPU的并行数据转换为串行数据发送到外围设备。
  TL16C554A引脚如图1所示。各主要引脚的功能说明如下:A0&A2用于选择片内寄存器;D0&D7进行数据传输;IOR和IOW进行读写;CSA,CSB,CSC,CSD用于选定具体串口;XTAL1,XTAL2可接晶振或外部时钟信号;INTA,INTB,INTC,INTD为4个独立外部中断信号;RXA,RXB,RXC,RXD:串行接收数据;TXA,TXB,TXC,TXD:串行发送数据。
  1.2 系统总线接口、GPIO接口
  TQ2440开发板以S3C2440芯片作为控制器,主频400MHz,外扩64 M内存,256 M闪存,并集成了多种接口,本设计中使用开发板上的系统总线接口与GPIO(通用输入输出接口)和TL16c554A相连。
  1.2.1 系统总线接口
  本开发板上的系统总线接口中共包含8根地址线(A0~A6,A24),16根数据线(DATA0~DATA15),4个中断,4个片选等信号,该总线接口集成了IDE所需的所有引出点,方便用户扩展,接口电路如图2所示。
  1.2.2 GPIO接口
  GPIO是通用输入输出口的简称,本开发板带有一个40Pin 2.0 mm间距的GPIO接口,如图3所示。不仅包含很多富余的GPIO引脚,还包含了一些其他CPU引脚,如AIN0~AIN3,CLKOUT等。如SPI接口、I2C接口、LED1~LED4(实际就是GPB5~GPB8),它们其实也是GPIO,不过是以特殊功能接口来标称定义的,这些都可以通过相应的CPU寄存器来设置更改它们的用途。
  2 硬件设计
  在硬件设计中,将TQ2440开发板扩展口的地址线ADDR0,ADDR1,ADDR2与16C554A的A0,A1,A2直接相连,TL16C554A芯片A0,A1,A2的不同的组合代表芯片内不同的寄存器。
  在与TL16C554A的连接中,由于TL16C554A只有8位,只需TL16C554A的D0~D7和开发板的DATA0~DATA7相连。读写信号直接相连(开发板的nOE、nWE分别与串口的IOE、IOW直连)。由于16C554芯片启动要有一定的宽度的脉冲,可以从GPA 12输出一定的宽度的脉冲来完成。
  每片16C554A可以将数据总线上的数据和4个串行端口的数据进行相互的转化,两片16C554A芯片共有8个串行口,通过3根地址线ADDR4,ADDR5,ADDR24经过74LS138选择8个串口中的任意一个。
  因为方案采用中断方式,所以将NSEL置高位,即允许芯片中断。16C554A有INTA、INTB、INTC、IN TD4个中断线,第一片扩展串口与系统总线的EINT1,EINT2,EINT5,EINT6相连,第二片扩展串口与GPIO中的EINT11,EINT13,EINT15,EIN39中断相连,使得任一片芯片的任意的端口都能产生中断。
  S3C2440的A0,A1,A2,A4,A5,A24通过不同组合可以选择8个不同的端口。nGCS5与74LS138译码器片选脚相连,根据S3C2440对地址空间的定义,这样就确定了第一片16C554A扩展芯片4个端口的访问地址为0XXXX,第二片16C554A扩展芯片4个端口的访问地址为0XXXX,根据端口基地址就可以确定片内的各个寄存器地址。具体连接如图4所示。
  3 驱动程序移植
  软件设计主要是为设备编写驱动程序。设备驱动是介于硬件和操作系统之间的软件接口,主要功能包括:探测和初始化设备;从设备接收数据并提交给内核;从内核接收数据送到设备;检测和处理设备错误。
  串口驱动程序从上到下分为4层:终端设备层、行规程、串口抽象层、串口芯片层。其中,串口芯片层与具体的芯片相关,主要是向串口抽象层提供串口芯片所用的资源,还进行一些与芯片相关的设置。
  TL16C554A扩展串口芯片属于标准串口,内核的串口驱动程序对它支持它的驱动程序就是Linux内核代码中的driver/seria/8250.c.入口函数是serial8250_init,它用于向串口抽象层提供注册串口的物理信息。串口的物理信息主要有两类:访问地址和中断号。所以只要设置好这两类物理信息,就可以驱动扩展串口了,图5为驱动程序移植流程。
  3.1 构建扩展串口的数据结构
  串口的物理信息存储在内核源程序arch/arm/plats3c24xx/common-smdk.c中,所以主要工作是在commonsmdk.c源文件中增加三段代码:
  1)增加头文件
  源程序中要包含头文件linux/serial_8250.h,用于告诉编译器使用8250.c作为扩展串口的源程序;
  2)增加串口的物理信息
  在common-smdk.c文件中增加8个元素的structplat_serial8250_port结构数组,并加入数据项,如每个串口使用的物理地址和中断号等信息,使系统启动后能找到串口。下面以第1片TL16c554A的第1个串口CSA为例说明如何在源程序中添加数据结构:
  3)加入内核设备列表中
  把串口设备(s3c_deviee_8250代表TL16c550A芯片)加入到内核的platform_device结构中
  static struct platform_device_initdata*smdk_devs『』={ &s3c_device_8250,};
  3.2 增加开发板代码使串口可用
  主要修改drivers/serial/8250.c文件,使BANK5以8位的位宽访问TL16c554A芯片,并指定芯片的中断触发方式。
  1)增加头文件asm/areh-s3c2410/regs-mem.h,定位TL16c554A所在的地址空间;
  2)设置存储控制器的BANK5的位宽(8位)
  在serial8250_init(void)初始化函数中把存储控制器的位宽寄存器设为0X;
  3)指定中断触发方式
  因为TL160554A的中断信号INTA、INTB、INTC、INTD为高电平有效,所以需将INTA、INTB、INTC、INTD上升沿触发,在调用中断函数req-uest_irq前应设置中断标志为IRQF_TRIGGER_RISING。
  3. 3 增加内核配置项
  在内核源代码的driver/serial/Kconfig中增加config条目CONFIG_SERIAL_EXTEND_S3C24XX,内核编译时选定该选项可以把驱动程序编译进系统中。
  4 测试扩展串口
  测试的工作包括编译内核、在根文件系统中增加设备文件、修改系统初始化脚本、测试扩展串口几个步骤。图6为串口测试流程图。
  1)配置、编译内核
  配置内核时增加配置选项CONFIG_SERIAL_EXTEND_S3C24XX,执行&make uImage&命令,编译内核。
  2)修改根文件系统
  在Linux系统中通过设备文件来访问具体的物理设备,故使用mknod命令,增加ttyS0,ttyS1,&,ttyS7设备文件,分别对应两片TL16c554A的8个串口。命令格式如下:
  # mknod/dev/ttyS0 c 4 64
  3)修改配置文件
  在/etc/inittab配置文件中添加ttyS0::askfirat:-/bin/sh
  4)测试
  把第一个串口与主机相连,设置U-Boot的启动参数为:noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttyS0,重新启动开发板,就能在超级终端下看到linux系统启动信息了。
  5 结束语
  本文提供了在原有TQ2440开发板中扩展8个串口,采用中断服务的方案,提高了ARM9系统运行效率。在此基础上可以进一步扩大,将串口扩展到12个、16个或者更多。
继续阅读>>
热门关键词

我要回帖

更多关于 dac控制dcdc输出电压 的文章

 

随机推荐