搜档网
当前位置:搜档网 › 触摸屏驱动程序移植

触摸屏驱动程序移植

触摸屏驱动程序移植
触摸屏驱动程序移植

《课程设计成果说明书》规范要求

课程设计说明书是课程设计主要成果之一,一般在2000~3000字。

1.说明书基本格式

版面要求:打印时正文采用5号宋体,A4纸,页边距上、下、左、右均为2cm,行间距采用固定值20磅,页码底部居中。文中标题采用4号宋体加粗。

2.说明书结构及要求

(1)封面

(2)课程设计成绩评定表

(3)任务书(指导教师下发)

(4)摘要

摘要要求对内容进行简短的陈述,一般不超过300字。关键词应为反映主题内容的学术词汇,一般为3-5个,且应在摘要中出现。

(5)目录

要求层次清晰,给出标题及页次。最后一项为参考文献。

(6)正文

正文应按照目录所确定的顺序依次撰写,要求论述清楚、简练、通顺,插图清晰整洁。文中图、表及公式应规范地绘制和书写。

(7)参考文献

ADS1.2环境下移植触摸屏驱动到S3C2410

摘要

本次课程设计的内容是在ADS1.2环境下的触摸屏驱动移植到S3C2410。在设计开始前我们熟悉了ADS1.2集成调试软件的使用和ADS1.2环境下程序的烧写。并对软件和硬件的配置进行修改,之后我们将实验五ARM的I/O接口实验程序烧写到S3C2410当中,因为在对触摸屏程序进行仿真之前我们要确保触摸屏的端口地址与S3C2410端口的地址一致,否则触摸屏无法识别来自S3C2410的信息。

在做完了上述准备工作之后开始对触摸屏程序就行仿真检查程序是否有错误之处。在调试结束确定程序无误,开始着手对触摸屏程序进行修改,使其能够在uCOSII系统上运行。实验室中的μCOSII系统程序已经根据S3C2410做了修改,所以我们只需将μCOSII系统加载到ADS1.2中即可。程序修改结束后将其和LCD,μCOSII程序一起加载到ADS1.2上仿真,成功后将程序烧写到S3C2410芯片当中,并确定烧写成功即可。

关键字:ADS1.2;触摸屏;移植;LCD;

目录

第1章熟悉ADS软件的使用及硬件设置 (5)

1.1ADS软件使用说明 (5)

1.2ADS软件和硬件环境的设置 (6)

第2章μCOSII操作系统 (9)

2.1 μCOSII简介 (9)

2.2 μCOSII在S3C2410上的可移植 (9)

2.3主体移植过程 (10)

第3章图片代码生成 (11)

第4章触摸屏原理及其程序分析 (12)

4.1触摸屏原理 (12)

4.2触摸矫正原理 (12)

4.3触摸屏程序分析 (14)

第5章 LCD显示程序分析 (20)

第6章熟悉ADS环境下程序的烧写方法 (22)

6.1程序烧写步骤 (22)

6.2烧写时程序的修改和设置 (22)

第7章程序调试中出现的问题 (26)

第8章课程设计感想 (32)

[参考文献] (33)

第1章熟悉ADS软件的使用及硬件设置

1.1ADS软件使用说明

ARM ADS全称为ARM Developer Suite。是ARM公司推出的新一代ARM集成开发工具。现在ADS的最新版本是1.2,它取代了早期的ADS1.1和ADS1.0。

ADS由命令行开发工具,ARM时实库,GUI开发环境(Code Warrior和AXD),实用程序和支持软件组成。有了这些部件,用户就可以为ARM系列的RISC处理器编写和调试自己的开发应用程序了。

先介绍ADS提供的常用命令行开发工具:

armcc是ARM C编译器。这个编译器通过了Plum Hall C Validation Suite为ANSI C的一致性测试。armcc用于将用ANSI C编写的程序编译成32位ARM指令代码。

armlink是ARM连接器。该命令既可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接,生成一个可执行文件,也可以将多个目标文件部分链接成一个目标文件,以供进一步的链接。ARM链接器生成的是ELF格式的可执行映像文件。

armsd是ARM 和Thumb的符号调试器。它能够进行源码级的程序调试。用户可以在用C或汇编语言写的代码中进行单步调试,设置断点,查看变量值和内存单元的内容。

对相关一些术语的解释。

映像文件(image):是指一个可执行文件,在执行的时候被加载到处理器中。一个映像文件有多个线程。它是ELF(Executable and linking format)格式的。

段(Section):描述映像文件的代码或数据块。

RO:是Read-only的简写形式。

RW:是Read-write.的简写形式。

ZI:是Zero-initialized的简写形式。

输入段(input section):它包含着代码,初始化数据或描述了在应用程序运行之前必须要初始化为0的一段内存。

输出段(output section):它包含了一系列具有相同的RO,RW或ZI属性的输入段。域(Regions):在一个映像文件中,一个域包含了1至3个输出段。多个域组织在一起,就构成了最终的映像文件。

加载时地址:是指映像文件位于存储器(在该映像文件没有运行时)中的地址。

运行时地址:是指映像文件在运行时的地址。

-output file 这个选项指定了输出文件名,该文件可能是部分链接的目标文件,也可能是可执行映像文件。如果输出文件名没有特别指定的话,armlink将使用下面的默认:

如果输出是一个可执行映像文件,则生成的输出文件名为__image.axf;

如果输出是一个部分链接的目标文件,在生成的文件名为__object.o;

如果没有指定输出文件的路径信息,则输出文件就在当前目录下生成。如果指定了路径信息,则所指定的路径成为输出文件的当前路径。

1.2ADS软件和硬件环境的设置

打开ADS软件后加载文件,点击进行硬件环境设置,

图1.1 修改Post-linker

图1.2 选择CPU核

图1.3 选择CPU核

图1.4 修改RO、RW

图1.5 修改Image entry point

图1.6 修改Object/Symbol、Section

图1.7 修改Ourput format、Output file name

配置完毕以后,我们可以点击和分别进行编译或单步调试,下面列出编译结束的情况截图:

图1.8 编译情况说明图

程序编译后有警告(就是图上的)是正常情况,上图中的是错误情况,有错误时是没法得到镜像的。

第2章μCOSII操作系统

2.1 μCOSII简介

μCOSII是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。

μCOS 和μCOSII 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μCOSII嵌入到开发的产品中。严格地说μCOSII只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于μCOSII良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。

μCOSII目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。

2.2 μCOSII在S3C2410上的可移植

所谓移植,就是使这个实时内核能在某个微处理器上运行。为了方便移植,大部分的μCOSII代码是用c语言写的,但仍需要用c语言和汇编语言写一些与处理器相关的代码,这是因为μCOSII在读写处理器寄存器时只能通过汇编语言来实现。由于μCOSII在设计时就已经充分考虑了可移植性,所以μCOSII 的移植相对来说是比较容易的。

μCOSII的正常运行需要处理器平台满足以下要求:

a)处理器的C编译器能产生可重入代码。

b)用C语言就可以打开和关闭中断。

c)处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。

d)处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。

e)处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。

S3C2410处理器采用ARM920T内核,内部共有37个寄存器,其中R13通常用作堆栈指针,只要系统RAM空间允许,堆栈空间理论上没有限制。ARM处理器提供ARM指令和Thumb指令两种指令集,每种指令集都包含有丰富的指令对堆栈进行操作,可以随意的对处理器中的寄存器进行堆栈操作。根据堆栈生长方向的不同,可以生成4种不同的堆栈,分别是满递增、空递增、满递减(此移植中使用的是满递减方式)、空递减。芯片内集成5个定时时钟,任何一个都可以产生定时中断,满足第三条要求。ADS集成开发环境的内置编译器可以产生可重入代码,并且支持内嵌汇编,C环境中可任意的进行开关中断操作。综上所述uCOS II完全可以移植到S3C2410上运行。

2.3主体移植过程

1)把文件分为两类,其一是STARTUP目录下的系统初始化、配置等文件,其二是 COSII的全部源码,arch 目录下的3个文件是和处理器架构相关的。

2)设置os_cpu.h中与处理器和编译器相关的代码

typedef unsigned char BOOLEAN;

typedef unsigned char INT8U;

typedef signed char INT8S;

typedef unsigned int INT16U;

typedef signed int INT16S;

typedef unsigned long INT32U;

typedef signed long INT32S;

typedef float FP32;

typedef double FP64;

typedef unsigned int OS_STK;

typedef unsigned int OS_CPU_SR;

extern int INTS_OFF(void);

extern void INTS_ON(void);

#define OS_ENTER_CRITICAL() { cpu_sr = INTS_OFF(); }

#define OS_EXIT_CRITICAL() { if(cpu_sr == 0) INTS_ON(); }

#define OS_STK_GROWTH 1

3)用C语言实现与处理器任务相关的函数[OS_CPU_C.C]

OSTaskStkInit()

OSTaskCreateHook()

OSTaskDelHook()

OSTaskSwHook()

OSTaskStatHook()

OSTimeTickHook()

实际需要修改的只有OSTaskStkInit()函数,其它五个函数需要声明,但不一定有实际内容。OSTaskStkInit()函数由OSTaskCreate()或OSTaskCreateExt()调用,需要传递的参数是任务代码的起始地址、参数指针(pdata)、任务堆栈顶端的地址和任务的优先级,用来初始化任务的堆栈,初始状态的堆栈模拟发生一次中断后的堆栈结构。堆栈初始化工作结束后,OSTaskStkInit()返回新的堆栈栈顶指针,OSTaskCreate()或OSTaskCreateExt()将指针保存在任务的OS_TCB中。调用OSTaskStkInit()给任务做一个初始的任务上下文堆栈.

由于本实验箱自带了移植好的ucOS内核,所以我们不需要从零开始一步一步移植,然后我们把重点放在触摸屏驱动移植上面。

第3章图片代码生成

我们利用的是Image2LCD软件生成图片代码,其软件图标为具体使用过程如下:

图3.1 Image2LCD软件使用过程(1)

点击按钮,打开选择图片,

图3.2 Image2LCD软件使用过程(2)

点击保存即可生成图片代码。

第4章触摸屏原理及其程序分析

4.1触摸屏原理

触摸屏附着在显示器的表面,与显示器相配合使用,如果能测量出触摸点在屏幕上的坐标位置,则可根据显示屏上对应坐标点的显示内容或图符获知触摸者的意图。

触摸屏按其技术原理可分为五类:矢量压力传感式、电阻式、电容式、红外线式、表面声波式,其中电阻式触摸屏在嵌入式系统中用的较多。电阻触摸屏是一块 4层的透明的复合薄膜屏,最下面是玻璃或有机玻璃构成的基层,最上面是一层外表面经过硬化处理从而光滑防刮的塑料层,中间是两层金属导电层,分别在基层之上和塑料层内表面,在两导电层之间有许多细小的透明隔离点把它们隔开。当手指触摸屏幕时,两导电层在触摸点处接触。

触摸屏的两个金属导电层是触摸屏的两个工作面,在每个工作面的两端各涂有一条银胶,称为该工作面的一对电极,若给一个工作面的电极对施加电压,则在该工作面上就会形成均匀连续的平行电压分布。当给X方向的电极对施加一确定的电压,而Y方向电极对不加电压时,在X平行电压场中,触点处的电压值可以在Y+(或Y-)电极上反映出来,通过测量Y+电极对地的电压大小,通过A/D转换,便可得知触点的X坐标值。同理,当给Y电极对施加电压,而X电极对不加电压时,通过测量X+电极的电压,通过A/D转换便可得知触点的Y坐标。

4.2触摸矫正原理

我们通过触摸屏驱动读取到的XY坐标是AD转换的值,他与实际LCD的坐标是不同的。比如在LCD 上坐标为(50, 50)的像素点,AD采样值为(78, 540)。触屏校正的目的就是将AD采样的坐标转换为LCD上对应物理地址的坐标。由于我们使用的是电阻式触摸屏,由于触摸屏上的电场是均匀分布的,所以两者之间存在着线性关系。利用这个线性关系我们可以使用两点校正法和三点校正法等,下面就介绍一下本课程设计使用到的触屏校正原理。

1).两点校正法原理

由于存在线性关系,可以利用一次函数描述校正后的Xo和校正前Xad的关系

Xo = kX × Xad + bX

同理:Yo = ky × Yad + by

方法:1、先通过程序在LCD上画出两个十字光标,坐标中心点位D1、D2;

2、用触摸笔点击D1、D2,分别记录AD采样坐标值E1、E2;

如图4.1所示

图4.1 触摸点坐标

3、由上图可列出方程式并求得校正参数: kX 、bX 、ky 、Yad,这样程序即可使用这四个校正参数将AD采样坐标转换为LCD上的物理坐标。

程序实现:

由两点LCD物理坐标与触摸屏AD采样的坐标计算参数,代码如下:

//计算参数

tsKx = (float)(REC2_X1 - REC2_X2) / (xt[0] - xt[1]);

tsBx = (float)(REC2_X1 - tsKx*xt[0]);

tsKy = (float)(REC2_Y1 - REC2_Y2) / (yt[0] - yt[1]);

tsBy = (float)(REC2_Y1 - tsKy*yt[0]);

校正程序

rec_POS.x = (int)(tsKx*cur_POS.x + tsBx);

rec_POS.y = (int)(tsKy*cur_POS.y + tsBy);

这样转化好的坐标便保存在了rec_POS结构体中。

2).三点校正法原理

三点校正原理与两点校正原理有些不一样,在两点校正算法中认为:物理坐标的横坐标只是与AD 采样的横坐标存在线性关系、物理坐标的纵坐标只与AD采样的纵坐标存在线性关系。而三点校正算法中将物理坐标的纵坐标与AD采样的纵坐标和横坐标一起列出了一个表达式(横坐标同理)。在实际实验过程中发现三点校正法要比亮点校正法效果要好很多。

设LCD上每个点PD的坐标为[XD,YD],触摸屏上每个点PT的坐标为[XT,YT]。要实现触摸屏上的坐标转换为LCD上的坐标,需要下列公式进行转换:

XD=A×XT+B×YT+C

YD=D×XT+E×YT+F

因为其中一共有六个参数(A,B,C,D,E,F),因此只需要三个取样点就可以求得这六个参数。这六个参数一旦确定下来,只要给出任意触摸屏上的坐标点PT,代入这个公式,就可以得到它所对应的LCD上像素点的坐标PD。具体的求解过程就不细讲,只给出最终的结果。已知LCD上的三个取样点为:PD0,PD1,PD2,它们所对应的触摸屏上的三个点为:PT0,PT1,PT2。A,B,C,D,E,F这六个参数最终的结果都是一个分式,而且都有一个共同的分母,为:

K=(XT0-XT2)×(YT1-YT2)-(XT1-XT2)×(YT0-YT2)

那么这六个参数分别为:

A=[(XD0-XD2)×(YT1-YT2)-(XD1-XD2)×(YT0-YT2)] / K

B=[(XT0-XT2)×(XD1-XD2)-(XD0-XD2)×(XT1-XT2)] / K

C=[YT0×(XT2×XD1-XT1×XD2)+YT1×(XT0×XD2-XT2×XD0)+

YT2×(XT1×XD0-XT0×XD1)] / K

D=[(YD0-YD2)×(YT1-YT2)-(YD1-YD2)×(YT0-YT2)] / K

E=[(XT0-XT2)×(YD1-YD2)-(YD0-YD2)×(XT1-XT2)] / K

F=[YT0×(XT2×YD1-XT1×YD2)+YT1×(XT0×YD2-XT2×YD0)+

YT2×(XT1×YD0-XT0×YD1)] / K

程序实现:

1、计算六个参数,代码如下:

//计算参数

tsK = (float)(xt[0] - xt[2])*(yt[1] - yt[2]) - (xt[1] -xt[2])*(yt[0] - yt[2]);

tsA = (float)(REC3_X1 - REC3_X3)*(yt[1] - yt[2]) - (REC3_X2 - REC3_X3)*(yt[0] - yt[2]);

tsB = (float)(xt[0] - xt[2])*(REC3_X2 - REC3_X3) - (xt[1] -xt[2])*(REC3_X1 - REC3_X3);

tsC = (float)yt[0]*(xt[2]*REC3_X2 - xt[1]*REC3_X3) + yt[1]*(xt[0]*REC3_X3 –

xt[2]*REC3_X1) + yt[2]*(xt[1]*REC3_X1 - xt[0]*REC3_X2);

tsD = (float)(REC3_Y1 - REC3_Y3)*(yt[1] - yt[2]) - (REC3_Y2 - REC3_Y3)*(yt[0] - yt[2]);

tsE = (float)(xt[0] - xt[2])*(REC3_Y2 - REC3_Y3) - (xt[1] -xt[2])*(REC3_Y1 - REC3_Y3);

tsF = (float)yt[0]*(xt[2]*REC3_Y2 - xt[1]*REC3_Y3) + yt[1]*(xt[0]*REC3_Y3 -

xt[2]*REC3_Y1) + yt[2]*(xt[1]*REC3_Y1 - xt[0]*REC3_Y2);

校正代码如下:

rec_POS.x = (int)((tsA*cur_POS.x + tsB*cur_POS.y + tsC)/tsK);

rec_POS.y = (int)((tsD*cur_POS.x + tsE*cur_POS.y + tsF)/tsK);

这样转化好的坐标便保存在了rec_POS结构体中。

4.3触摸屏程序分析

触摸屏流程图(如图4.2):

1.触摸屏初始化程序

—**** 触屏初始化 ****

——参数: 无

——返回值: 1 成功

int TouchScreen_Init(void)

{

memset(&cur_POS, 0x00, sizeof(cur_POS));

new_pos = 0;

rADCDLY = 0x5000; //延时

rADCCON = (1<<14)|(ADCPRS<<6)|(7<<3)|(0<<2)|(0<<1)|(0); //设置ADC 控制寄存器; rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3); //设置成等待中断模式;

return 1;

} 触屏任务初始化

触屏是否按下触摸屏校正参数

初始化

读取触屏AD 坐标

并进行矫正

new_pos = 1cur_POS.p = 1

延时40ms

cur_POS.p = 0

new_pos == 1是否

图4.2 触摸任务流程图

2.触摸矫正参数程序

—*** 触屏矫正参数初始化 ****

—参数: 无

—返回值: 1 成功

int Rectify_Init(void)

{

#if(1 == TS_USE_REC) //2点矫正

//说明:屏幕会依次提示点击"+"

int xt[2],yt[2];

Set_Color(GUI_RED); //设置字体颜色

Set_Font (&CHINESE_FONT16); //转换字体格式

Disp_String (CN_start"请点十字"CN_end, LCD_X_SIZE/2 - 10, LCD_Y_SIZE/2); //

显示“请点

十字”

Set_Font (&GUI_Font8x16); //转换字体格式

Disp_String ("1", LCD_X_SIZE/2 - 10+62, LCD_Y_SIZE/2+1); //显示“1”

Draw_Cross(REC2_X1, REC2_Y1, 0xffffff); //画"+"字

Uart_Printf("Rectify_Init:disp_string start!!\n"); //

Uart_Printf("Rectify_Init:disp_string end!!\n");

Wait_Touch(&xt[0], &yt[0]); //等待触笔抬起

Set_Color(GUI_BLACK); //设置背景颜色为黑色

Fill_Rect(0,0,640,480);

Set_Color(GUI_RED); //设置字体颜色

Set_Font (&CHINESE_FONT16); //转换字体格式

Disp_String (CN_start"请点十字"CN_end, LCD_X_SIZE/2 - 10, LCD_Y_SIZE/2); // 显示“请点十字”

Set_Font (&GUI_Font8x16); //转换字体格式

Disp_String ("2", LCD_X_SIZE/2 - 10+62, LCD_Y_SIZE/2+1); //显示“2”

Draw_Cross(REC2_X2, REC2_Y2, 0xffffff); //画"+"字

Wait_Touch(&xt[1], &yt[1]); //等待触笔抬起

Set_Color(GUI_BLACK); //设置背景颜色为黑色

Fill_Rect(0,0,640,480);

//计算参数

tsKx = (float)(REC2_X1 - REC2_X2) / (xt[0] - xt[1]);

tsBx = (float)(REC2_X1 - tsKx*xt[0]);

tsKy = (float)(REC2_Y1 - REC2_Y2) / (yt[0] - yt[1]);

tsBy = (float)(REC2_Y1 - tsKy*yt[0]);

#if _TOUCHSCREEN_DEBUG_

Uart_Printf("Rectify: tsKx = %f, tsBx = %f\n", tsKx, tsBx);

Uart_Printf("Rectify: tsKy = %f, tsBy = %f\n", tsKy, tsBy);

#endif

#elif(2 == TS_USE_REC) //3点矫正

int xt[3],yt[3];

Set_Color(GUI_RED); //设置字体颜色

Set_Font (&CHINESE_FONT16); //转换字体格式

Disp_String (CN_start"请点十字"CN_end, LCD_X_SIZE/2 - 10, LCD_Y_SIZE/2); //显示“请点十字”

Set_Font (&GUI_Font8x16); //转换字体格式

Disp_String ("1", LCD_X_SIZE/2 - 10+62, LCD_Y_SIZE/2+1); //显示“1”

Draw_Cross(REC3_X1, REC3_Y1, 0xffffff); //画"+"字

Wait_Touch(&xt[0], &yt[0]); //等待触笔抬起

Set_Color(GUI_GREEN); //设置背景颜色为绿色

Fill_Rect(0,0,640,480);

Set_Color(GUI_RED); //设置字体颜色为红色

Set_Font (&CHINESE_FONT16); //转换字体格式

Disp_String (CN_start"请点十字"CN_end, LCD_X_SIZE/2 - 10, LCD_Y_SIZE/2); //显示“请点十字”

Set_Font (&GUI_Font8x16); //转换字体格式

Disp_String ("2", LCD_X_SIZE/2 - 10+62, LCD_Y_SIZE/2+1); //显示“2”

Draw_Cross(REC3_X2, REC3_Y2, 0xffffff); //画"+"字

Wait_Touch(&xt[1], &yt[1]); //等待触笔抬起

Set_Color(GUI_BLUE); //设置背景颜色为蓝色

Fill_Rect(0,0,640,480);

Set_Color(GUI_RED); //设置字体颜色为红色

Set_Font (&CHINESE_FONT16); //转换字体格式

Disp_String (CN_start"请点十字"CN_end, LCD_X_SIZE/2 - 10, LCD_Y_SIZE/2); //显示“请点十字”

Set_Font (&GUI_Font8x16); //转换字体格式

Disp_String ("3", LCD_X_SIZE/2 - 10+62, LCD_Y_SIZE/2+1); //显示“3”

Draw_Cross(REC3_X3, REC3_Y3, 0xffffff); //画"+"字

Wait_Touch(&xt[2], &yt[2]); //等待触笔抬起

Set_Color(GUI_BLACK); //设置背景颜色为黑色

Fill_Rect(0,0,640,480);

//计算参数

tsK = (float)(xt[0] - xt[2])*(yt[1] - yt[2]) - (xt[1] -xt[2])*(yt[0] - yt[2]);

tsA = (float)(REC3_X1 - REC3_X3)*(yt[1] - yt[2]) - (REC3_X2 - REC3_X3)*(yt[0] - yt[2]);

tsB = (float)(xt[0] - xt[2])*(REC3_X2 - REC3_X3) - (xt[1] -xt[2])*(REC3_X1 - REC3_X3);

tsC = (float)yt[0]*(xt[2]*REC3_X2 - xt[1]*REC3_X3) + yt[1]*(xt[0]*REC3_X3 - xt[2]*REC3_X1) + yt[2]*(xt[1]*REC3_X1 - xt[0]*REC3_X2);

tsD = (float)(REC3_Y1 - REC3_Y3)*(yt[1] - yt[2]) - (REC3_Y2 - REC3_Y3)*(yt[0] - yt[2]);

tsE = (float)(xt[0] - xt[2])*(REC3_Y2 - REC3_Y3) - (xt[1] -xt[2])*(REC3_Y1 - REC3_Y3);

tsF = (float)yt[0]*(xt[2]*REC3_Y2 - xt[1]*REC3_Y3) + yt[1]*(xt[0]*REC3_Y3 - xt[2]*REC3_Y1) + yt[2]*(xt[1]*REC3_Y1 - xt[0]*REC3_Y2);

/**/

#if _TOUCHSCREEN_DEBUG_

Uart_Printf("Rectify: tsK = %f\n", tsK);

Uart_Printf("Rectify: tsA = %f, tsB = %f, tsC = %f\n", tsA, tsB, tsC);

Uart_Printf("Rectify: tsD = %f, tsE = %f, tsF = %f\n", tsD, tsE, tsF);

#endif

#endif

return 1;

}

3.触摸轮询程序

—查询ADCDAT寄存器中的第15位,判断其是否按下或抬起

while(1)

{

if(!(rADCDAT0 & 0x8000)) //判断ADCDAT寄存器的第15位,若为按下

{

if(new_pos == 0) //若上一次产生坐标事件已经处理完成

{

Get_Location(); //获取采样坐标并校正

new_pos = 1; //将产生新坐标事件标志位置位

}

cur_POS.p = 1;

}

else

{

cur_POS.p = 0; //未按下

}

4.AD采样程序

—**** 更新AD采样xy值 ****

—参数: 无

—返回值: 无

static void Get_Location(void)

{

int i;

rADCTSC = (0<<8)|(0<<7)|(0<<6)|(1<<5)|(1<<4)|(1<<3)|(0<<2)|(1); //设置X位置测量

for(i = 0; i < LOOP; i++); //delay to set up the next channel

for(i = 0; i < 5; i++) //设置转换次数共5次;

{

rADCCON|=0x1; // X位置的AD转换开始;

while(rADCCON & 0x1); // 检测转换开始位;

while(!(0x8000&rADCCON)); // 检测ECFLG位,转换是否结束;

Pt[i]=(0x3ff&rADCDAT0);

}

Pt[5] = (Pt[0]+Pt[1]+Pt[2]+Pt[3]+Pt[4])/5; //5次采样取平均值

cur_POS.y = Pt[5]; //当前采样后的坐标;

rADCTSC = (0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(2); //设置Y位置测量 for(i = 0; i < LOOP; i++); //delay to set up the next channel

for(i = 0; i < 5; i++) //设置转换次数共5次;

{

rADCCON |= 0x1; // Y位置的AD转换开始;

while(rADCCON & 0x1); // 检测转换开始位

while(!(0x8000 & rADCCON)); // 检测ECFLG位,转换是否结束;

Pt[i]=(0x03ff & rADCDAT1);

}

Pt[5] = (Pt[0]+Pt[1]+Pt[2]+Pt[3]+Pt[4])/5;// 5次采样取平均值

cur_POS.x = Pt[5];

rADCTSC = (1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3); //设置成等待中断模式;#if _TOUCHSCREEN_DEBUG_

Uart_Printf("touch down:x = %d, y = %d\n", cur_POS.x, cur_POS.y);

#endif

Rectify_POS(); //校正

}

将驱动移植到64位Windows操作系统

将驱动移植到64位Windows操作系统 x64位操作系统和x32位操作系统的最大区别就是内存寻址方式的不同。而64位操作系统不支持32位的驱动程序,因为驱动程序和windows内核同处于一个地址空间中。这是移植32位驱动到64位驱动的最大原因。当然,64位驱动程序可以使用更大的分页内存,非分页内存及系统缓存。而且,你的设备从此就支持64位windows操作系统了。 1.在X64下的驱动程序安装 除了要把应用程序的32位驱动程序变成64位程序之外,驱动的安装程序和其它配置文件同样需要修改。也就是说,对于要在x64上运行的32位程序,它所依赖的驱动仍然需要是64位的。这些相关程序包括inf文件,device installers, class installers和co-installers。相关资料可查看MSDN Libarary DDK:Porting Your Driver to 64-Bit Windows。 所以,要改造应用程序的安装程序。方法是,让32位版的驱动安装为缺省安装选项,即用户插入安装光盘之后,依然运行32位安装程序。但当程序调用UpdateDriverForPlugAndPlayDevices返回值为ERROR_IN_WOW64时,这说明该安装程序正运行在64位Windows环境中。此时,这个安装程序应该调用CreateProcess函数来启动64位的安装进程。这个64位的安装进程通过调用64位驱动目录下的inf文件进行驱动安装。 2.驱动要支持32位IOCTL 某些IOCTL可能包含含有指针的结构,所以,要特别小心的区别对待它,必须根据被调用者解析结构或者输出结构。 有三种办法可以解决这个问题: 1.尽量避免使用IOCTL传递包含有指针的结构; 2.通过API IoIs32bitProcess()来判断上层调用者的程序类型; 3.在64位程序中采用新的IOCTL命令; 例子: IOCTL structure in header file typedef struct _IOCTL_PARAMETERS {

音频系统方案说明(新)

1.1.1音频系统 1.1.1.1需求分析 指挥中心是进行处突指挥工作的核心场所,其音频系统主要负责首长指挥、会议发言及扩声系统建设。保证指挥中心拥有均匀的声场覆盖。 指挥中心长约14.8米、宽约13.3米,房间高度约6米。需要容纳大约88人,整个指挥中心的房高比较高,要求会议中心的扩声可以均匀的覆盖整个房间。具有音视频播放功能的设备,在控制席位要配有监听音箱,以便操控人员进行双向通信。 具体建设内容如下: a)指挥中心安装一套音响设备; b)指挥中心配备一套32席会议系统; c)指挥中心配备2支无线手持话筒; d)控制室配备一台32路数字调音台、1对监听音箱、1个监听耳机; e)控制室配备一台蓝光DVD。 1.1.1.2系统设计 配置了32支发言单元,满足整个指挥中心大厅音频系统不同发言需求。在控制室控制席位配置了监听音箱,方便与会领导人员很好监听到整个指挥大厅会议实况。系统配置了音视频播放设备,满足指挥大厅音视频播放功能。 系统主扩声采用左右扩声的方式,参谋作业区采用吸顶音箱,确保整个指挥中心达到均匀的扩声效果。

1.1.1.3系统结构图 图错误!文档中没有指定样式的文字。-1音频系统连接图

1.1.1.4音箱布局图 图错误!文档中没有指定样式的文字。-2音箱布局图

1.1.1.5设计原则 a)可靠性。 系统应具备长期稳定工作的能力,所有选用设备均符合我国或国际上的质量及可靠性标准。 b)实用性。 系统应具备完成工程所要求功能的能力和水准,符合本工程实际需要和国内外有关规范的要求,并且实现容易,操作方便。 c)先进性。 系统是在满足可靠性和实用性要求前提下的最先进的系统。选用设备均选用国际、国内知名厂家近年来的最新产品或专利产品。 d)一致性。 系统应遵循开放系统的原则。 系统应依据技术指标的一致性、互换性选定设备,使系统具备良好的灵活性、兼容性、扩展性和可移植性。 e)经济性。 系统应满足性能与价格之比在同类系统和条件下达到最优,选择最佳性价比的设备。 系统以保证整个指挥大厅有良好的语言清晰度及均匀的声场分布,并且整个扩声系统能较好的解决背景声和人声兼容问题,使得声音更加逼真清晰为设计原则。 1.1.1.6设备安装 2支主扩声音箱安装在指挥中心大屏幕左右两侧,采用壁挂隐藏方式;6支吸顶音箱按图示位置安装在参谋作业区的上方,均采用隐藏方式安装;音箱安装时考虑与整体装修风格配合。 数字音频处理器安装在设备间机柜;调音台安装在控制室操作台上。具体安装高度待立面图确定后再次进行优化声场分析,确定合适位置。 1.1.1.7主要设备性能指标 1.1.1.7.1主扩音箱 1.1.1.8设备清单 表错误!文档中没有指定样式的文字。-1音频系统设备清单

8.1 Pioneer软件、设备驱动程序安装

8.1 Pioneer软件、设备驱动程序安装 8.1.1Pilot Pioneer软件简介 Pilot Pioneer是集成了多个网络进行同步测试的新一代无线网络测试及分析软件。Pilot Pioneer基于PC和Windows 8/7/XP平台,结合了鼎利公司长期无线网络优化的经验和最新的研究成果,除了具备完善的GSM、CDMA、EVDO、WCDMA、TD-SCDMA、LTE网络测试以及Scanner测试功能外,还支持数据后分析功能,如报表汇总,覆盖分析,干扰分析等。 8.1.2软件安装 1.电脑推荐配置 (1)硬件配置 CPU:Intel(R) Core(TM) i5;内存:2.00GB;显卡:SVGA,16位彩色以上显示模式;显示分辨率:1366*768;硬盘空间:100GB或以上;USB口数量:4个。 (2)操作系统 Windows 8(64/32位)/ Windows 7(64/32位)/ Windows XP(要求SP2或以上)。 2.安装步骤 (1)安装驱动程序及运行环境 运行PioneerDriversSetup.exe,该程序为Pilot Pioneer创建软件的运行环境以及测试前的准备。在安装时会出现如下的组件选择界面。 图8-1基础包组件选择 各个模块的说明如下表所示,用户可以根据实际需要选择安装。 表错误!文档中没有指定样式的文字。.1 Pioneer基础包组件说明 组件名称组件说明 Microsoft .net Framework4 微软.net 框架基础组件,初次使用必须安装。 HASP Dongle Driver Pioneer硬件加密锁驱动程序,初次使用必须安装。

u(boot中NANDflash的MTD驱动移植)-

u(boot中NANDflash的MTD驱动移植)- u-boot u-boot中的“与非”闪存的MTD驱动程序迁移移植了linux中的MTD 驱动程序源代码,以支持“与非”闪存擦除、刻录写入和读取驱动程序内存技术设备内存技术设备是Linux的一个子系统,用于访问闪存设备MTD的主要目的是简化新存储设备的驱动,并提供通用接口功能。MTD驱动可以支持CFI接口的非闪存驱动和非闪存驱动。众所周知,“与非”闪存的访问接口不像“非”闪存那样提供标准的CFI访问接口,但“与非”闪存制造商已经对不同品牌和型号的“与非”闪存芯片的访问接口制定了一些常规规定,如命令字、地址序列、命令序列、坏块标记位置、oob区域格式等。 值得注意的是,在工艺方面有两种类型的“与非”闪存:MLC和SLCMLC和SLC属于两种不同类型的NAND闪存SLC的全称是单级单元,即单级单元闪存,而MLC的全称是多级单元,即多级单元闪存。它们的区别在于,SLC的每个单元只能存储一位数据,而MLC 的每个单元只能存储两位数据,MLC的数据密度是SLC的两倍。就页容量而言,还有两种类型的与非:大页与非闪存(例如HY27UF082G2B)和小页与非闪存(例如K9F1G08U0A)这两种类型在页面容量、命令序列、地址序列、页面内访问和坏块识别方面非常不同,并且遵循不同的约定,因此在移植驱动程序时应该特别注意。在下,以大页面NAND flash: HY27UF082G2B为例,介绍NAND flash 的一些基本情况,然后介绍MTD驱动程序的基本结构和流程分析。

最后,介绍了在u-boot中迁移MTD驱动程序的详细步骤: 3 . 4 . 1)nandflash的一些基本信息 fl2400开发板上的NAND Flash芯片型号是现代HY27UF082G2B。英特尔于1988年首次开发了或非闪存技术。它最重要的特点是支持片上执行,彻底改变了EPROM和EEPROM主宰非易失性闪存世界的局面。然后,在1989年,东芝发布了NAND闪存结构,它具有较低的单位成本、较高的容量,并且可以像磁盘一样通过接口轻松升级。“或非”闪存更适合存储少量的关键代码和数据,而“与非”闪存更适合存储大量的高密度数据。 下表说明了非闪存与非闪存的区别:非闪存非闪存性能项目的容量通常为1~4MB,片上支持的最大容量为32MB 8MB~512MB。它可以直接在芯片上启动。它不受支持,需要驱动读取。只有三星芯片支持步进式引导加载器技术,其他芯片必须配备norflash以启动具有较高可靠性、较低位反转概率、常见位反转的引导加载器,并且必须采取验证措施。ECC椭圆曲线算法被推荐用于错误检查和恢复,这导致1/10的非闪存使得非闪存的管理和驱动程序写入更加复杂。存取接口与随机存取存储器和可编程只读存储器相同。地址线地址、数据和命令通过每个使能引脚区和输入/输出线与数据线分开。访问接口可分为地址、数据和命令以及串行访问。随机存取8K-64K块大小(擦除64K~128K单位)必须按顺序存取。擦除时间为5S,慢3毫秒,快速读写速度慢。快速读取,快速读取,刻录和写入可以快速擦除10 ~ 100,000次和100 ~ 100万次。主要用途保存代码和关键数据保存大

alsa 库移植与声音编程

在移植alsa-lib和alsa-utils之前首先要移植alsa-device,保证系统支持alsa 驱动,移好alsa-device后再dev/snd后出现相应的设备: ?controlC0 --> 用于声卡的控制,例如通道选择,混音,麦克风的控制等?midiC0D0 --> 用于播放midi音频 ?pcmC0D0c --〉用于录音的pcm设备 ?pcmC0D0p --〉用于播放的pcm设备 ?seq --〉音序器 ?timer --〉定时器 1. tar -xvf alsa-lib_1.0.23.orig.tar.bz2 (1)配置alsa-lib ./configure --host=arm-fsl-linux-gnueabi --prefix=/opt/ALSA/alsa_lib CC=/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/a rm-fsl-linux-gnueabi-gcc error: configure error required courses helper header not found 安装libncursesw5-dev。apt-get install libncursesw5-dev configure: error: panelw library not found ./configure加入--with-curses=ncurses /bin/bash: xmlto: command not found 安装xmlto /bin/rm: cannot remove `libtoolt': No such file or directory 强制make! (2) make

USB驱动移植教程

USB驱动移植教程 一.USB驱动框架 在Linux系统中,提供了主机侧和设备侧视角的USB驱动框架,这里,仅仅讲解主机侧角度看到的USB驱动框架。 从主机侧的角度而言,需要编写的USB驱动程序包括主机控制器驱动和设备驱动两类。USB主机控制器驱动程序控 制插入其中的USB设备,而USB设备驱动程序控制该设备如何作为设备与主机通信。在USB主机控制器驱动和USB 设备驱动之间还有一层叫USB核心层。USB核心负责USB驱动管理和协议处理工作,它通过定义一些数据结构、宏 和功能函数,向上为USB设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个 系统的USB设备信息,完成设备热插拔控制、总线数据传输控制等。说了那么多,无图无真相啊~~

Linux USB主机侧驱动总体框架 二.USB驱动移植步骤 1.S5PV210主机控制驱动的移植 USB主机控制器有3种规范,UHCI(Universal Host Controller Interface),这种规范主要是Intel、Via芯片公司提供支 持PC主板的;OHCI(Open Host Controller Interface),这种规范是微软提出来的,主要应用在非PC系统上的嵌入式 领域上的USB芯片;EHCI(Enhanced Host Controller Interface),这种后来为提高USB速度而提出的规范,它支持 最高速度为480Mbps。 在《S5PV210_UM_REV1.1》手册上搜索OHCI关键词,会发现下面一段话 这表明S5PV210这款CPU支持一个USB主机接口,同时支持EHCI和OHCI这两种规范,支持USB1.1和USB2.0规范,支持最高的外设传输速率为480Mbps。注意了,它并不支持USB3.0规范的USB设备,所以做测试的时候,千万不要拿USB3.0规范的USB设备去测试。 2.1移植ohci-s5p驱动 打开内核目录:driversusbhost,发现Linux系统提供了大量的主机控制器驱动,找遍所有平台,都没有找到ohci-s5p.c源码。很遗憾,3.8的内核没有提供S5PV210的USB HOST控制器驱动程序。最好验证有没有提供的办法就是, 烧写网蜂提供的第二版的uImage进去,然后找个U盘、或者鼠标插入Webee210开发板的USB HOST接口,看看串 口有没有打印什么信息,结果是不会有任何反应的。既然没有提供,这就需要我们自己来编写了,这下不好办了吧?

研华设备驱动程序编程使用介绍.pdf

研华设备驱动程序编程使用介绍 (本文件内容适用于所有数字量和模拟量采集卡) 这一部分包括了创建DA&C应用的基本信息,介绍了设备驱动程序文件的特点,讲解了基本的使用方法。 ?Visual C++ 5.0或更高版本 ?Visual Basic5.0或更高版本 ?Delphi4.0或更高版本 ?Borland C++ 5.0或C++ builder 1.0或更高版本 如果您正在使用的开发工具不是上面所述的几种,请仔细查阅您所使用的工具的文档,了解该工具如何调用动态连接库来创建应用程序。 Windows 95/98/NT/2000的32位DLL的函数库是动态连接,这就是说动态连接库并不直接编译到应用程序的可执行文件中,而只是将动态连接库的路径信息保存在可执行文件中。设备驱动程序只是在可执行程序执行过程中动态连接库被调用的时候才被连接到应用程序。 导入库(*.LIB)包含了它们它们的动态连接库定义的外部函数。它们隐含了动态连接库的位置。如何为您的应用程序引入动态连接库的路径信息,例如:是通过导入函数库还是通过函数声明的方法,取决于您所使用的编程工具。 使用函数原型是良好的编程习惯,这也是为什么设备驱动程序总是被打包成函数原型形式。安装工具为您选择的的开发工具拷贝正确的的原型文件。如果你不打算使用研华驱动程序支持的开发工具,那么您需要创建您自己的函数原型。 按照下面的步骤开始对研华的硬件设备编程应用: 这一部分我们推荐您采用研华的设备驱动程序结合微软的可视化平台来开发您的系统!研华设备驱动程序支持Visual C++ 5.0及其以上的版本。 要使用DA&C函数,需要按照下面的步骤使用研华驱动程序提供的DLL(动态连接库,Dynamic Linked Library) 1.象编写一般的Windows应用程序一样创建您的应用程序代码,在这些代码中可以象典型的函数调用一样调用研华驱动程序中提供的动态连接库中(DLL)的函数。 2.声明在您的程序中用到的函数,即:包含动态连接库(DLL)的头文件,该函数声明了所有的动态连接库中的函数,如下所示: #include “driver.h”

USB音频设备的设计与实现

USB音频设备的设计与实现 Design and Implementatio n of USB Audio Device (江西理工大学)吴君钦 (Jiangxi University of Science and Technology)Wu,Junqin 摘要:在介绍USB音频设备及其驱动程序结构的基础上,对USB Audio功能节点、USB Audio描述符、USB Audio请求、码流同步等设计重要方面进行了详细论述,提出了一种准同步USB码流速度匹配方法。使用准同步法,在一对USB ISO端点上,成功地实现了实时全双工USB音频通信功能,简化了时钟同步系统的设计。 关键词:USB音频,驱动程序, 准同步通信 Abstract:Introduce the structure of USB audio device and the structure of USB audio driver, discuss the function endpoints of USB audio peripheral, the USB audio descriptors,the USB audio request and the synch mechanism for USB audio stream detailly, bring out a new synch method called p lesiochronous communication for USB audio stream speed matching. U sing the p lesiochronous communication model , implement duplex audio communication functions on twain USB ISO endpoints, simplify the design of clock synch system . Key words:USB Audio; Device driver; P lesiochronous communication 1 引言 随着USB接口的推广和普及,越来越多的电脑外部设备采用USB接口, 在便携电脑中,有采用USB口扩展外设取代PCMCIA总线接口的趋势。特别是USB2.0的数据传输速率达480bps,USB实时同步数据传输模式适合于传送高速实时音视频数据流。MP3播放器、U盘等设备的流行,使USB接口的应用更为广泛,若能为这些便携设备增加USB音频功能,MP3等设备将成为语音聊天、网络电话等通信终端设备,大大拓展了应用领域,为此本文对USB音频外部设备的体系结构、工作原理及音频数据码流同步方法等设计的重要方面做详细论述。 2 USB设备与驱动程序 一般,USB外部设备包含一个USB设备控制器(USB peripheral Controller),设备控制器与通信另一端主控制器(USB Host Controller)的端点(Endpiont)管道(Pipe)之间的实现逻辑联接[1][2]。主机端驱动软件包含USB主控器驱动程序、设备驱动程序和应用软件三部分,主控制器驱动程序由操作系统提供支持,USB设备开发人员一般只需编写USB设备驱动程序和用户应用程序两部分,以实现特定的功能。但设备端所有功能的驱动软件必须由开发商完成,关于一般USB设备的设计请参阅文献[1][4][5]。 虽然USB音频流媒体设备各部分与标准USB设备各部件间的逻辑关系相一致,但USB 音频设备(USB Audio Device)有其殊性, 它的结构和实现机制更为复杂。图1是微软推荐的标准USB音频设备WDM驱动序各部分之间的逻辑层次关系[2]。图1 USB音视频流类驱动程序(AVStream Class Driver,USBAudio.sys)运行在USB主机控制器驱动驱动程序之上, 属于USB设备驱动程序范畴。图1黑体部分是与USB Audio有关的驱动和应用程序模块,而其他模块则与USB Audio无关。 如果硬件设备按照USB标准音频设备规范[3]设计,设备开发商无须编写特定的USB设备驱动程序,用户可直接使用Win98、Win2000或后续版本中绑定的标准USB Audio驱动程序,在其他操作系统中也有相应的标准驱动程序,节省了大量的开发时间,所以本文不详细讨论USB Audio驱动程序的设计问题,而重点讨论USB音频设备的设计。此外标准USB音频设备可以与现有的各种音频播放软件、VOIP通信软件实现无缝联接。

S3C2410 下LCD 驱动程序移植及GUI 程序编写

S3C2410下LCD驱动程序移植 及GUI程序编写 Write by llg 著作权所有:刘利国 如转载请告知作者 laoliu@https://www.sodocs.net/doc/bf58616.html, 并注明出处 https://www.sodocs.net/doc/bf58616.html, 1.为了不让大家觉枯燥,让朋友们更好的理解,我以一个实例来叙述S3C2410下一个驱动 程序的编写(本文的初始化源码以华恒公司提供的s3c2410fb.c为基础)及简单的GUI 程序的编写。 2.拿到一块LCD,首先要将LCD的各个控制线与S3C2410的LCD控制信号相接,当然, 电源也一定要接入了,否则不亮可别找我。另外需要注意以下几点: 1)背光:对于大部分的彩色LCD一定要接背光,我们才能看到屏上的内容; 2)控制信号:不同的LCD厂商对于控制信号有不同的叫法,S3C2410芯片手册也给出了一个信号的多个名称(图一),这就要看你们硬件工程师的功底了, 图一 S3C2410手册上给出的控制信号的名称及解释 这里我做一个简单的介绍: ?VFRAME:LCD控制器和LCD驱动器之间的帧同步信号。该信号告诉LCD 屏的新的一帧开始了。LCD控制器在一个完整帧显示完成后立即插入一个 VFRAME信号,开始新一帧的显示; ?VLINE:LCD控制器和LCD驱动器之间的线同步脉冲信号,该信号用于LCD 驱动器将水平线(行)移位寄存器的内容传送给LCD屏显示。LCD控制器在 整个水平线(整行)数据移入LCD驱动器后,插入一个VLINE信号; ?VCLK:LCD控制器和LCD驱动器之间的像素时钟信号,由LCD控制器送出的数据在VCLK的上升沿处送出,在VCLK的下降沿处被LCD驱动器采样; ?VM:LCD驱动器的AC信号。VM信号被LCD驱动器用于改变行和列的电压极性,从而控制像素点的显示或熄灭。VM信号可以与每个帧同步,也可以与 可变数量的VLINE信号同步。 3)数据线:也就是我们说的RGB信号线,S3C2410芯片手册上都有详细的说明,由于篇幅关系,在此不一一摘录,不过需要与硬件工程是配合的是他采用了哪种接线 方法,24位16位或其它。对于16位TFT屏又有两种方式,在写驱动前你要清楚

RTOS设备驱动向嵌人式Linux的移植

RTOS设备驱动向嵌人式Linux的移植 ——By Bill Weinberg,MontaVista Software,Inc. Linux暴风雨般占领了嵌入式系统市场。分析家指出,大约有1/3到1/2的32/64位新的嵌入式系统设计采用了Linux。嵌入式Linux已经在很多应用领域显示出优势,比如SOHO家庭网络和成像/多功能外设。在(NAS/SAN)存储,家庭数字娱乐(HDTV/PVR/DVR/STB),和手持设备/无线设备,特别是数字移动电话更获得大幅度发展。 嵌入式Linux新应用不会凭空从开发者的头脑中冒出来,大部分项目都是由成千上万行,甚至数百万行的代码组成。成千上百的嵌入式项目已经成功地将现有的其它平台的代码移植到Linux下,比如Wind River VxWorks和pSOS,VRTX,Nucleus和其它RTOS。这些移植工作有着重要的价值和现实意义。 到目前为止,大多数关于移植已有的RTOS应用到嵌入式Linux的文献,关注RTOS接口(API)、任务、调度模式以及怎样将他们映射到相应得用户空间去。同样重要的是,在I/O调用密集的嵌入式程序中如何将RTOS的硬件接口代码移植到更加规范的Linux设备驱动程序中去。 本文将概述几种常用的经常出现于现有嵌入式应用中的内存映射I/O方法。它们涵盖的范围从对中断服务例程的特殊使用及用户线程对硬件访问到出现于有些ROTS中的半规范化驱动程序模型。这对于移植RTOS代码到规范化的Linux设备启动程序具有一定启发作用,并且介绍了一些移植方法。特别地,本文会重点讨论RTOS和Linux中的内存映射,基于I/O调度队列的移植,将RTOS I/O重定义到Linux下的驱动程序和守护进程里。 RTOS I/O概念 “不规范”是描述大多数RTOS系统I/O的最佳词语。多数RTOS是针对较早的无MMU的CPU 而设计,所以忽略了内存管理部分,即使当MMU问世后也是这样:不区分物理地址和逻辑地址。大多数RTOS还全部运行在特权模式,虽然表面上看来是增强了性能。全部的RTOS应用和系统代码都能够访问整个地址空间、内存映射过的设备、以及其他I/O操作。这样,即使存在差别,也是很难把RTOS应用程序代码同驱动程序代码区分开来。 不规范的结构导致了I/O实现的特殊性。在很多情况下,缺乏设备驱动程序模型的认同。根据这种无层次的特性,回顾一下基于RTOS软件中使用的一些重要概念和习惯用法非常有指导意义。 内嵌的内存访问 上个世纪八十年代中期商业化的RTOS产品中,多数嵌入式软件都有一个对执行时间有严格需求的,采用I/O查询和中断服务例程的大循环。开发人员在项目采用RTOS和执行程序,主要为了加强并行性和多任务同步,绕开其它有碍实现该目标的程序结构。这样,即使RTOS提供了I/O调用形式化方法,嵌入式程序员继续使用直接的I/O操作: 1#define DATA_REGISTER0xF00000F5

RT-Thread驱动移植要点及AT25256驱动

RT-Thread 驱动移植要点 I/O管理模块为应用提供了一个对设备进行访问的通用接口,并通过定义的数据结构对设备驱动程序和设备信息进行管理。从系统整体位置来说I/O管理模块相当于设备驱动程序和上层应用之间的一个中间层。I/O管理模块实现了对设备驱动程序的封装:设备驱动程序的实现与I/O管理模块独立,提高了模块的可移植性。应用程序通过I/O管理模块提供的标准接口访问底层设备,设备驱动程序的升级不会对上层应用产生影响。这种方式使得与设备的硬件操作相关的代码与应用相隔离,双方只需各自关注自己的功能,这降低了代码的复杂性,提高了系统的可靠性。在RT-Thread中,设备也被认为是一类对象,被纳入对象管理器范畴。每个设备对象都是由基对象派生而来,每个具体设备都可以继承其父类对象的属性,并派生出其私有属性。下图即为设备对象的继承和派生关系示意图。 设备对象的继承和派生关系示意图 1. I/O设备管理控制块 struct rt device { struct rt object parent; /* 设备类型*/ enum rt device class type type; /* 设备参数及打开时参数*/ rt_uint16_t flag, open flag; /* 设备回调接口*/ rt_err_t (*rx indicate)(rt_device_t dev, rt_size_t size); rt_err_t (*tx complete)(rt_device_t dev, void* buffer); /* 设备公共接口*/ rt_err_t (*init) (rt_device_t dev); rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag); rt_err_t (*close) (rt_device_t dev); rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size); rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size); rt_err_t (*control)(rt_device_t dev, rt_uint8_t cmd, void *args); #ifdef RT_USING_DEVICE_SUSPEND rt_err_t (*suspend) (rt_device_t dev); rt_err_t (*resumed) (rt_device_t dev);

无法打开音频设备其它程序可能正在使用此设备

无法打开音频设备其它程序可能正在使用此设备。 RealPlayer 将使用计算机上的声卡进行录制和播放。如果声卡正被其它程序使用,或者RealPlayer 无法探测到声卡,您将收到此错误。 关闭其它正在使用声卡程序便可解决此问题。如果这样做仍不能解决问题,则您需要确定声卡是否工作正常,同时更新旧的声卡驱动程序。 解决方法1:关闭其它正在使用声卡程序便可解决此问题。 Windows 2000、XP: 1.在Windows 任务栏中,单击开始按钮,然后单击运行。 2.在对话框中输入taskmgr,然后单击确定。 3.单击应用程序选项卡。 4.单击程序使其高亮度显示,然后单击结束任务。 5.尝试重新播放内容。 Windows 98SE、ME: 1.在Windows 任务栏中,单击开始按钮,然后单击运行。 2.在对话框中输入taskmgr,然后单击确定。

3.单击程序,然后从Windows 菜单中选择结束任务。请勿结束Systray 和Explorer,因它们是系统运行文件。 4.然后尝试重新播放内容。 解决方法2:核查声卡和驱动程序是否安装正确。 在以下情况下,您可以访问您的计算机或声卡制造商的网站: ?“设备状态”消息提示设备未正常工作。 ?安装的驱动程序与声卡硬件不符。您需要重新安装正确的声卡驱动程序。 ?在设备管理器中看到一个黄色的!或红色的X。您需要重新安装声卡和(或)声卡驱动程序。 Windows 2000、XP: 1. 在Windows 任务栏中,依次单击开始按钮,然后依次选择设置、控制面板,最后单击系统(Windows XP:开始> 控制面板> 系统)。 2.单击硬件选项卡,然后单击设备管理器按钮。 3.单击声音、视频和游戏控制器旁的加号(+)。 4.用鼠标右键单击声卡,然后单击属性。 5.将窗口中的内容与声卡说明书中对声卡驱动程序的描述进行比较。 6.在常规常规选项卡中,确保设备状态的消息为“此设备当前工作正

SGTL5000声卡驱动移植

文库资料 ?2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 第1章 SGTL5000声卡驱动移植 本章导读 产品开发完毕后,因为某些原因,用到的一些芯片停产,这是一件很让人头疼的事情,可是却又不得不面对这样的尴尬情形。如果有兼容的芯片还好处理,如果没有兼容芯片,那就不得不进行改版设计,实现与原来相同的功能。 在EasyARM-i.MX283A 开发过程中就遇到了UDA1380芯片停产的情况,新方案准备采用SGTL5000来进行替换,本章就讲述SGTL5000声卡驱动在i.MX283平台上的移植过程。 1.1 背景交代 由于AP-283Demo 板上的UDA1380音频芯片即将停产,因此要用SGTL5000音频芯片代替。因此需要在EasyARM-i.MX283A 开发板的Linux 内核上实现该芯片的驱动。 EasyARM-i.MX283A 开发板的Linux 内核针对i.MX283处理器已经有了SGTL5000驱动代码,所以这里的工作主是使驱动正常工作起来。 SGTL5000在内核的音频解码/编码驱动源码文件在文件。 SGTL5000在内核的关于处理器平台的源码文件在目录。 1.2 电路原理图 需要制作一块SGTL5000的验证板,其核心电路图如图1.1所示。 图1.1 SGTL5000验证板核心电路图 SGTL5000是并没有使用晶振提供的时钟,而是用了处理器提供MCLK 信号作为系统时钟。 SGTL5000验证板的接口电路图如图1.2所示。SGTL5000是通过I 2S 接口与EasyARM-i.MX283A 开发板实现音频通信。SGTL5000验证板的接口是通过杜邦线与EasyARM-i.MX283A 开发板连接。

动态加载驱动和Linux内核移植

项目三:Linux内核移植 1.能力培养目标 ●了解嵌入式Linux内核的构成 ●掌握内核裁减定制的方法 ●掌握内核编译的方法 ●掌握内核烧写的方法 2.项目任务要求 (1)项目任务 Linux内核的裁剪、编译和烧写。 (2)项目来源及应用 对于较复杂的嵌入式系统项目,当硬件平台制作好之后,就需要向其移植操作系统,如果移植的是嵌入式Linux且为GUI应用,那么移植过程一般包含: 第一步,移植引导程序(Vivi、BLOB、uBoot等); 第二步,移植内核kernel;(本次实验内容) 第三步,移植根文件系统; 第四步,移植库文件,如QT库; 第五步,运行项目程序。 (3)功能需求 裁减一个可用的Linux内核 ●选择正确的处理器类型 ●使其支持网卡、小键盘、USB鼠标、声卡等设备 ●成功编译后烧写到目标机上 ●内核能正确加载运行 ●键盘驱动可用 (4)项目开发环境需求

3.项目预习 (1)了解项目目标、项目任务要求、项目设计和项目实施步骤。 (2)下载本次实验所需要的软件和代码。将3_kbd_test目录放到linux虚拟机的up-techpxa270cl目录下。 (3)完成内核裁剪及编译好内核映像,即完成第5大项中的步骤(4)-(5)。 (4)回答以下问题 如何能够在目标机上访问宿主机上的文件? 说明使用mount命令进行文件挂载的方法。 说明mount命令执行不成功可能的原因和解决方法。 说明本实验所使用的Linux内核版本。 说明Linux内核裁减定制的方法。 4.项目设计 4.1选择Linux内核裁减方法 Linux内核的裁减配置的三种命令: 1、make config:命令行模式,一行一行的配置,不推荐使用。 2、make menuconfig:大多人熟悉的menuconfig菜单。 3、make xconfig:基于QT图形化配置,菜单结构清晰。 所有内核裁减配置过程,都是通过Config.in(2.4内核)或Kconfig(2.6内核)经由不同脚本解释器产生.config配置文件。

USB音频设备类的音频信号同步解决方案

USB音频设备类的音频信号同步解决方案 本文针对使用USB_Audio_Class进行语音设备设计时需要解决的音频信号同步问题进行了介绍,并给出了相应的解决方法和部分源代码。 引言 USB总线协议经历了从USB1.1到USB2.0再到目前的USB OTG(USB On-The-Go)的发展过程,在USB不断发展完善的同时,越来越多的USB产品大量上市。现在的PC机通过USB Hub 设备和多个USB控制器,能同时支持扩展的USB设备已经达到数百个。 在USB总线传输中,任何一次USB的数据传输都必须由主机来发起和控制,所有的USB 外设都只能和主机建立连接,任何两个外设之间或者两个主机之间无法直接通信。目前,扮演主机角色的大多是个人电脑(PC)。 USB协议制定时,为了方便不同设备的开发商基于USB进行设计,定义了不同的设备类来支持不同类型的设备。现在市场上的USB产品,通过调查会发现它们主要应用了以下设备类: USB_DEVICE_CLASS_HUMANINTERFACE键盘、鼠标等 USB_DEVICE_CLASS_STORAG U盘、活动硬盘、数码相机等 USB_DEVICE_CLASS_PHYSICAL_INTERFACE力回馈游戏杆、方向盘等 USB_DEVICE_CLASS_POWER风扇、LED台灯、手机充电等 USB_DEVICE_CLASS_PRINTER打印机 从市场上看,虽然在USB标准中定义了USB_DE-VICE_CLASS_AUDIO,但是很少有此类设备问世。目前称为USB音箱的设备,大都使用USB_DEVICE_CLASS_POWER,仅仅将USB接口作为电源使用。信号仍然需要3.5mm立体声音频线连接使用,连接相对复杂。这样没有体现USB设备连接简单,操作方便的优势,且采用模拟信号传送会产生一定的信号失真,影响音质。 本文为了设计实现一个完全基于USB协议的USB_DEVICE_CLASS_AUDIO设备,采用一根USB连接线,在设备中不同的端点(endpoint)实现音频信号的输入,输出包括相关按键控制,并重点讨论如何解决由于USB特殊的总线拓扑结构造成的信号同步问题。 1USB_DEVICE_CLASS_AUDIO介绍 为简化USB设备的开发过程,USB提出了设备类的概念。其中的音频设备类(USB_DEVICE_CLASS_AU-DIO)是目前为止使用比较少的类型。

linux视频驱动移植

V4L2视频驱动的移植与应用 V4L2(video for linux) 可以支持多种设备,它可以有以下5种接口: 1、视频采集接口(video capture interface):这种应用的设备可以是高频头或者摄像头.V4L2的最初设计就是应用于这种功能的.下面也是着重讲解这种应用; 2、视频输出接口(video output interface):可以驱动计算机的外围视频图像设备——像可以输出电视信号格式的设备; 3、直接传输视频接口(video overlay interface):它的主要工作是把从视频采集设备采集过来的信号直接输出到输出设备之上,而不用经过系统的CPU; 4、视频间隔消隐信号接口(VBI interface):它可以使应用可以访问传输消隐期的视频信号; 5、收音机接口(radio interface):可用来处理从AM或FM高频头设备接收来的音频流; V4L2驱动的主要功能是使程序有发现设备的能力和操作设备.它主要是用过一系列的回调函数来实现这些功能.像设置高频头的频率,帧频,视频压缩格式和图像像参数等等. 一、V4L2的移植 V4L2提供了三种不同的API来传输外围设备和用户空间的数据。下面就vivi(drivers/media/video/vivi.c)来讲解一个V4L2驱动的编写。注意它是一个虚拟的设备驱动,没有与实际的硬件打交道。 1、分析几个重要数据结构: vivi.c包含头文件v4l2-device.h和v4l2-ioctl.h,其中v4l2-device.h中包含了v4l2-subdev.h,v4l2-subdev.h中又包含了v4l2-common.h,v4l2-common.h中包含了v4l2-dev.h。 在v4l2-dev.h中定义了结构体video_device和v4l2_file_operations; 在v4l2-ioctl.h中定义了结构体v4l2_ioctl_ops; 在v4l2-device.h中定义了结构体v4l2_device; 1) vivi_fops static const struct v4l2_file_operations vivi_fops = { .owner = THIS_MODULE, .open = vivi_open, .release = vivi_close, .read = vivi_read, .poll = vivi_poll, .ioctl = video_ioctl2, /* V4L2 ioctl handler */ .mmap = vivi_mmap, }; 2) vivi_ioctl_ops static const struct v4l2_ioctl_ops vivi_ioctl_ops = { .vidioc_querycap = vidioc_querycap, .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,

RTL8188CUS驱动程序移植笔记

RTL8188CUS驱动程序ARM9移植笔记 移植背景 本人于2015年入手一块周公的AWorks Easy ARM开发板,这块开发板主控为IMX293 ARM9内核,使用的操作系统为Linux 2.35。前段时间入手了一块全志H3的板子,这个板子带有WiFi网卡,可惜到手时官方并没有完成驱动程序的移植。由于使用的网卡为RTL8189FTV,该芯片的驱动程序源码在网上怎么都找不到,折腾了几天未果,就从X宝上买了块USB无线网卡,主控为RTL8188CUS,之所以买这块网卡是因为官网有这块网卡的驱动,并且我在本机Ubuntu15.04系统中找到了该网卡的内核模块,所以我相信不管怎么样,它都是可以在linux系统下驱动起来的。 在折腾了两天,各种摸索的情况下终于把这块网卡在ARM9的板子上驱动起来了。下面就我这次移植过程做个笔记,其中也包括近期的学习总结 WiFi模块

系统内核配置 内核只能编译一次,内核模块要单独编译,否则版本字符串两者配不上就导致内核模块加载不成功。 源码的配置 驱动程序测试 1)通过网线连接至计算机,把计算机与开发板的IP地址设置为同一个网段 计算机IP地址:192.168.1.12 开发板IP地址:192.168.1.100 2)开发板与计算机直接通过NFS连接并把驱动模块拷贝到开发板 3)加载内核模块

出现如下如下信息则加载成功 rtw_macaddr_cfg MAC Address = 00:13:ef:60:06:19 bDriverStopped:1, bSurpriseRemoved:0, bup:0, hw_init_completed:0 _rtw_drv_register_netdev, MAC Address (if1) = 00:13:ef:60:06:19 usbcore: registered new interface driver rtl8192cu 4)查看我们的USB无线网卡是否被系统激活 执行:ifconfig 发现只有一个网卡,并没有出现我们的USB无线网卡。 执行:ifconfig -a 出现了wlan0 就是我们的无线网卡,接下来激活它。 执行:ifconfig wlan0 up 执行:ifconfig可以看到无线网卡已经被激活了。 5)扫描AP热点 执行:iwlist wlan0 scan | grep ESSID

相关主题