第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · web viewj24管脚 功能...

210
嵌入式 Linux&ARM9 教学实验指导书 嵌入式 LINUX & ARM9 教学实验指导书

Upload: others

Post on 13-Mar-2020

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

嵌入式 LINUX & ARM9

教学实验指导书

Page 2: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第一章 建立实验开发环境.........................................................................................................- 7 -1.1硬件和软件需求............................................................................................................- 7 -1.2 安装Windows和 linux双系统......................................................................................- 7 -1.2 安装 Linux 服务器系统.................................................................................................- 8 -1.4 安装 arm-linux交叉编译器...........................................................................................- 8 -1.5 配置 linux内核....................................................................................................- 9 -1.6 配置串口控制端................................................................................................- 10 -

1.6.1 Linux环境下配置.............................................................................................- 10 -1.6.2 Windows环境配置...........................................................................................- 11 -

第二章 使用开发环境...............................................................................................................- 13 -2.1 应用程序开发下载调试和执行..................................................................................- 13 -

2.1.1编辑应用程序源文件.......................................................................................- 13 -2.1.2 编辑应用程序Makefile....................................................................................- 14 -2.1.3 编译应用程序...................................................................................................- 14 -2.1.4 下载应用程序...................................................................................................- 14 -2.1.5 执行应用程序...................................................................................................- 18 -2.1.6 远程调试应用程序 (仅 linux环境下)..............................................................- 18 -

2.2 驱动程序应用程序开发下载和使用..........................................................................- 28 -2.2.1 编辑Makefile文件...........................................................................................- 28 -2.2.2 加载和卸载驱动程序到内核...........................................................................- 28 -

2.3下载内核与文件系统和 BLOB程序..........................................................................- 28 -2.4 修复系统......................................................................................................................- 30 -

第三章 ARM试验箱说明.........................................................................................................- 31 -3.1 EMOTION (ARM9 LINUX) 教学实验系统..............................................................- 31 -

3.1.1 主要功能描述...................................................................................................- 31 -3.1.2 调试电缆...........................................................................................................- 32 -3.1.3 电源...................................................................................................................- 32 -3.1.4 跳线...................................................................................................................- 33 -3.1.5 接插件...............................................................................................................- 33 -3.1.6 LED显示..........................................................................................................- 34 -

3.2.EMOTION ARM9 LINUX 教学实验系统详细设计资料.......................................- 34 -3.2.1 内存映像...........................................................................................................- 35 -3.2.2 GPIO使用情况.................................................................................................- 36 -3.2.3 中断定义...........................................................................................................- 37 -3.2.4 MC9328MX1微处理器....................................................................................- 37 -3.2.5 SDRAM.............................................................................................................- 37 -3.2.6 FLASH..............................................................................................................- 37 -3.2.7 Clocks................................................................................................................- 38 -3.2.8 System set..........................................................................................................- 38 -3.2.9 JTAG接口........................................................................................................- 38 -3.2.10 UART1接口...................................................................................................- 39 -3.2.11 Audio CODEC接口........................................................................................- 39 -

Page 3: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书3.2.12 系统资源接口.................................................................................................- 40 -3.2.13 10-BaseT 以太网卡......................................................................................- 45 -3.2.14 LCD显示模块.............................................................................................- 46 -3.2.15 4x4键盘模块...............................................................................................- 48 -3.2.16 LED显示模块..............................................................................................- 49 -3.2.17 开关量输入模块..........................................................................................- 50 -3.2.18 信号源功能模块............................................................................................- 50 -3.2.19 A/D模数转换模块.........................................................................................- 52 -3.2.20 D/A数模转换模块........................................................................................- 53 -3.2.21 RS-232通讯模块...........................................................................................- 54 -3.2.22 Slave USB接口..............................................................................................- 55 -3.2.23 功能扩展接口................................................................................................- 56 -

3.3 实验开发系统的软件组织结构..................................................................................- 57 -第四章 内核模块实验...............................................................................................................- 58 -

4.1 实验目的......................................................................................................................- 58 -4.2 系统资源配置..............................................................................................................- 58 -4.3 实验原理......................................................................................................................- 58 -4.4 实验内容......................................................................................................................- 58 -4.5 实验步骤......................................................................................................................- 58 -

第五章 开关量实验...................................................................................................................- 60 -5.1 实验目的......................................................................................................................- 60 -5.2 系统资源配置..............................................................................................................- 60 -5.3 实验原理......................................................................................................................- 60 -

5.3.1 GPIO的原理.....................................................................................................- 60 -5.3.2 硬件原理...........................................................................................................- 61 -5.3.3软件实现原理...................................................................................................- 61 -

5.4 实验内容......................................................................................................................- 61 -5.5 实验步骤......................................................................................................................- 62 -

第六章 键盘实验.......................................................................................................................- 63 -6.1 实验目的......................................................................................................................- 63 -6.2 系统资源配置..............................................................................................................- 63 -6.3 实验原理......................................................................................................................- 63 -

6.3.1 键盘实现原理...................................................................................................- 63 -6.3.2 键盘设备驱动程序和应用程序的设计...........................................................- 64 -

6.3 实验内容......................................................................................................................- 64 -6.4 实验步骤......................................................................................................................- 64 -

第七章 A/D实验.......................................................................................................................- 66 -7.1 实验目的......................................................................................................................- 66 -7.2 系统资源配置..............................................................................................................- 66 -7.3 实验原理......................................................................................................................- 66 -

7.3.1模/数转换原理..................................................................................................- 66 -7.3.2 软件实现原理...................................................................................................- 69 -

7.4 实验内容......................................................................................................................- 69 -7.5 实验步骤......................................................................................................................- 69 -

Page 4: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书第八章 D/A实验.......................................................................................................................- 71 -

8.1 实验目的......................................................................................................................- 71 -8.2 系统资源配置..............................................................................................................- 71 -8.3 实验原理......................................................................................................................- 71 -

8.3.1 D/A转换原理...................................................................................................- 71 -8.3.2 DAC硬件原理图:..........................................................................................- 74 -8.3.3 软件设计原理和框架.....................................................................................- 74 -

8.4 实验内容......................................................................................................................- 74 -8.5 实验步骤......................................................................................................................- 75 -

第九章 LCD实验......................................................................................................................- 76 -9.1 实验目的......................................................................................................................- 76 -9.2 系统资源配备..............................................................................................................- 76 -9.3 实验原理......................................................................................................................- 76 -

9.3.1 LCD显示原理..................................................................................................- 76 -9.3.2 MX1对液晶屏接口支持..................................................................................- 77 -9.3.3灰度显示原理...................................................................................................- 77 -9.3.4 彩色显示原理...................................................................................................- 78 -9.3.5 MX1片内 LCD控制器操作............................................................................- 78 -9.3.6 EM-ARM9的液晶显示系统............................................................................- 81 -

9.4 实验内容......................................................................................................................- 85 -9.5 实验步骤......................................................................................................................- 85 -

第十章 触摸屏实验...................................................................................................................- 87 -10.1. 实验目的...................................................................................................................- 87 -10.2. 系统资源配备...........................................................................................................- 87 -10.3. 实验原理...................................................................................................................- 87 -

10.3.1 触摸屏硬件原理.............................................................................................- 87 -10.3.2 ASP的编程模式..........................................................................................- 88 -10.3.3 软件实现原理.................................................................................................- 89 -10.3.4 关于 PAD........................................................................................................- 90 -

10.4 实验内容....................................................................................................................- 91 -10.5 实验步骤....................................................................................................................- 91 -

十一章 音频实验.......................................................................................................................- 92 -11.1 实验目的....................................................................................................................- 92 -11.2 系统资源配置............................................................................................................- 92 -11.3 实验原理....................................................................................................................- 92 -

11.3.1 cs4340的原理和作用.....................................................................................- 92 -11.3.2 MX1与 CS4340的接口以及 CS4340驱动的作用........................................- 94 -11.3.3 MP3播放的实现.............................................................................................- 94 -

11.4 实验内容....................................................................................................................- 95 -11.5 实验步骤....................................................................................................................- 95 -

第十二章 以太网实验...............................................................................................................- 96 -12.1 实验目的....................................................................................................................- 96 -12.2系统资源配备:........................................................................................................- 96 -12.3 实验原理....................................................................................................................- 96 -

Page 5: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书12.3.1硬件原理.........................................................................................................- 96 -12.3.2驱动程序实现原理.........................................................................................- 97 -

11.4 实验内容....................................................................................................................- 97 -11.5 实验步骤....................................................................................................................- 97 -

第十三章 USB实验................................................................................................................- 100 -13.1 实验目的..................................................................................................................- 100 -13.2 系统资源配置..........................................................................................................- 100 -13.3 实验原理..................................................................................................................- 100 -

13.3.1 USB介绍......................................................................................................- 100 -13.3.2 USB原理......................................................................................................- 101 -13.3.3 USB设备的工作原理...................................................................................- 102 -13.3.4 USB控制器..................................................................................................- 102 -13.3.5 USB存储设备软件原理...............................................................................- 103 -

13.4 实验内容..................................................................................................................- 104 -13.5 实验步骤.................................................................................................................- 104 -

第十四章 内核剪裁和文件系统创建实验.............................................................................- 105 -14.1 实验目的..................................................................................................................- 105 -14.2 系统资源配备..........................................................................................................- 105 -14.3 实验原理..................................................................................................................- 105 -

14.3.1 内核剪裁.......................................................................................................- 105 -14.3.2 创建文件系统...............................................................................................- 106 -14.3.3 实验内容.......................................................................................................- 106 -14.3.3 实验步骤.......................................................................................................- 106 -

第十五章 CAN总线实验.......................................................................................................- 109 -15.1试验目的..................................................................................................................- 109 -15.2 系统资源配备..........................................................................................................- 109 -15.3 实验原理.................................................................................................................- 109 -

15.3.1 硬件原理.......................................................................................................- 109 -15.3.2 软件原理.......................................................................................................- 110 -

15.4 实验内容..................................................................................................................- 111 -15.5 实验步骤..................................................................................................................- 111 -

第十六章 串口通讯实验.........................................................................................................- 113 -15.1试验目的..................................................................................................................- 113 -15.2 系统资源配备..........................................................................................................- 113 -15.3 实验原理.................................................................................................................- 113 -

15.3.1 硬件原理.......................................................................................................- 113 -15.3.2 软件原理.......................................................................................................- 113 -

15.4 实验内容..................................................................................................................- 119 -15.5 实验步骤..................................................................................................................- 119 -

十七章 多进程编程实验.........................................................................................................- 121 -15.1试验目的..................................................................................................................- 121 -15.2 系统资源配备..........................................................................................................- 121 -15.3 实验原理.................................................................................................................- 121 -15.4 实验内容..................................................................................................................- 131 -

Page 6: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书15.5 实验步骤..................................................................................................................- 131 -

十八章 MiniGUI编程实验.....................................................................................................- 132 -18.1试验目的..................................................................................................................- 132 -18.2 系统资源配备..........................................................................................................- 132 -18.3 实验原理.................................................................................................................- 132 -18.4 实验内容..................................................................................................................- 142 -18.5 实验步骤..................................................................................................................- 142 -

附录 LINUX常用操作介绍....................................................................................................- 143 -1 linux常用命令......................................................................................................- 143 -2 VIM编辑器的使用...............................................................................................- 144 -3 minicom的配置和使用........................................................................................- 145 -

Page 7: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第一章 建立实验开发环境

综述:对于个人开发者,可以选用单机开发方式,也就是在单机上安装 linux

操作系统和交叉编译器,在 linux操作系统下完成全部开发实验过程。这种方式依赖于使用者对 linux操作系统的熟练程度。对实验室,可以采用 linux服务器的模式,在局域网内选一台主机上安装 linux操作系统和交叉编译器,并为每个实验者建立一个帐号,这样,试验者可以在网内的的任一 PC的windows系统上以 telnet远程登陆 linux服务器的方式访问自 linux服务器上自己的目录,并运行无需 root权限的 linux 命令,编辑编译自己目录内的源程序文件,然后通过 FTP访问 linux主机上自己的目录,下载编译好的二进制文件,进而通过以太网,usb或者串口方式下载到实验箱中运行。也可以在windows下用自己熟悉的编辑器编辑源文件,然后通过 FTP上传到服务器,并 telnet登陆到linux服务器进行编译,然后通过 FTP下载到windows环境下。这种方式的优点是实验者大部分时间是在熟悉的 windows环境下操作,也便于查找文档等,缺点是当实验人数过多,访问服务器的速度会慢些。

注意:以下实验步骤主要是以在单机 linux 下开发为例。

1.1 硬件和软件需求

开发环境对硬件没有特殊的要求,通常的 PC机都可以满足开发的需求,关键的设备包括两个串口、以太网卡、USB接口、光驱。对于使用 linux服务器

Page 8: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

方式的试验者,系统要求安装 windows 2000和 FTP客户端 TFTP服务器以及 TELNET客户端。

1.2 安装 Windows 和 linux 双系统

这种方式适合单机开发实验1 安装windows:建议使用Windows2000(否则无法完成USB实验)。如果安装双系统,建议在 windows 2000下在硬盘分区时保留一个用 FAT32格式化得分区(这样将来需要得时候可以在 linux环境下访问这个 windows管理的分区)。保留一个 4G以上的硬盘分区用于 LINUX安装。windows安装完毕后,对于 linux服务器方式的试验者,自选适合的 FTP 客户端,TFTP

SERVER和 TELNET软件安装在windows环境下。2 安装 linux:建议使用 Redhat7.3或以上版本。安装过程中选择安装类型为Custom(自定义),然后在后来选择 Install Everything。 如果按其他安装类型来安装系统, 请选用服务器(server)模式安装并注意的是必须选择安装gcc、binutils、make、tftp server、ftp server、minicom、 telnet等。在 linux安装分区的时候,建议将前面保留的 4G分区分成一个 2倍于内存的 SWAP分区,将剩余的部分指定为/(root)分区即可,无须划分更多分区。在安装过程进行到到配置网络安全的时候,建议关闭防火墙并选择信任 eth0设备。最后,建议选择以命令行方式启动 linux。至此,单机用户试验者的基本系统安装工作完毕。

Page 9: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

1.3 安装 Linux 服务器系统

对于采用 linux服务器方式的实验者,在网内选择合适的主机,按照 1.2节中linux的安装方法安装 linux(无需安装windows)

启动 linux并以 root用户名登陆,重复执行以下命令为网内其他试验者建立帐户:

# useradd {name} 创建名为 name的新用户# password {name} 为 name用户设置口令

# userdel {name} 可以删除帐户在每一个新帐户建立时,linux会在/home目录下建立一个与用户名相同的子目录,实验者以自己的帐号使用 telnet登陆 linux服务器后,可以写或者更改/home下对应自己用户名的那个目录。但没有权限访问别人的目录和受系统保护的目录。

在网内其余的主机上安装 windows2000,FTP 客户端,TFTP SERVER 和TELNET工具。至此,linux服务器方式的试验者基本系统安装完毕。

补充说明:极少的情况下,在有些主板的 PC 中无法安装 linux,如果发生这种情况,请与 PC 供应商联系。对于某些老式显卡,因无法识别显卡类型,无法安装图形界面,需要安装该显卡在linux 操作系统下的驱动程序,如果发生这种情况,请与显卡供应商联系,但是,没有图形界面不会影响实验和开发的进行。

1.4 安装 arm-linux 交叉编译器

对于单用户开发者,交叉编译器应该安装到 linux系统下。对于 linux服务器用户,交叉编译

Page 10: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书器安装到网内的 linux服务器上。1) 以超级用户(root)身份登陆 LINUX命令行方式,插入实验箱配套光盘2) # mount /dev/cdrom /mnt/cdrom 挂载光驱3) # cd /mnt/cdrom

4) # cd /armtools 进入编译器目录安装编译器5) # tar zxvf arm-linux-toolchain-post-2.2.13.tar.gz --directory=/ 解压 tar包6) # tar zxvf arm-linux-libz.tar.gz --directory=/

7) # vim /etc/profile 编辑启动配置文件加入编译器路径i. 单击 Insert键

ii. 连续单击 page down键,直到找到 export PATH USER……….这一行iii. 按方向键,将光标放到这一行的前面一行的行首,并回车。iv. 键入 PATH=/skiff/local/bin:$PATH

v. 单击 ESC键 输入:x 回到命令行8) # logout 然后重新登陆9) # mount /dev/cdrom /mnt/cdrom

10) #cd /mnt/cdrom/src 进入 kernle目录安装内核源码11) # tar zxvf linux.tar.gz --directory=/usr/local/src

12) # cd /skiff/local/arm-linux/incude 修改头文件连接13) # rm –f asm14) # rm –f linux15) # ln –s /usr/local/src/linux/include/asm asm16) # ln –s /usr/local/src/linux/include/linux linux17) # ln –s /usr/local/src/linux/include/asm-generic asm-generic18) # ln –s /usr/local/src/linux/include/asm-arm asm-arm

19) # cp –r /mnt/cdrom/src /usr/local/src/src 拷贝示例代码20) # cp –r /mnt/cdrom/bin /usr/local/src/bin 拷贝二进制代码21) # cp –r /mnt/cdrom/mp3 /usr/local/src/mp3 拷贝示例 MP3

Page 11: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

22) # cp –r /mnt/cdrom/bmp /usr/local/src/bmp 拷贝示例位图文件23) # cd /usr/local/src/src

24) # tar zxvf libminigui-1.3.0.tgz 解压 minigui 库文件25) # cd libminigui-1.3.0

26) # ./buildlib-mx1-em-arm9 安装 libminigui-1.3.0

27) # umount /mnt/cdrom/ 卸载光驱28) 安装完毕,取出光盘

1.5 配置 linux 内核

1) # cd /usr/local/src/linux2) # make menuconfig

a) 按上下方向键直到“load an alternate configuration file”被加亮,然后按左右方向键直到“select”被加亮,然后按回车键。

b) 按“backspace”键清除文本内容,然后输入 default.config 按回车。c) 按左右方向键直到“exit”被加亮 然后按回车键。按左右方向键直到 yes 被加亮 然后按回车键退出。

3) # make dep

4) # make Image (编译内核,注意大小写)

5) # ll /usr/local/src/linux/arch/arm/boot 查看是否得到编译好的内核,如果存在 Image文件,大小为 1.4M~1.5M 字节左右,创建日期和时间为当前时间,表明内核源码编译环境配置正确。

6) ARM交叉编译器至此安装完毕 。使用者应该牢记下面黑体的两个路径。在编译代码的时候常常需要指定这两个路径。

Page 12: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

LINUX 头文件路径 /usr/local/src/linux/include

GLIBC 库 头 文 件 路 径 /skiff/local/lib/gcc-lib/arm-linux/2.95.2/include

1.6 配置串口控制端

1.6.1 Linux 环境下配置(对于单机用户是必须的)

配置minicom

以 root 身份运行minicom

# minicom

然后 Ctrl+a o(先按 Ctrl + A 再按O)进入配置选项

Page 13: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

按方向键从菜单中选择 serial port setup,回车。以配置串口工作方式为 115200 8 N 1(这是实验箱串口的工作模式)为例,执行以下操作:按 e键,然后依次按下 I、Q键,确认 current:后面的显示为 115200 8N1,回车, 按下 A键,在 SERVER DEVICE下修改串口设备名(如果选择串口 1,输入/dev/ttyS0,如果选择串口2,输入/dev/ttyS1)。然后回车。按下 F键,修改 HARDWARE

FLOW CONTROL后面为 NO。回车退回主菜单,从菜单中选择 MODEM AND DIALING,键入 A,删除 INIT STRING中的内容,按回车。键入B,删除 RESET STRING中的内容,按回车。然后按回车返回上级菜单。从菜单中选择在菜单中选择 save setup as dfl

回车,然后从菜单中选择 EXIT 退出配置菜单。按 ctrl+a 然后按 q

退出 MINICOM。配置完成。以后再进入MINICOM时会使用我们刚才的配置,无须重新配置了。

Page 14: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

配置 tftp服务器以 root 身份运行 # setup,在 System Services中选择 tftp,然后退出,执行# /./etc/init.d/xinetd restart

以后每次 linux启动就会同时启动 tftp服务。

1.6.2 Windows 环境配置(适用于 linux 服务器方式的实验者)

配置超级终端从菜单->附件->通讯 运行超级终端,选择一个串口(与实验箱相连的那个串口),其他配置如下

Page 15: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

tftp 服务器 ftp客户端 telnet客户端可自行选择 TFTP SERVER 软件安装运行

Page 16: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第二章 使用开发环境

所有对实验箱的操作都应该先连接实验箱的串口 1(UART 1)与 PC 机的串口,连接实验箱的电源插座与 220V 交流电源。实验箱上电后,可以在超级终端或者 minicom 中与实验箱进行命令行方式的交互。系统首先进入 blob,出现 blob>提示符,此时实验这可以用不同的命令进行一下操作: 下载更新 blob, 下载更新 linux 内核,下载更新 linux 的文件系统,下载更新 ucos 内核,启动 linux 操作系统,启动 ucos 操作系统等。如果选择启动了 linux 操作系统,那么在 linux 操作系统的提示符#出现后,可以通过超级终端进行交互操作,实验箱上的 linux 操作包含了大部分 PC 机上 linux 操作系统下的常用命令,且命令语法和功能相同。linux 服务器方式的实验者,在实验的时候,可以远程登陆到 linux 服务器上,将/usr/local/src/src 或者 /usr/local/src/bin 下的文件拷贝到/home 下自己的子目录,进行编译,编辑。以下实验大部分在 linux环境下进行,单机用户可以进入 linux系统实验,linux服务器方式的实验者可以从 windows下远程登陆到网内 linux服务器,在自己的目录下进行实验。2.1 应用程序开发下载调试和执行

2.1.1编辑应用程序源文件

在 Linux 环境下使用 VIM编辑器,在当前目录下新建一个 hello.c(可以用cd 命令改变当前路径)# vim hello.c

键入如下内容

#include <stdio.h>

int main()

{

printf("hello\n");

}

Page 17: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

2.1.2 编辑应用程序 Makefile

在与 hello.c同一个目录下新建立Makefile文件# vim Makefile

键入如下内容CC = gcc

all: hello

hello:

$(CC) -o hello hello.c

clean:

rm -rf *.o hello

注意,在$(CC)和 rm 两行前面的空格是一个 TAB 键制表符,这个制表符有特殊的含义,不能用空格代替。

2.1.3 编译应用程序

在 hello.c和Makefile的目录下执行# make

就可以得到名为 hello的可执行程序执行程序# ./hello

这个与体系无关的应用程序因为使用 GCC编译的,生成的是X86指令代码,所以可以在 PC的 linux环境下运行把 Makefile中的 gcc改为 arm-linux-gcc,然后重新执行make。

Page 18: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

得到 hello,这个可执行程序就是经过 arm-linux-gcc交叉编译的,所含指令为arm指令,只能在 arm 平台上运行,不能通过 #./hello在 PC上直接运行。为了运行这个 hello程序,需要将它下载到实验箱上执行。

2.1.4 下载应用程序

如果是通过 linux服务器方式进行实验,请先用 windows端的 FTP客户端登陆linux服务器,然后将在 linux服务器上编译得到的程序下载到本地 PC。在实验箱的 linux环境下,只有/tmp目录是可写的,而且该目录实际上是 RAM

存储区,大小为 4M。所写内容断电后丢失。因此需要向实验箱下载文件的时候,需要先进入该目录。即,在 PC机 linux 下运行 # minicom 启动MINICOM(对于linux服务器方式的实验者,应该在windows环境下则启动超级终端),用串口线连接实验箱的串口 1(UART 1)与 PC 机的串口,实验箱上电后,等待minicom(在windows环境下是超级终端)中出现 “blob>” 提示符,键入 blob>

ldrboot kernel 启动实验箱上的 linux。然后输入 # cd /tmp。此时已进入/tmp目录(可以用# pwd命令显示确认),可以下载文件了。

在windows环境下使用串口下载

打开超级终端,按照 1.6.2 所介绍的参数配置之后,用串口线连接实验箱的串口1(UART 1)和 PC的串口。启动实验箱。在超级终端中执行blob> ldrboot kernel 启动实验箱上的 linux

# cd /tmp# zmrx

实验箱开始等待超级终端从串口向它发送数据。

Page 19: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

在超级终端的发送菜单中选择发送文件,会出现如下窗口:

单击浏览,选择刚刚用 arm-linux-gcc编译好的 hello文件,选择发送协议为Zmodem,然后开始发送。发送结束后,在超级终端上(也就是在实验箱上运行的 linux环境下)修改刚刚发送到实验箱上的 hello文件的属性为可执行。# chmod +x hello

然后执行这个程序,观察结果。# ./hello

在 linux环境下使用串口下载如果已经按照 1.6.1配置好minicom,可以直接运行minicom

# minicom 然后打开实验箱电源在minicom中执行blob> ldrboot kernel 启动实验箱上的 linux

# cd /tmp# zmrx

执行了 zmrx 之后,按 Ctrl + a s(先按 Ctrl +A 再按 S),然后选择 zmodem按回车,再选择程序,按回车开始发送。发送结束之后,也要修改文件属性后才能运行。

Page 20: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

FTP 方式下载 在windows环境下使用 FTP下载

需要在windows环境下安装 FTP SERVER软件。将要下载的文件拷贝到 FTP SERVER开放出的目录下。打开超级终端,实验箱上电。在 blob> 提示符下键入 blob> ldrboot kernel 启动实验箱上的LINUX ,#cd /tmp 进入 tmp目录。然后在超级终端上依次运行以下命令

加载以太网驱动:在MINICOM或者超级终端中输入:# rmmod cs89x0 卸载系统启动已经加载的以太网驱动。重新加载以太网驱动并配置网卡。(目的是保证局域网内多台实验箱不出现相同的网卡配置) # insmod /drivers/cs89x0.o MAC=**:**:**:**:**:**MAC后面是MAC 地址,也就是要设置的网卡的物理地址,物理地址由 6个二位的 16进制数组成。MAC 地址可以任意设置,但在局域网内应该是唯一的。配置以太网 IP 地址:在超级终端中输入# ifconfig eth0 192.168.***.***

Page 21: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

这条命令将设置网络设备的 IP 地址,网内的 IP 地址是唯一的。配置以太网广播地址和子网掩码:在 超 级 终 端 或 者 在 MINICOM 中 输 入 #ifconfig eth0 broadcast

192.168.0.255 netmask 255.255.255.0 这个命令将设定广播地址和子网掩码配置网关:在 超 级 终 端 或 者 在 MINICOM 中 输 入 #route add default gw 192.168.***.*** eth0

进入实验箱的 tmp 目录, 输入 # ftp 192.168.***.*** (这个 IP 地址是 linux服务器的 IP 地址)即可使用 FTP命令行方式登陆 FTP服务器。随后可以使用 cd 目录名 进入服务器某个目录, ls 列出服务器目录内文件 get 文件名下载文件到当前目录下。

在 linux环境下使用 FTP下载需要在 linux 环境下安装 FTP SERVER 软件,也可以使用 linux 自带的 ftp

server(如果安装 linux是按照 1.3 步骤,FTP SERVER 已经在 linux下正常运行了)。将要下载的文件拷贝到 FTP SERVER开放出的目录下(匿名登陆的默认开放目录是/ver/ftp, 使用用户名登陆的开放目录是/home下与用户名同名的目录)。启动minicom

# minicom 打开实验箱电源。在 blob> 提示符下键入 blob>ldrboot kernel 启动实验箱上的 LINUX。然后在minicom中依次运行以下命令

加载以太网驱动:

Page 22: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

在MINICOM或者超级终端中输入:# rmmod cs89x0 卸载以太网驱动。重新加载以太网驱动。(目的是保证局域网内多台实验箱不出现相同的网卡配置)# insmod /drivers/cs89x0.o MAC=**:**:**:**:**:**MAC后面是MAC 地址,也就是要设置的网卡的物理地址,物理地址由 6个二位的 16进制数组成。MAC 地址可以任意设置,但在网内应该是唯一的。配置以太网 IP 地址:在MINICOM或者超级终端中输入# ifconfig eth0 192.168.***.***

这条命令将设置网络设备的 IP 地址,网内的 IP 地址是唯一的。配置以太网广播地址和子网掩码:在 超 级 终 端 或 者 在 MINICOM 中 输 入 #ifconfig eth0 broadcast

192.168.0.255 netmask 255.255.255.0 这个命令将设定广播地址和子网掩码配置网关:在 超 级 终 端 或 者 在 MINICOM 中 输 入 # route add default gw 192.168.***.*** eth0进入实验箱的 tmp 目录, 输入 # ftp 192.168.***.*** ( 这个 IP是主机的 IP 地址)

即可使用 FTP命令行方式登陆 FTP服务器。随后可以使用 cd 目录名 进入服务器某个目录, ls 列出服务器目录内文件 get 文件名下载文件到当前目录下。

USB 方式下载 在windows环境下使用 usb下载(需windows2000环境)

打开超级终端,按照 1.6.2 所介绍的参数配置之后,启动实验箱。在超级终端中执行blob>ldrboot kernel 启动实验箱上的 linux

Page 23: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

用 usb 线连接实验箱与 PC机的 usb口,此时在 windows可以看到识别出一个描述符为普天慧讯 E-ARM9的移动盘,以 FAT3方式格式化这个移动盘,然后拷贝程序到这个盘中,然后在我的电脑中,右键单击该盘符,选择弹出,然后断开 usb 连接线。在超级终端中执行命令: # mount /dev/usb /mnt/usb # cd /mnt/usb

# ls 此时可以看到刚才拷贝的文件

在 linux环境下使用 usb下载打开minicom,实验箱上电。在 blob> 提示符下键入 blob>ldrboot kernel 启动实验箱上的 LINUX。然后在minicom中端依次进行以下操作# ldrboot kernel 启动 linux

在 pc机这端,按 ALT+F2启动第二个控制台,以 root 身份登陆, 用 usb 线连接实验箱与 PC机, 稍等一会,会有信息显示 PC机已经检测到一个 usb设备。回车,并运行以下命令# mkdir /mnt/usb

# mke2fs /dev/sda 格式化 u盘# mount /dev/sda /mnt/usb 挂载 usb盘(实验箱被当作一个 usb存储设备)# cp hello /mnt/usb 在您的 PC上,hello可能在不同的目录下# umount /mnt/usb 卸载 usb盘按ALT+F1 回到先前的控制台,我们曾经在这里启动了 minicom

在minicom中执行以下命令

Page 24: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书# mount /dev/usb /mnt/usb# cd /mnt/usb

#ls 此时,您应该可以找到你在 PC端拷贝过来的文件

2.1.5 执行应用程序

1 为下载到实验箱中的应用程序添加可执行属性。# chmod +x hello2 执行应用程序# ./hello 注意/前面有个点号

2.1.6 远程调试应用程序 (仅 linux 环境下)

通过以太网口远程调试在嵌入式系统中,由于存储容量的限制,通常无法在系统内部运行调试器,所以,当调试嵌入式系统时,需要在主机上运行调试器(gdb),而在实验箱上运行一个监控程序(gdbserver)。

在 Linux主机上调试:

首先,我们编写一个小程序 hello.c来说明调试过程:

Page 25: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

使用交叉编译器编译这个程序:# arm-linux-gcc –g gdbtest.c –o hello

在编译的时候必须要加 –g 选型,以通知编译器生成GDB使用的调试信息。

在 PC端配置网络环境# ifconfig eth0 192.168.***.***

连接实验箱与 PC 之间的网线与串口线,打开实验箱的电源。开启 minicom,与实验箱连接,在 minicom中并配置实验箱的网络,# ifconfig

eth0 192.168.***.***

进入实验箱的/tmp 目录,在minicom中输入 # cd /tmp

然后使用 zmodem 协议将刚刚编译好的 hello 下载到实验箱上。将 PC端/usr/local/src/bin/下的 gdbserver文件(程序)下载到实验箱的 /tmp目录下。修改实验箱上这两个文件的属性:在 minicom 中输入:# chmod +x gdbtest

chmod +x gdbserver

运行实验箱上的 gdbserver,将 gdbtest作为参数,并指定一个端口号 ,格式如下:

Page 26: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书 gdbserver :port program

在minicom中输入:# gdbserver :2000 hello这里我们指定的端口号是 2000

在主机端,将/usr/local/src/bin/gdb 拷贝到,与主机上 hello相同的目录下,(确保gdb, hello,hello.c在相同的目录下。运行 gdb

# chmod +x gdb # ./gdb

如图

Page 27: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

在 gdb的命令行环境中中输入(gdb) file hello,这个命令使 gdb 读入 gdbtest中的调试信息。然后在 gdb的命令行中指定与实验箱的连接方式:输入 target remote ip:port (ip是实验箱的 ip,port是运行 gdbserver时指定的端口)

这里我们输入 (gdb) target remote 192.168.***.***(实验箱的 IP):2000(2000是前一步我们在运行实验箱上的 gdbserver时指定的端口号)

这时 gdb应该显示与实验箱建立连接,可能的信息为:Remote debugging using ip:port

0x8000???()

输入(gdb) l 1 可以看到GDB 列出了 hello文件的源代码。在命令行中输入 b main,在main 函数中设置一个断点。然后输入 (gdb)cont 来继续执行调试。之后可以使用常用的GDB命令来进行调试,输入 help 获得帮助。

Page 28: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

命 令 描 述file 装入想要调试的可执行文件.

kill 终止正在调试的程序.

list 列出产生执行文件的源代码的一部分.

next 执行一行源代码但不进入函数内部.

step 执行一行源代码而且进入函数内部.

run 执行当前被调试的程序quit 终止 gdb

watch 使你能监视一个变量的值而不管它何时被改变.

break 在代码里设置断点, 这将使程序执行到这里时被挂起.

make 使你能不退出 gdb 就可以重新产生可执行文件.

shell 使你能不离开 gdb 就执行 UNIX shell 命令. 

Page 29: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

补充说明:gdb 与 gdbserver应该保持版本一致。所以在光盘中的/bin/目录下提供了已经编译好的,版本相同的 gdb 与 gdbserver。

通过串口远程调试通过串口远程调试需要具有 2个串口的 PC,此时应该用另外的串口线连接实验箱的串口 2(UART 2)与 PC的第二个串口。编译和下载过程与网口调试相同。只是在启动实验箱上的 gdbserver的时候使用: # gdbserver /dev/ttyS1 hello

类似的,在 PC端启动 gdb # ./gdb以后需要进行以下步骤(gdb) file hello 装载文件(gdb) set remotebaud 115200 设置串口通讯波特率

Page 30: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(gdb) target remote /dev/ttyS* ttyS*是 PC上调试用的那个串口设备(gdb) l 0 从源文件的 0行开始列表源代码(gdb) b main 在main 函数处设置断点(gdb) cont 继续后面就可以是使用各个GDB 调试命令了。

使用DDD进行远程调试DDD 介绍:对于大部分人来说,gbd的命令细节过于繁琐,那么具有友好的用户界面

的 DDD(Display Data Debugger)可能是他们更好的选择。总的来说,ddd环境提供了友好的用户界面和更方便的调试交互。不过要强调的是 ddd 只是建立在 gdb 之上的图形环境,因此只有安装了 gdb 才能正确运行 ddd(ddd

只是将 gdb 界面话,所以 gdb的版本也要求和实验箱上运行的 gdbserver版本一致)。同时在 gdb中所有的功能都可以在 ddd中使用。使用DDD也可以利用串口和以太网进行远程调试,实验箱端的操作步骤和前面介绍的相同,而 PC

端我们原来对DGB的操作,现在可以在图形界面下进行,同时我们使用的那些DGB命令和前面介绍的也完全相同。

运行 DDD:在XWINDOW下的开始菜单中,单击 DDD 图标可以启动DDD

Page 31: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

图 2-1 DDD 的主窗口图 2-1是运行后的 DDD主窗口,有三种不同的方式进入 DDD。第 1种方式

是在命令行中敲入如下命令:ddd <program> core

使用这种方式进入 DDD后,如果调试的程序发生错误被终止时,会产生名为”core”的文件,其中记录了程序发生错误到被终止过程中一些有用的信息。第 2种方式是在命令行中敲入如下命令:

ddd <program> <process_id>

其中的 proccess id选项可以允许你调试一个正在运行的程序。另外也可以直接键入”ddd”进入DDD主窗口,然后在通过”File”菜单选项调入程序代码。

DDD主窗口,被分为 3个子窗口。最下面的子窗口是一个纯粹的控制台调试器,在这里你可以直接输入 gdb命令,当使用其它方式执行调试命令时,这个窗口也会显示出所执行任务对应的 gdb命令,这对于学习使用 gdb 很有好处。中间的子窗口显示程序源代码,顶层的子窗口提供了一个查看程序中变量和对象

Page 32: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

的图形工具。此外还有一个浮动工具条,它包含了 DDD的常用命令。除了主窗口外,有时对于运行进程还有一个执行窗口,以控制终端的输入和输出。

获得帮助信息:在调试过程中,可以有多种方法获得 DDD 帮助信息。例如当把光标放在任

何变量和按钮上时,就会出现一个包含它们信息的对话框 .dDD主窗口下面的状态行会显示正在当前正在运行的命令和它的输出情况。大多数帮助可以通过按F1键然后在浮动窗口上选择一个主题获得。在最下面的 gdb工作台窗口键入”help”可以获得调试器的帮助和命令的特殊信息。

图 2-2 DDD 文件菜单的帮助

当调入程序源代码后,用户就可以完成查看源代码 检查变量的值和类型以及控制程序的执行等一系列调试工作。如果从菜单中选择了”Options -> Run in Execution Window”,程序的输出可

以通过执行窗口来显示。否则也可以通过调试器控制台查看它的输出,不过这对

Page 33: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

于采用Motif或其他GUI 库的程序并不适用。把鼠标的光标放在源代码上,就可以在 DDD 状态行看到它的当前值。单击鼠标右键,可以弹出下面菜单。

图 2-3 查看变量状态的弹出菜单

这个菜单可以让我们检查变量”fname”的值,并把它的值或指针显示在顶层窗口。其中"What is"将显示它的结构或类型,” Lookup”查找这个变量下一个出现的位置。而” Break at”和” Clear at”被用来设置断点。这个菜单会随光标下变量的不同而有所变化,以根据变量的不同类型执行适当的操作。

使用断点断点可以让程序执行到特定的行,用户可以检查此时变量的值并可以人工

的单步执行程序。用户可以采用以下方法放置一个断点: 将光标 放在将要设置断点的行上,然后单击 鼠 标 右键选择” Set

Breakpoint”或”Set Temporary Breakpoint”。两者的不同在于临时断点在程序第 1 次执行该行后断点自动清除,而设置断点只有使用清除断点命令才能清除。

可以在源代码窗口选择"Break at ()"按钮。

Page 34: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

在调试器控制台键入"break <line_number>"命令 通过菜单" Source->Edit Breakpoints"打开一个编辑断点的窗口。

图 2-4 使用断点图中在 70和 71行分别设置了两个断点。下面的对话框用以管理断点。

图 2-5 管理断点

其中的”Condition”按钮被用来设置条件断点。只有当程序运行到断口处是条件满足程序才停止。”Ignore Count”也是一个条件断点,当断点行被运行过<n>次后条件为真。例如可以让一个程序中的循环在运行 15 次后停止。

控制程序运行

Page 35: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

一旦程序在断点处停止,用户就可以使用适当的菜单选项来检查变量的值。通过主窗口右侧的浮动工具条可以控制程序的执行。也可以采用主窗口的菜单条它们是相同的。对于这些命令的含义可以参考 gdb的相关命令。

图 16-6 控制程序执行的浮动工具条和菜单

数据图形化显示DDD最让人兴奋的特性在于它的顶层数据窗口的显示。它可以把数据的结

构和关系图形化。下图中是一个数组和和它的元素。

Page 36: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

图 16-7 图形化显示一个数组通过菜单中的” Data->More Status Displays”,这个窗口可以显示非常广泛

的信息。用户可以用它来显示寄存器的值 需要的动态链接库和程序的执行状态等等。

图 16-8 定制显示数据化数据

2.2 驱动程序应用程序开发下载和使用

2.2.1 编辑 Makefile 文件

如果您编写的是驱动程序,那么 Makefile文件需要做些修改。CC = gcc

Page 37: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书all: hello

hello:

$(CC) -c hello

clean:

rm -rf *.o hello

同样执行#make 在当前目录下会得到 hello.o文件。

2.2.2 加载和卸载驱动程序到内核

编译好的驱动程序,按照同样的方法下载到实验箱中的/tmp目录下,然后用以下命令加载到内核运行。# insmod 驱动程序名为了应用程序能使用这个驱动,还需要创建设备节点(实验箱的 /dev目录下有一些常用的设备节点)。# mknod 设备节点名 设备类型 主设备号 子设备号设备节点名是任意的,设备类型可以是 c或者 b 表示该设备是字符设备或者是块设备,这跟驱动的编写方式有关。主设备号是驱动程序中调用设备注册函数时选择的设备号(0~255)子设备号通常选择为 0(在本教程中,所有的子设备号都是 0)

# rmmod 设备名 卸载驱动程序,这里的设备名就是驱动程序名去掉.o后缀。

Page 38: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

2.3 下载内核与文件系统和 BLOB 程序

连接实验箱的串口与实验箱的串口 1(UART 1),系统加电,实验箱将停止在 blob(bootloader程序)里等待命令,出现 blob>提示符。这时,可以给实验箱重新烧写内核或者文件系统。传输方式有如下几种(以Windows上的超级终端为例进行说明):

xmodem 方式( 仅 windows 系统下适用)在 blob的提示符下输入 blob > xwrite kernel,按回车。然后在超级终端的发送菜单中选择发送内核镜像文件:

浏览,选择光盘上编译好的 linux内核(配套光盘中的/bin/Image),选择Xmodem 协议,按发送。发送结束之后,重起实验箱或者在 blob下执行#ldr kernel 就可以启动新的内核。

同样方式,在 bolb 提示符下输入 xwrite ramdisk,然后在超级终端中通过 Xmodem发送光盘上文件系统(配套光盘中的/bin/fs),就可以重新下载文件系统到实验箱。

以太网方式 (windows 和 linux 系统均适用)

Page 39: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

需要在 PC端先安装 TFTP SERVER程序。对于安装时已经选择了安装TFTP SERVER的 LINUX系统,其 TFTP SERVER在系统启动时自动运行,并且开放出的 TFTP SERVER目录默认是 /tftpboot。先将新内核镜像或者已经生成的文件系统文件拷贝到 TFTP SERVER开放目录中。(在 1.4节中,我们已经将光盘上编译好的内核和文件系统拷贝到了/usb/local/src/bin目录下,内核的文件名是 Image 文件系统的文件名是 fs,blob的文件名是 blob。)打开minicom或者超级终端,启动实验箱,在 blob 提示符下配置网络:blob > ipconfig ip 192.168.***.** 设置实验箱的 IP

blob > ipconfig server=192.168.***.** 设置 TFTP server的 IP

然后执行blob > twrite kernel 内核文件名 即可下载新内核上步执行完毕后 blob > ldrboot kernel 可以启动新 linux内核blob > twrite ramdisk 文件系统文件名 即可下载新文件系统上步执行完毕后 blob > ldrboot kernel 可以使用新文件系统启动内核blob > twrite blob BLOB文件名 即可下载新 BLOB

上步执行完毕后复位实验箱即可运行新 BLOB。

usb 方式 (windows 和 linux 系统均适用)打开mincom或者超级终端,打开实验箱电源,等待出现 blob 提示符。blob > uwrite kernel 或者 blob>uwrite blob 或者 blob>uwrite ramdisk

Page 40: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

这些命令分别表示要使用 usb方式下载内核或者 blob或者文件系统用 usb 线连接实验箱和 PC(如果在 linux环境下,需要先按 ALT+F2启动第二个控制台)windows2000环境下操作:

等待出现新的 USB盘符,然后拷贝 kernle,blob或者文件系统文件到这个U盘(注意:对于这个 u盘不能做除了拷贝以外的任何写操作,包括格式化和删除。且只能拷贝一次,只能拷贝一个文件)。否则无法正确读取文件,需要复位实验箱,重新操作。拷贝完成后,在我的电脑中,右键单击 U盘盘符,选择弹出,然后断开USB 连接电缆既可。linux环境下操作:等待出现 usb设备识别信息后,按回车。# mkdir /mnt/usb (如果/mnt/usb 已经存在,可省略)

# mount /dev/sda /mnt/usb

# cp [file] /mnt/usb file是文件系统,内核或者 blob文件的文件名(注意:对于这个 usb目录不能做除了拷贝以外的

何写操作,包括删除。且只能拷贝一次,只能拷贝一个文件)

# umount /mnt/usb

按ALT+F1,回到第一个控制台,可以在minicom中看到,blob 正在更新 flash。

Page 41: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

2.4 修复系统

注:以下描述仅 windows 下使用超级终端适用如果是实验箱上 blob 出现问题,那么整个系统将不能启动,这时解决的方法要复杂一些。

1) 将实验箱子板上的 J15(在实验箱左侧耳机插孔下面)用跳线短路(这将使MX1以 bootstrap模式启动)。连接实验箱子板上的串口 1(UART1)和 PC

的串口。然后打开超级终端,设置 PC串口为 115200 8 n 1 无流控模式。2) 打开实验箱电源,在超级终端上持续键入字符“A”,直到刚好出现“*”为

止。这表示 MX1 已经识别出波特率并准备好接收 b-record命令了。

3) 在超级终端上以文本方式发送配套光盘中/bin/fl文件4) 接收完成后键入Y。5) 在超级终端上用 xmodem 协议发送 bin\sys下 blob文件。6) 接收结束后,将 J15的跳线取下。重新上电启动,可以看到 blob 已经运行了在此基础上可继续使用 blob的功能下载内核和文件系统

注意:如果执行第二步却没有收到*,可以返回第一步,将超级终端的波特率设置调低一些再试。

Page 42: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第三章 ARM 试验箱说明

3.1 EMOTION (ARM9 LINUX) 教学实验系统

教学系统设计为分为两部分:一部分为核心板,它提供了 MC9328MX1系统的最小系统、音频接口及扩展连接线等模块。一部分为扩展板,它提供了用来完成各项不同实验的功能模块。核心板与扩展板采用上下层插槽连接方式,这样可根据教学需求,在使用同一核心板的前提下,使用不同的扩展板来完成不同的实验要求。EMOTION (ARM9 LINUX)教学实验系统主要目的是为 32 位 CPU

及嵌入式操作系统的初学者提供一个强大的硬件功能平台。

3.1.1 主要功能描述

1 .微处理器

MC9328MX1需要两路电压输入,一路为 1.8V用于 CPU 核心电路;一路为 3.3V用于CPU存储及 I/O接口电路。 通过动态编程,CPU操作时钟可最高工作于 200MHz,SDRAM操作时钟可最高工作于 100MHz。 MC9328MX1需要两组复位信号启动系统。一路为 POR信号用于上

Page 43: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

电复位;一路 RESET_IN信号用于复位微处理器。 MC9328MX1 有两种启动模式,Normal Mode 及 Bootstrap Mode。

2 .存储空间

32MB SDRAM内存空间(最大可扩至 128 MB)。 8MB FLASH存储空间(最大可扩至 32 MB)。

3 .外设

彩色 320x240 STN LCD 显示屏,支持 4096色。 电阻式触摸屏。 高性能 Audio CODEC接口,配有立体声音频输出。 LDO稳压器。 两个串行接口。 一个CAN 总线接口,提供可编程的 125Kb、250Kb、500Kb、1Mb

传输速度。 一个 Slave USB接口。 一个 JTAG接口,用以进行系统仿真或 Flash写入操作。 采用CS8900A芯片,支持 10-BaseT以太网接口。 一组 4x4键盘阵列。 8个用户功能自定义 LED 显示灯。 8个用户功能自定义开关量输入按键,其中 4个按键可自锁。 OSC频率源功能模块,产生 1MHz时钟,作为 A/D转换模块的时

Page 44: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

钟输入。 信号源功能模块,产生方波、三角波及正弦波。 8-bit、8通道A/D转换模块。 8-bit D/A转换模块。 4个 LED灯指示电源状态。

4 .二次开发预留接口

地址总线 A00~A24

数据总线 D00~D31

静态存储空间控制总线 动态存储空间控制总线 I2C串行总线接口 SPI串行总线接口 MMC多媒体卡串行总线接口 Bluetooth接口 LCD接口,可支持 STN、TFT彩色或黑白液晶屏 触摸屏输入接口 CMOS-SENSOR数码相机接口 全流控 UART接口 Slave USB接口 SSI音频输入、输出接口 MC9328MX1片内语音 ADC 输入接口

Page 45: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

MC9328MX1片内电压 ADC 输入接口 MC9328MX1片内计时器输入、输出接口 MC9328MX1片内 PWM 输出接口

3.1.2 调试电缆

教学系统提供三条电缆线。一条为串口连接线,允许在核心板与主机 PC 之间通信。通过连接核心板上的 UART1和主机 PC上的 COM端口来传递信息;一条为网口连接线,通过其将扩展板的 RJ45接口与集线器相连,进行网络通信。一条为USB接口连接线,用于与 PC主机上的USB端口传递信息。

3.1.3 电源

通过所提供的电源连接缆,将 220V/50Hz的交流电源接至箱体接口。交流电压经系统开关电源转换为 3 组直流电压:+5V/3A、+12V/400mA、-12V/

400mA 供系统使用。电源接口带有熔断丝,可保护外部电源。

3.1.4 跳线

核心板上共有1组跳线,其功能概述如下:J6: 启动模式跳线。MX1有两种启动模式:Normal Mode(从 Flash启动)

及 Bootstrap Mode(自举模式,用于 Flash下载)。跳线连通选择

Page 46: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

Normal Mode,跳线断开选择 Bootstrap Mode。

扩展板上共有5个跳线,其功能概述如下:J6: 扬声器输出跳线。连通 1、2选择左声道输出,连通 2、3选择右声道输

出。J11:键盘矩阵列线上拉、下拉方式跳线。连通 1、2选择上拉方式,连通 2、3

选择下拉方式。J15:启动模式跳线,功能同核心板上的 J6。J47:CAN 总线终端匹配电阻跳线。连通则添加 120欧姆匹配电阻,断开则

没有匹配电阻。J46:CAN 总线控制器发送控制跳线。

3.1.5 接插件

核心板上共有接插件9个,其功能说明如下:J1、J2、J3、J4、J5:系统资源引出接口。J9:LCD高位数据线 D8~D15及 SHARP 显示屏专用控制线输出接口。J10:SDRAM 控制总线及MX1杂项控制线监测接口。J14:系统地址总线 A04~A23 输出接口。J15:核心板电源引入接口。

扩展板上共有接插件29个,其功能说明如下:J1、J2、J3、J4、J5:系统资源引入接口,与核心板系统资源引出接口相连。

Page 47: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

J18:LCD 显示屏驱动接口。彩色 STN LCD 显示屏,支持 4096色。J22:+12V逆变器直流电源输入接口,通过开关 K1 控制开启和关闭。J23:麦克风输入接口。J29:音频输出耳机接口。J48:第一串行口UART1接口。J24:第二串行口UART2接口。J27:Slave USB接口。J34:MX1片内电压 A/D转换输入接口。J8:信号源功能模块输出接口,提供方波、三角波、正弦波输出。J13、J14、J16、J17、J19:模拟信号输出测量接口,分别为方波、三角波、正

弦波、DAC模块输出以及直流电压信号。J20、J21:模拟信号输出对应的信号地。J7:A/D转换模块输入信号源通道接口 IN0-IN4。输入信号有直流电压信

号、方波、三角波、正弦波以及DAC模块输出信号。J9:D/A转换模块输出接口。提供 D/A转换输出。J31:Embedded ICE接口,提供系统 JTAG 调试接口。J36:MMC、SD多媒体卡插槽。J37:10-BaseT 以太网 RJ45 插座。J38:系统电源引入接口。J39:触摸屏输入接口。JP1:CAN 总线接口 1。JP2:CAN 总线接口 2。

Page 48: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

3.1.6 LED 显示

核心板上共有 LED显示灯5个,其状态指示说明如下:D1:系统上电复位(POR)指示 LED。D2:外部复位输入(RESET_IN)指示 LED。D3:CPU工作状态(MX1_A02)指示 LED。D4:电源+1.8V有效指示 LED。D5:电源+3.3V有效指示 LED。扩展板上共有 LED显示灯16个,其状态指示说明如下:LED1:10-BastT RJ45 Link status(连接状态) LED。LED2:10-BaseT RJ45 Lan status(网络活动状态) LED。LED3~LED10:用户自定义状态指示 LED。LED11:CAN接收状态指示 LED。LED12:CAN发送状态指示 LED。LED15:Power +5V有效指示 LED。LED16:Power +12V有效指示 LED。LED17:Power -12V 有效指示 LED。LED18:Power +3.3V 有效指示 LED。

Page 49: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

3.2.EMOTION ARM9 LINUX 教学实验系统详细设计资料

EMOTION ARM9 LINUX 教学实验系统原理框图

3.2.1 内存映像

物理地址 功能描述 译码(Decode)0x10000000–0x107FFFFF

FLASH 空间, 8MBnCS0

Page 50: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书0x12000000–0x12FFFFFF

D/A寻址空间 nCS1

0x08000000–0x09FFFFFF SDRAM, 32MB nCSD0(nCS2)0x14000000–0x14FFFFFF

A/D寻址空间 nCS3

0x15000000–0x15FFFFFFCS8900A 以太网空间 nCS4

0x16000000–0x16FFFFFF 保留 nCS5

0x00200000–0x00226FFF 156KB,内部寄存器0x00300000–0x003FFFFF 1MB(128KB

used)SRAM

3.2.2 GPIO 使用情况

I/O 口 信号 I/O 功能描述PD11 LCD_DISP O LCD数据 Enable信号PB17 CS4340_#RS

TO 音频CODEC复位信号

PB14 MX1_IRQ I 以太网卡中断请求信号PA3 PA3 I 用户定义开关量输入信号 PA4 PA4 I 用户定义开关量输入信号PA5 PA5 I 用户定义开关量输入信号PA6 PA6 I 用户定义开关量输入信号PA7 PA7 I 用户定义开关量输入信号PA8 PA8 I 用户定义开关量输入信号

Page 51: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书PA9 PA9 I 用户定义开关量输入信号PA10 PA10 I 用户定义开关量输入信号PA11 PA11 O 用户定义 LED 输出控制信号PA12 PA12 O 用户定义 LED 输出控制信号PA13 PA13 O 用户定义 LED 输出控制信号PA14 PA14 O 用户定义 LED 输出控制信号PC22 PC22 O 用户定义 LED 输出控制信号PC23 PC23 O 用户定义 LED 输出控制信号PC24 PC24 O 用户定义 LED 输出控制信号PC26 PC26 O 用户定义 LED 输出控制信号PA19 AD_INT I A/D中断请求信号PC20 PC14 I 4x4键盘ROW信号PC21 PC15 I 4x4键盘ROW信号PC25 PA0 I 4x4键盘ROW信号PC27 PC13 I 4x4键盘ROW信号PC28 PC28 O 4x4键盘COL信号PC29 PC29 O 4x4键盘COL信号PC30 PC30 O 4x4键盘COL信号PC31 PC31 O 4x4键盘COL信号PC19 PC19 I USB host 插入检测信号PA16 I2C_SCL I CAN 总线接收缓冲器RXB0中断信号

Page 52: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书PA15 I2C_SDA I CAN 总线接收缓冲器RXB1中断信号PA1 MX1_TIN O AT93C46片选信号线PA2 MX1_PWM O AT93C46时钟信号线PA23 MX1_#CS5 O AT93C46数据输入信号线PD31 TMR2OUT I AT93C46数据输出信号线

3.2.3 中断定义

MC9328MX1 各个GPIO作为输入时,都可作为独立中断源使用。同时每个中断源都有独立的寄存器设置以配置相应中断的触发方式以及是否屏蔽。系统中使用了 15个外部中断申请:以太网卡中断申请、CAN 总线中断申请、A/D模块中断申请、键盘中断申请及按键组中断申请。

MC9328MX1 管脚 信号 描述PB14 MX1_IRQ 以太网卡中断请求信号PA19 AD_INT A/D中断请求信号PC13 SPI_READ

Y CAN 总线中断请求信号PA16 I2C_SCL CAN 总线接收缓冲器 RXB0中断信

号PA15 I2C_SDA CAN 总线接收缓冲器 RXB1中断信

号PC20 KEY_R1 4x4键盘ROW信号

Page 53: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书PC25 KEY_R2 4x4键盘ROW信号PA21 KEY_R3 4x4键盘ROW信号PC27 KEY_R4 4x4键盘ROW信号PA3~PA10 SWITCH1~

8 按键组中断请求信号

3.2.4 MC9328MX1微处理器

MC9328MX1包含一个ARM 32位 RISC 微处理器,核心是包含有ARM9 微处理器、MMU以及Cache(由16KB指令Cache及16KB数据Cache组成)的一个ARM920T 处理单元。MC9328MX1 核运行在1.8V,最高时钟可达200MHz。3.2.5 SDRAM

32MB SDRAM 内存映射为一个单独的32位存储器,访问时间是10ns。这个空间由一对 8Mx16bit SDRAM芯片组成。尽管EMOTION ARM9 LINUX 教学实验系统设计内存(即SDRAM)为32 MB,但由于MC9328MX1的可兼容性,其他方案的SDRAM组合(如2x4Mx16bit, 2x16Mx16bit)也可使用。3.2.6 FLASH

EMOTION ARM9 LINUX 教学实验系统,采用了两片FLASH memory 芯片,共8MBytes,32 位宽。两片芯片都用32Mbit Intel Boot Block 器件,访问时间是120ns。EMOTION ARM9 LINUX 教学实验系统在内存区域适合于2 wait-state 操作编程。MC9328MX1由nCS0所寻址的FLASH地址空间可达32MB。

Page 54: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书3.2.7 Clocks

EMOTION ARM9 LINUX 教学实验系统使用单一32KHz时钟源。32KHz时钟输入MC9328MX1后,先经过预倍频(Premultiplier) PLL倍频后达到16.384MHz,并输入到System PLL及MCU PLL。MCU PLL可将输入的16.384MHz倍频到最高192MHz,提供给CPU核使用。System PLL将输入的16.384MHz倍频到96MHz,提供给EIM及外围模块使用。

3.2.8 System set

EMOTION ARM9 LINUX 教 学 实 验 系 统 使 用 两 种 复 位 信 号 :POR、nRESET_IN。POR为高电平有效,高电平应至少保持 4个 32KHz时钟周期。POR 是最原始的复位信号,当电源刚刚加到核心板上时被激活,用以复位整个MC9328MX1芯片。nRESET_IN 是用户复位,低电平有效,低电平应至少保持4 个 32KHz 时钟周期,用以复位除了复位模块和时钟控制模块外的整个MC9328MX1 芯片。核心板按键 S7 为系统复位按键,按下 S7 则产 生nRESET_IN信号复位系统。

3.2.9 JTAG 接口

用以进行系统仿真或 Flash写入操作。EMOTION ARM9 LINUX 教学实验系统提供一个 JTAG接插口 J31,其管脚定义如下:

J31 管脚 JTAG 功能模组 相关说明

Page 55: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书1 3.3V 电源 JTAG 电源输出2 NC 保留3 TRST_B(入) JTAG复位输入4 GND 电源地5 TDI JTAG数据输入6 GND 电源地7 TMS JTAG模式控制8 GND 电源地9 TCK JTAG时钟10 GND 电源地11 GND 电源地12 GND 电源地13 TDO JTAG数据输出14 GND 电源地15 RESET_IN(出) 目标复位16 GND 电源地17 NC 保留18 GND 电源地19 NC 保留20 GND 电源地

Page 56: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

3.2.10 UART1 接口

串口 UART1 在调试时用以与 PC 机通信。复位后 UART1 波特率为115200bps。UART1接插口为 J48,其管脚定义如下:

J48 管脚 UART1 功能 相关说明1 NC 保留2 Tx UART数据发送端3 Rx UART数据接收端4 NC 保留5 GND 信号地6 NC 保留7 NC 保留8 NC 保留9 NC 保留

3.2.11 Audio CODEC 接口

EMOTION ARM9 LINUX 教学实验系统提供一个24位高质量立体声DAC

芯片CS4340。其输出通过音频运算放大器,可提供105mW立体声驱动耳机和单声道驱动扬声器输出。音频解码原理框图如下:

Page 57: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

3.2.12 系统资源接口

EMOTION ARM9 LINUX 教学实验系统分为核心板及扩展板两部分,采用上下层叠方式连接。连接所使用的插针(核心板 J1~J5)与插槽(扩展板J1~J5)将核心板MC9328MX1的信号连接到扩展板。

因此接插口分为 5 组:核心板 J1与扩展板 J1;核心板 J2与扩展板 J2;核心板 J3与扩展板 J3;核心板 J4与扩展板 J4;核心板 J5与扩展板 J5;每一组的管脚定义完全一致,列表如下:

核心板 J1与扩展板 J1:

管脚 信号 描述1 GND 系统地线2 GND 系统地线3 GND 系统地线

Page 58: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书4 GND 系统地线5 MX1_#CS5

MC9328MX1片选线 5(用作GPIO)6 RESET_IN 复位信号线7 MX1_#OE

MC9328MX1 读有效信号8 MX1_#RW

MC9328MX1写有效信号9 MX1_#CS4

MC9328MX1片选线 410 MX1_#EB3

MC9328MX1最低 8 位写有效信号11 AD_INT A/D模块中断申请线12 MX1_#CS3

MC9328MX1片选线 313 GND 系统地线14 GND 系统地线15 GND 系统地线16 GND 系统地线17 MX1_#CS0

MC9328MX1片选线 018 MX1_#CS1

MC9328MX1片选线 119 MX1_D00

MC9328MX1数据线 D020 MX1_D01

MC9328MX1数据线 D121 MX1_D02

MC9328MX1数据线 D222 MX1_D03

MC9328MX1数据线 D323 MX1_D04

MC9328MX1数据线 D424 MX1_D05

MC9328MX1数据线 D5

Page 59: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书25 MX1_D06

MC9328MX1数据线 D626 MX1_D07

MC9328MX1数据线 D727 MX1_D08

MC9328MX1数据线 D828 MX1_D09

MC9328MX1数据线 D929 MX1_D10

MC9328MX1数据线 D1030 MX1_D11

MC9328MX1数据线 D1131 MX1_D12

MC9328MX1数据线 D1232 MX1_D13

MC9328MX1数据线 D1333 MX1_D14

MC9328MX1数据线 D1434 MX1_D15

MC9328MX1数据线 D1535 MX1_#EB1 MC9328MX1 次高 8 位写有效信号36 MX1_#EB2

MC9328MX1 次低 8 位写有效信号37 MX1_A00

MC9328MX1 地址线 A038 MX1_A01

MC9328MX1 地址线 A139 MX1_A02

MC9328MX1 地址线 A240 MX1_A03

MC9328MX1 地址线 A3

核心板 J2与扩展板 J2:

管脚 信号 描述1 MX1_D16

MC9328MX1数据线 D162 MX1_D17

MC9328MX1数据线 D17

Page 60: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书3 MX1_D18

MC9328MX1数据线 D184 MX1_D19

MC9328MX1数据线 D195 MX1_D20

MC9328MX1数据线 D206 MX1_D21

MC9328MX1数据线 D217 MX1_D22

MC9328MX1数据线 D228 MX1_D23

MC9328MX1数据线 D239 GND 系统地线10 GND 系统地线11 MX1_D24

MC9328MX1数据线 D2412 MX1_D25

MC9328MX1数据线 D2513 MX1_D26

MC9328MX1数据线 D2614 MX1_D27

MC9328MX1数据线 D2715 MX1_D28

MC9328MX1数据线 D2816 MX1_D29

MC9328MX1数据线 D2917 MX1_D30

MC9328MX1数据线 D3018 MX1_D31

MC9328MX1数据线 D3119 GND 系统地线20 GND 系统地线21 NET_RESET 网卡复位信号22 MX1_IRQ 网卡中断申请信号23 I2C_SCL I2C接口时钟线

Page 61: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书24 I2C_SDA I2C接口数据线25 SPI_MOSI SPI接口数据线26 SPI_MISO SPI接口数据线27 SPI_#SS SPI接口同步控制线28 SPI_SCLK SPI接口时钟线29 SPI_RDY SPI接口等待接收线30 MX1_A24

MC9328MX1 地址线 A2431 GND 系统地线32 GND 系统地线33 NC 保留34 NC 保留35 MS_PI1 Memory Stick通用输入线 136 MS_PI0 Memory Stick通用输入线 037 MS_CLKI Memory Stick 外部时钟输入38 MS_CLKO Memory Stick 内部时钟输出39 MS_SDIO Memory Stick 串行数据线40 MS_BS Memory Stick 串行总线控制信号

核心板 J3与扩展板 J3:

管脚 信号 描述1 +5V +5V 电源,作为核心板电源输入

Page 62: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书2 +5V +5V 电源,作为核心板电源输入3 +5V +5V 电源,作为核心板电源输入4 +5V +5V 电源,作为核心板电源输入5 PA3

MC9328MX1 通用 I/O引脚 PA36 PA4

MC9328MX1 通用 I/O引脚 PA47 PA5

MC9328MX1 通用 I/O引脚 PA58 PA6

MC9328MX1 通用 I/O引脚 PA69 PA7

MC9328MX1 通用 I/O引脚 PA710 PA8

MC9328MX1 通用 I/O引脚 PA811 PA9

MC9328MX1 通用 I/O引脚 PA912 PA10

MC9328MX1 通用 I/O引脚 PA1013 PA11

MC9328MX1 通用 I/O引脚 PA1114 PA12

MC9328MX1 通用 I/O引脚 PA1215 PA13

MC9328MX1 通用 I/O引脚 PA1316 PA14

MC9328MX1 通用 I/O引脚 PA1417 GND 系统地线18 GND 系统地线19 LCD_D0

MC9328MX1 显示驱动数据线 D020 LCD_D1

MC9328MX1 显示驱动数据线 D121 LCD_D2

MC9328MX1 显示驱动数据线 D222 LCD_D3

MC9328MX1 显示驱动数据线 D3

Page 63: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书23 LCD_D4

MC9328MX1 显示驱动数据线 D424 LCD_D5

MC9328MX1 显示驱动数据线 D525 LCD_D6

MC9328MX1 显示驱动数据线 D626 LCD_D7

MC9328MX1 显示驱动数据线 D727 LCD_VSYNC

MC9328MX1 LCD 显示垂直同步信号28 LCD_HSYNC

MC9328MX1 LCD 显示水平同步信号29 LCD_LSCLK

MC9328MX1 LCD 显示时钟30 LCD_ACD

MC9328MX1 LCD 显示 ACD信号31 LCD_DISP

MC9328MX1 LCD 显示 Enable信号32 RESET 外部复位输入信号33 RIGHT 触摸屏模拟量输入信号34 BOTTOM 触摸屏模拟量输入信号35 LEFT 触摸屏模拟量输入信号36 TOP 触摸屏模拟量输入信号37 GND 系统地线38 GND 系统地线39 NC 保留40 NC 保留

核心板 J4与扩展板 J4:

管脚 信号 描述

Page 64: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书1 PC28

MC9328MX1 通用 I/O引脚 PC282 PC29

MC9328MX1 通用 I/O引脚 PC293 PC30

MC9328MX1 通用 I/O引脚 PC304 PC31

MC9328MX1 通用 I/O引脚 PC315 AOUTL 左声道模拟音频信号6 AOUTR 右声道模拟音频信号7 TDO JTAG 调试口数据输出线8 TMS JTAG 调试口模式选择线9 TDI JTAG 调试口数据输入线10 TCK JTAG 调试口时钟线11 RESET_IN 复位信号线12 BOOT 启动模式信号线13 UART1_RXD UART1数据接收线14 TRST_B JTAG 调试口复位信号线15 PC19

MC9328MX1 通用 I/O引脚 PC1916 UART1_TXD UART1数据发送线17 MIP 麦克风正极性输入线18 MIM 麦克风负极性输入线19 PC2_DCD UART2接口载波线20 PC2_RI UART2接口振铃线21 PC2_TXD UART2接口数据发送线

Page 65: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书22 PC2_RXD UART2接口数据接收线23 PC2_RTS UART2接口发送请求线24 PC2_CTS UART2接口清除发送线25 GND 系统地线26 GND 系统地线27 USB_VMO Single-Ended USB接口线 VMO28 USB_VPO Single-Ended USB接口线 VPO29 USB_VM Single-Ended USB接口线 VM30 USB_VP Single-Ended USB接口线 VP31 USB_SUS Single-Ended USB接口线 SUSPEND32 USB_RCV Single-Ended USB接口线 RCV33 USB_#OE Single-Ended USB接口线#OE34 USB_AFE Single-Ended USB接口线 AFE35 GND 系统地线36 GND 系统地线37 UIN 电压输入负极信号线38 UIP 电压输入正极信号线39 GND 系统地线40 GND 系统地线

核心板 J5与扩展板 J5:

Page 66: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

管脚 信号 描述1 PC24

MC9328MX1 通用 I/O引脚 PC242 PC26

MC9328MX1 通用 I/O引脚 PC263 PC22

MC9328MX1 通用 I/O引脚 PC224 PC23

MC9328MX1 通用 I/O引脚 PC235 PC20

MC9328MX1 通用 I/O引脚 PC206 PC25

MC9328MX1 通用 I/O引脚 PC257 PC21

MC9328MX1 通用 I/O引脚 PC218 PC27

MC9328MX1 通用 I/O引脚 PC279 GND 系统地线10 GND 系统地线

3.2.13 10-BaseT 以太网卡

EMOTION ARM9 LINUX 教学实验系统的以太网控制器是一个Cirrus Logic

CS8900A 10Base-T 类型控制器。EMOTION ARM9 LINUX 教学实验系统使用I/O映射寄存器接口。Cirrus Logic CS8900A I/O映射寄存器接口仅使用8个16bit

寄存器即可寻址全部的地址空间。以太网控制器的初始地址为0x15000300。

以太网卡原理框图如下图所示:

Page 67: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

网络连接及数据收发状态由 LED指示,指示灯 LED1 表示 Link 状态;指示灯 LED2 表示 Lan 状态。

以太网接口 J37(RJ45)信号定义见下表,其他管脚悬空

J37 管脚 符号 备注1

TX+ 模拟输出+

2TX- 模拟输出-

3RX+ 模拟输入+

6RX- 模拟输入-

3.2.14 LCD 显示模块

EMOTION ARM9 LINUX 教 学 实 验 系 统 使 用 Kyocera 公 司 的KCS057QV1AJ液晶屏。该液晶屏最大分辨率为:320×240,采用彩色 STN制式,使用 CCFL背光(详细资料见 LCD的 PDF技术手册)。在系统中 LCD数据总线

Page 68: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

由 MC9328MX1的 LCD_D0~LCD_D7 经过总线驱动芯片驱动后提供给 LCD,控制总线由 MC9328MX1 控制总线经过总线驱动芯片后提供给 LCD。

LCD背光管的电源部分由逆变器将直流电源转换为交流电源后提供,可通过按键K1 打开或关断 LCD的电源及背光管的电源。

EMOTION ARM9 LINUX 教学实验系统对 LCD模块的接口进行了特殊的冗余设计,提供了除所选液晶屏配置外更加丰富的接口设置。用户可利用这些接口非常方便的连接其他厂家的 STN LCD屏(如南亚公司的 LCBA7_461液晶屏等)。同时系统还提供了触摸屏接口,可使用户进行更多系统功能的开发。LCD模块原理框图:

Page 69: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

LCD 显示屏接口线与扩展板通过 18 针插槽 J18 连接。插槽 J18管脚定义如下:

J18 管脚 功能 相关说明1 +5V +5V 电源,供 LCD使用2 GND 系统地线3 LCD_VEE LCD +24V 电源4 LCD_VEE LCD +24V 电源5 VL_D7

MC9328MX1 显示驱动数据线 D76 VL_D6

MC9328MX1 显示驱动数据线 D67 VL_D5

MC9328MX1 显示驱动数据线 D58 VL_D4

MC9328MX1 显示驱动数据线 D49 VL_D3

MC9328MX1 显示驱动数据线 D310 VL_D2

MC9328MX1 显示驱动数据线 D211 VL_D1

MC9328MX1 显示驱动数据线 D112 VL_D0

MC9328MX1 显示驱动数据线 D013 VL_VSYNC

MC9328MX1 显示垂直同步信号14 VL_HSYNC

MC9328MX1 显示水平同步信号15 VL_LSCLK

MC9328MX1 显示时钟16 +5V +5V 电源,供 LCD使用17 GND 系统地线18 GND 系统地线

Page 70: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

LCD 背光模块的电源由逆变器提供,逆变器 NBQ1固定于扩展板上,将背光模块电源插头接入逆变器即可。

EMOTION ARM9 LINUX 教学实验系统利用 CPU自身的 ASP模块,可直接完成触摸屏输入的转换。因此系统提供了一个触摸屏接口 J39。J39管脚定义如下:

J39 管脚 功能 相关说明1 LEFT 触摸屏 LEFT 输入2 TOP 触摸屏 TOP 输入3 RIGHT 触摸屏RIGHT 输入4 BOTTOM 触摸屏BOTTOM 输入

EMOTION ARM9 LINUX 教学实验系统提供一个按键来控制逆变器的直流电源输入。按键 K1完成逆变器直流电源输入的开启和关闭。

3.2.15 4x4 键盘模块

EMOTION ARM9 LINUX 教学实验系统提供了 8个 GPIO口。可由这 8个GPIO进行键盘扫描,根据获得的 GPIO端口状态来判断那个键触发。最大扫描阵列为 4×4。以MC9328MX1的 PC28、PC29、PC30、PC31作为列输出驱动COL0-3,用MC9328MX1的 PC20、PC25、PC21、PC27作为行扫描线 ROW0-3。

Page 71: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

列线的上拉方式由跳线 J11进行选择,连通 1、2选择上拉方式,连通 2、3选择下拉方式。

键盘模块原理框图:

3.2.16 LED 显示模块

EMOTION ARM9 LINUX 教学实验系统的 LED发光模块由 8个红、绿、黄LED灯组成,通过驱动 U8(总线驱动器)端口输出状态就可以控制 LED点亮或熄灭。使用 MX1的 GPIO口线(PA11~PA14,PC22~PC24,PC26)进行LED 亮灭控制。

LED发光模块原理框图:

Page 72: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

3.2.17 开关量输入模块EMOTION ARM9 LINUX 教学实验系统的开关量模块采用 8个带 LED指示灯的按键组

成。K2、K3、K4、K5按键为带自锁按键,K6、K7、K8、K9键为不带自锁的按键。触发K2 、K3、K4、K5键后处于锁定状态,输出 3.3V 电平,LED 处于点亮状态。再次触发K2、K3、K4、K5键,输出低电平同时 LED熄灭。触发K6、K7、K8、K9键后输出 3.3V 电平同时相应 LED点亮,释放按键后输出低电平,同时 LED熄灭。开关量模块原理框图:

输出的开关量信号连接到MC9328MX1相应的GPIO端口(PA3~PA10)上。系

Page 73: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

统通过中断方式来获得开关量的状态。开关量对应的GPIO信号定义如下:

开关 GPIO 信号K2 PA9K3 PA7K4 PA5K5 PA3K6 PA4K7 PA6K8 PA8K9 PA10

3.2.18 信号源功能模块

EMOTION ARM9 LINUX 教学实验系统配有信号发生器芯片 ICL8038(可参阅附件中的 PDF技术手册),可产生方波、正弦波和三角波。ICL8038的输出可为模数转换电路提供模拟信号。在该实验系统中,可通过调节电位器 RW2来调整输出信号的频率(频率范围:0.001~300KHz)、通过调节电位器 RW4来调整输出信号的占空比,通过调节电位器 RW1来调整输出信号的失真度。信号源功能模块原理框图如下:

Page 74: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

信号源发生器输出的方波信号直接连接到插槽 J8上。信号发生器所产生的三角波及正弦波信号幅度不在系统 A/D模数转换模块的测量范围之内,所以三角波及正弦波信号需经集成运算放大器进行整形,整形后的信号输出到插槽 J8上。信号源输出接插件 J8信号定义如下:

J8 管脚 功能 相关说明1 SQUA 方波输出端2 GND 信号地线3 TRIA 三角波输出端4 GND 信号地线5 SINE 正弦波输出端

Page 75: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

注:在配备的系统中信号失真度调整电位器已经调节好,在使用过程中如果没有辅助测量设备请不要随便调节电位器 RW1。输出信号占空比电位器 RW2的阻值已经调节好,在使用过程中如果没有辅助测量设备请不要随便调节电位器 RW2。

3.2.19 A/D模数转换模块

A/D数模转换芯片采用 ADC0809芯片,该芯片分辨率为 8 位,转换精度为1/2LSB,模拟量输入通道为 8 路。输出的数字量计算公式为:N=[(Vimn-Vref-)/(Vref+-Vref-)]×256。EMOTION ARM9 LINUX 教学实验系统中Vref+为5V(误差正负 2%),Vref-为 0,所以公式可简化为:N=Vimn/5×256。ADC0809

的模拟量输入引脚与接插件 J7 连接。ADC0809的模拟量输入端通过插针排线连接的方式与信号源接插件 J8 连接(在板子背面已连好)。ADC0809技术手册见芯片手册 PDF文档附件。A /D数模转换模块原理框图:

Page 76: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

输入接插件 J7的信号定义如下:

J7 管脚 信号名 模拟信号说明 相关说明1 AD_SQUA 方波 AD0809 输入通道 02 GND 信号地 无3 AD_TRA 三角波 AD0809 输入通道 14 GND 信号地 无5 AD_SIN 正弦波 AD0809 输入通道 26 GND 信号地 无7 AD_DAC_OU

T DAC模块的输出 AD0809 输入通道 3

Page 77: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书8 GND 信号地 无9 AD_DC_JUS

T 直流电压信号 AD0809 输入通道 4

使用说明:(1) ADC0809模拟量输入通道的选择由地址总线进行控制。(2) 直流模拟电压输出信号的幅值可通过调节电位器 RW5来进行调

整。(3) # INT 由 ADC0809 EOC 信号产 生,通过逻辑转换后连接到

MC9328MX1的GPIO端口 PA19上。

为便于测量观察,ADC0809的五路模拟输入信号分别连接到测量点 J13

(方波信号)、J14(三角波信号)、J16(正弦波信号)、J17(DAC模块的输出)、J19(直流电压信号),并提供信号测量地接触点 J20、J21。

3.2.20 D/A 数模转换模块

数模转换采用 DAC0832 芯片,该芯片分辨率为 8 位,转换精度为1/2LSB,在 EMOTION ARM9 LINUX 教学实验系统中,输出电压(Vo)范围为 0至 5V,具体计算公式为:Vo = -Vref×(输入数字量/256),在本系统中参考电压(Vref)为-4.7V(误差正负 2%)。输出的电压经过集成运算放大器反向后产生一路范围为 0 至+4.7V 的电 压输 出。模拟输出 连接至接插器件 J9 上 。DAC0832技术手册见芯片手册 PDF文档附件。D/A数模转换模块原理框图:

Page 78: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

3.2.21 RS-232 通讯模块

MC9328MX1中的 UART通讯电路采用 LVTTL逻辑电平,2V~3.3V 电平是 LVTTL的标准逻辑“1”, 0V~0.4V为其标准逻辑“0”。而 RS-232采用负逻辑方式,-5V ~ -12V 电平为其标准逻辑“1”,+5V~+12V 电平为其标准逻辑“0”。MC9328MX1 提供两个UART通讯口,UART1、UART2与 RS-232逻辑电平的转换电路在扩展板上实现。

RS232通讯模块原理框图:

UART1采用 3 线制通讯方式,其通讯引脚由标准 DB9接插件 J48引出,连

Page 79: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

接件 J48信号定义如下:

J24 管脚 功能 相关说明1 NC 悬空2 TXD UART1信号发送线3 RXD UART1信号接收线4 NC 悬空5 GND 信号地线6 NC 悬空7 NC 悬空8 NC 悬空9 NC 悬空

UART2采用 9 线制通讯方式,其通讯引脚由标准 DB9接插件 J24引出,连接件 J24信号定义如下:

J24 管脚 功能 相关说明1 DCD UART2载波信号2 TXD UART2信号发送线3 RXD UART2信号接收线4 DSR UART2数据设备准备好5 GND 信号地线

Page 80: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书6 DTR UART2数据终端准备好7 CTS UART2 清除发送信号8 RTS UART2请求发送信号9 RI UART2振铃信号

3.2.22 Slave USB 接口

EMOTION ARM9 LINUX 教学实验系统提供一个Slave USB1.1接口。由于MC9328MX1内置了一个Single-Ended USB模块,所以需要通过外接一个Philips 公司的transceiver PDIUSBP11A来进行收发数据的电平转换。功能框图如下:

Slave USB通信接口为 J27,其管脚定义如下:

J27 管脚 功能 相关说明

Page 81: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书1 +5V USB host +5V 电源线2 D- USB差分信号负3 D+ USB差分信号正4 GND 系统地线

3.2.23 功能扩展接口

为使用户能更灵活的在 EMOTION ARM9 LINUX 教学实验系统的基础上进行二次开发,核心板在不影响原有功能的前提下,尽量将MC9328MX1的管脚线引出。这些引脚线连接至核心板接口 J9、J10、J14。接口 J9 扩展了 LCD 接口,使得核心板可直接驱动 SHARP 公司的

LQ035Q7DB02 TFT彩色液晶屏或通过时序转换后驱动其他型号的 TFT彩屏。接口 J9的管脚定义如下:

J9 管脚 功能 相关说明1 LCD_D8 LCD数据线 D82 LCD_D9 LCD数据线 D93 LCD_D10 LCD数据线 D104 LCD_D11 LCD数据线 D115 LCD_D12 LCD数据线 D126 LCD_D13 LCD数据线 D13

Page 82: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书7 LCD_D14 LCD数据线 D148 LCD_D15 LCD数据线 D159 LCD_SPL_SPR SHARP专用控制线 SPL_SPR10 LCD_REV SHARP专用控制线 REV

接口 J10为 SDRAM 控制总线及杂项信号接口,它连接了 SDRAM的所有控制线,便于用户连接逻辑分析仪观测 SDRAM的操作情况,使得用户在二次开发时能更快排除总线上产生的故障。接口 J10管脚定义如下

J10 管脚 功能 相关说明1 MX1_DQM2 MX1数据屏蔽线 22 MX1_DQM3 MX1数据屏蔽线 33 MX1_DQM0 MX1数据屏蔽线 04 MX1_DQM1 MX1数据屏蔽线 15 MX1_#SDWE SDRAM写有效控制线6 MX1_#EB FLASH 读有效控制线7 MX1_#RAS SDRAM行同步控制线8 MX1_#CAS SDRAM 列同步控制线9 GND 系统地线10 GND 系统地线11 MX1_#CS2 SDRAM片选控制线12 MX1_#CS5 MX1片选线 CS5

Page 83: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书13 MX1_SDCLK SDRAM时钟输入线14 MX1_SDCKE0 SDRAM时钟使能控制线 015 MX1_MA10 SDRAM 地址线 MA1016 MX1_MA11 SDRAM 地址线 MA1117 MX1_CLKO MX1系统时钟输出监测端18 MX1_PWM MX1脉冲宽度调节输出19 MX1_TIN MX1时钟计数输入20 TMR2OUT MX1实时时钟输出

接口 J34为MC9328MX1内部 9bit辅助低压 A/D转换通道输入接口。转换速率为 9.6KHz,电压输入范围-1.8V~0V、0V~+1.8V。J16管脚定义如下

J34 管脚 信号 功能说明1 UIN A/D模块负电压测量端2 GND 系统地线3 UIP A/D模块正电压测量端

3.3 实验开发系统的软件组织结构

实验箱中的软件部分包括了 3个主要功能部分blob --------- 系统引导程序,负责初始化硬件和引导内核

Page 84: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

kernel --------- LINUX内核,LINUX运行的核心usos --------- UCOS系统内核fs --------- 文件系统 ,用来存储文件,相当于硬盘这三部分都写入 FLASH存储器中,断电不丢失,并可修改。

类型 起始地址 结束地址 大小 功能描述 备注Eram 0x00300000 0x0031ffff 128K

Kernel用作 framebuffer MX1 片 内RAM

Sdram 0x08000000 0x09ffffff 32MKernel管理

Flash 0x10000000 0x1003ffff 256K 存放 blob程序0x10004000 0x1007ffff 256K 存放所需参数0x10080000 0x103fffff 3.5M 存放 kernel

0x10280000 0x103fffff 1.5M 存放 uscos

0x10400000 0x107fffff 4M 存放文件系统

第四章 内核模块实验

4.1 实验目的

(1) 了解什么是 Linux内核模块,学习驱动程序模块的结构(2) 编写,装载和卸载驱动程序模块

Page 85: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

4.2 系统资源配置

(1) 嵌入式 EM-ARM9实验系统(2) 已安装ARM交叉编译器的 LINUX环境

4.3 实验原理

本实验编写一个最简单的 LINUX 内核模块然后编译它,将编译好的模块下载到实验箱中,随后将该模块插入内核,然后从内核卸载。

4.4 实验内容

编写一个 LINUX MODULE,该 MODULE在初始化的时候在控制台上打印 Hello, world! 将写好的程序编译,然后下载到实验箱中,加载然后卸载。

4.5 实验步骤

1)建立并编辑module.c文件# vim module.c

文件的内容如下:#define MODULE

#include <linux/module.h>

int init_module(void)

{

Page 86: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书printk("hello\n");

return 0;

}

void cleanup(void)

{;}

2)编译:在 LINUX环境下执行# arm-linux-gcc -c module.c 命令执行完毕后,在当前目录下我们可以

得到module.o文件。/usr/local/src/src/module.tgz 是示例代码的压缩包,可以用 # tar zxvf moudule.tgz 解开。/usr/local/src/bin/module.o是已经编译好的二进制文件可以直接下载运行。

3) 正确连接试验设备,并确保 J15没有短接。连接实验箱UART 1与 PC的串口。

4) 在 LINUX 环境下执行minicom(在windows环境下则启动超级终端), #

minicom. 请确认先前已经配置MINICOM的波特率为 115200,8个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。按照屏幕提示按任意键。然后在MINICOM中输入 blob>ldrboot

kernel 启动实验箱上的 LINUX,按屏幕提示按回车。然后在MINICOM上输入 #cd /tmp.

5) 下载模块:在MINICOM中键入 # zmrx 。在MINICOM中按 CTRL+A 然后按 S键,然后选择以ZMODEM 协议发送我们在第一步编译得到的

Page 87: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

module.o文件。或者参考 2.2节描述,采用 FTP或者USB方式下载module.o文件。

6)装载模块:在MINICOM中输入 # insmod module.o

7) 此时可以看到MINICOM上显示“Hello, world!”,表明我们的模块已经被执行了.

8) 此时在minicom中执行 # lsmod 该命令列出已经被动态加载到内核的驱动和内核模块。可以看到其中就有我们装载的module.

9) (7)卸载模块:装载模块:在MINICOM中输入 # rmmod module

10)此时在minicom中执行 # lsmod,可以看到module 已经不存在了。

实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

第五章 开关量实验

5.1 实验目的

(1) 了解什么是开关量输入输出(2) 学习 GPIO的配置和操作(3) 学习 GPIO中断原理(4) 学习编写 LINUX MODULE

(5) 学习如何在 LINUX MODULE中编写中断服务程序

Page 88: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

5.2 系统资源配置

(1) 嵌入式 EM-ARM9实验系统(2) 实验占用资源

MX1内部 11号中断源 GPIO 输入和 LED硬件详细描述请参考 3.2.16和 3.2.17节

5.3 实验原理

5.3.1 GPIO 的原理

从图中可以看出,通过配置MX1内部 GIUS—X相应的寄存器就可以将片外引脚的连接(逻辑上的)到不同的功能线上。这样就做到了引脚的复用。当引脚配置为 GPIO后,还需要进一步配置该引脚作为输入引脚还是作为输出

Page 89: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

引脚,这将决定在逻辑上该引脚内部连接到输入数据寄存器还是输出数据寄存器。如果作为输入引脚,引脚上的电平状态会即时被写入输入数据寄存器。如果作为输出引脚,写入输出数据寄存器的内容就会以逻辑电平的形式即时反映到引脚外部。

5.3.2 硬件原理

参考原理图,明确 K2~K9 LED3~LED10对应的 gpio如下:LED3 -> PA11LED4 -> PA12LED5 -> PA13LED6 -> PA14LED7 -> PC24LED8 -> PC26LED9 -> PC22LED10 -> PC23

KEY2 -> PA9KEY3 -> PA7KEY4 -> PA5KEY5 -> PA3KEY6 -> PA4KEY7 -> PA6KEY8 -> PA8KEY9 -> PA10

KEY2~KEY9按下的时候会在与之连接的MX1对应的 GPIO引脚上产生低电平, KEY2~KEY9抬起的时候会在与之连接的MX1对应的GPIO引脚上产生高电平。经过软件配置后,MX1可以根据这个电平变化产生中断。当中断产生后,软件可以查询是哪个引脚产生的中断,并且驱动与 LED相连的 GPIO 输出高电平,点亮对应的 LED灯。

Page 90: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

5.3.3 软件实现原理

在本实验中,我们将 POART A11:14 POART C22:24 POART C26这 8

个引脚配置为GPIO 输出引脚,用来控制 LED的状态。POART 3 ~ POART A

10这 8个引脚 P配置为GPIO 输入功能,并配置为低电平触发中断。当这 8个引脚的任意一个产生都会产生 11号中断并进入中断服务程序,在中断服务程序中根据中断状态寄存器 ISR,可以判断是哪个引脚产生的中断。然后我们想对应的输出引脚的DR 寄存器写入 1,控制该输出引脚输出低电平,从而点亮对应的 LED。

5.4 实验内容

(1) 编写一个 linux moudle, 用 K2~K9为开关量输入 编写中断服务程序,要求在中断服务程序中判断是哪个按键按下,然后点亮对应的 LED。要求的对应关系必须是:K2 <-> LED3K3 <-> LED4K4 <-> LED5K5 <-> LED6K6 <-> LED7K7 <-> LED8K8 <-> LED9K9 <-> LED10

(2) 编写一个makefile文件用来编译实验程序,要求使用-I(指定头文件路

Page 91: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

径选项)并使用宏变量表示头文件路径。在这个实验环境中交叉编译器的 LINUX 头文件路径 /usr/local/src/linux/include GLIBC 库头文件路径/skiff/local/lib/gcc-lib/arm-linux/2.95.2/include

(3)将编译好的程序下载到实验箱中加载,按下K2~K9 观察对应的 LED3~LED10是否点亮。

5.5 实验步骤

1) 1在 LINUX 下编辑实验程序,并将编译成 io.o文件。2) /usr/local/src/src/io.tgz是本实验的示例代码,可以用 # tar zxvfio.tgz 解开 。

/usr/local/src/bin/i.o是编译好的二进制代码,可以直接下载运行。3) 执行 # make编译4) 正确连接试验设备,并确保 J15没有短接。5) 在 LINUX 环境下执行# minicom. 配置MINICOM的波特率为 115200,8

个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。在MINICOM中输入 #ldrboot kernel 启动实验箱上的 LINUX,按屏幕提示按回车。然后在 MINICOM上输入 #cd /tmp.在MINICOM中键入 # zmrx 。在MINICOM中按 CTRL+A 然后按 S键,选择以ZMODem 协议发送我们在第一步编译得到的 Io.o文件。或者参考第二章说明,采用 FTP、USB方式下载 io.o文件。

6) 加载模块:在MINICOM中输入 # insmod io.o

7) 测试模块:按下 K2~K9, 观察 LED3~LED10是否遵照实验要求点亮。

Page 92: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

8) 卸载模块:在MINICOM中输入 # rmmod io

9) 实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

Page 93: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第六章 键盘实验

6.1 实验目的

(1) 了解键盘扫描原理;(2) 学习编写内核驱动程序;(3) 学习编写带有中断处理的设备驱动程序;(4) 编写应用程序调用设备驱动程序;

6.2 系统资源配置

(1) 嵌入式 EM-ARM9实验系统( 2 ) PC28 、 PC29 、 PC30 、 PC31 分 别 作 为 列 输 出 驱 动COL0~ROW3,PC20 、PC25、PC21、PC27分别作为行扫描线 ROW0~ROW3。(3) 键盘硬件详细描述见 3.2.15节。

6.3 实验原理

6.3.1 键盘实现原理

键盘中有无键按下是由列线和行线的状态所决定的,令全部与行线连接GPIO引脚输出低电平,将全部与列线连接的 GPIO引脚配置为输入功能,并且可由下降沿触发。当有按键按下时,对应的列线就会产生中断。在中断服务程序

Page 94: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

中判断是哪个列线产生中断。随后中断服务程序依次将各个行线变高,并读取产生中断的那条列线的输入值。由上图可知,仅当被按下按键那行变高时,产生中断的那条列线的输入值才会变高。从而完整的判断出被按下按键的行列值。需要注意的是硬件电路不提供去抖电路,需要软件合理的实现。

被按下键的扫描代码通常放置在一个缓冲区内,直到该应用程序准备处理一个按键为止。缓冲是一个方便的特征,因为当应用程序在按键发生而不能马上处理它们时,缓冲区的使用可以防止按键的丢失。缓冲区的大小一般视应用程序的需求而定,一般而言,一个大小为 10个按键代码的缓冲区能够满足大多数情况下的要求。缓冲区的实现是以一个环行队列的形式完成的。当一个键被按下后扫描代码将被放置在队列的下个空位置上。当应用程序从该键盘模块中获取了一个扫描码后,它将被从该队列中删除掉,队列指针的第一位指向下一个扫描代码(如果有的话)。如果该队列是满的话则任何下一个按键都会被丢失。

6.3.2 键盘设备驱动程序和应用程序的设计

键盘驱动程序从工作方式上讲是一个典型的字符设备,所以按照字符设备驱动的框架来实现键盘驱动。具体而言,就是要实现 open release,select read这些调用,值得注意的是,我们并非在 read 被调用的时候才检测硬件设备,而是利用中断,随时检测硬件设备。键盘驱动程序需要完成以下功能。初始化GPIO口,注册中断服务函数,判断键值,维护键盘缓冲,向应用程序提供键值。事例程序中将 GPIO的初始化和注册中断服务函数放到初始化函数中,判断键值和维护键盘缓冲的工作由中断服务函数完成。

Page 95: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

判断的方法是,先将列扫描线全部置 0,此时如果有键按下,对应的行扫描线就会从高电平变为低电平,产生一个下降沿,我们的中断程序就是要捕捉这个下降沿。在中断服务程序中,我们查询 PORT C的中断状态寄存器就可以知道是那个行扫描线产生的下降沿,可以确定行的值。然后依次将列扫描线单独拉低,仅当有键按下的那个列线被拉低,对应的行线才会是低,从而判断出行值,然后组合成完整的键值。应用程序打开键盘设备后就可以读取该设备。而驱动会 READ方法中向应用程序提供的 BUFFER中拷贝键值。此外,示例程序还实现了 SELECT方法。初次编写驱动程序可以不理会。仅供深入学习的时候参考。键盘应用程序比较简单,打开键盘设备,通过 SELECT查询是否有数据可读,如果有那么读取键值数据并显示到控制台。

6.3 实验内容

(1) 编写一个键盘驱动程序(2) 编写一个应用程序读取键盘扫描值并显示到控制台上。(3) 在实验箱上下载并运行键盘驱动程序和应用程序。(4) 参考代码在 /usr/local/src/src/key.tgz中,可以使用 tar zcvf key.tgz 解开。二

进制代码是/usr/local/src/bin下的 key.o 和 key

6.4 实验步骤

1. 编写一个键盘驱动程序和一个键盘应用程序,并分别编译成 key.o 和 key

Page 96: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

文件。2. 正确连接试验设备,并确保 J15没有短路。连接实验箱的UART1与 PC的串口。在 LINUX 环境下执行# minicom. 请先已经配置MINICOM的波特率为115200,8个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM中执行 blob>ldrboot kernel可以看到有数据输出。按屏幕提示按回车。然后在MINICOM上输入 #cd /tmp.

3. 下载模块:在MINICOM中键入 # zmrx 。在MINICOM中按 CTRL+A 然后按 S键,然后选择以 ZMODem 协议发送我们在第一步编译得到的 key.o文件。或者参考第二章说明,采用 FTP或者USB方式下载 key.o文件。

4. 加载模块:在 MINICOM中输入 # insmod key.o 控制台上出现 using key.

5. 下载键盘测试程序:MINICOM中键入 # zmrx。在MINICOM中按 CTRL+A 然后按 S键,然后选择以ZMODem 协议发送我们在第一步编译得到的 key文件。或者参考第二章说明,采用 FTP方式下载 key文件。

6. 执行 KEY程序:在控制台中输入: # chmod +x key 将 key文件的属性改为可执行。然后在控制台中输入 # ./key 即可运行 key 程序。需要说明的是,key.o驱动注册设备的时候使用的设备号是 250,我们在文件系统的/dev目录下已经为建立了名为“key”的设备号为 250的节点,因此应用程序 key可以直接访问/dev/key。

7. 测试模块:按下K2~K9, 观察 LED3~10是否遵照实验要求点亮。8. 卸载模块:在minicom中输入 # rmmod key

9. 实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

Page 97: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第七章 A/D 实验

7.1 实验目的

(1) 了解 AD工作原理;(2) 学习编写内核驱动程序;(3) 学习编写带有中断处理的设备驱动程序;(2) 编写应用程序调用设备驱动程序;

Page 98: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(3) 学习在驱动程序中使用定时器;

7.2 系统资源配置

(1) 嵌入式 EM-ARM9实验系统(2) 数字万用表(3) A/D使用的 CPU资源,请同时以下硬件原理图(4) A/D硬件详细描述参见 3.2.19节描述。

7.3 实验原理

7.3.1模/数转换原理

模/数转换接口是数据采集系统前向通道中的一个重要环节。它实现了将一个或多个采集的模拟信号转换成数字形式,以便计算机能对其读入。模/数转换器是整个转换接口的重要一环,选择的技术指标主要有:

① 量化误差(分辨率);② 转化精度;③ 转化时间(转化速率);④ 零点温度系数和增益温度系数;⑤ 对电源电压的变化抑制比。

A/D转换器种类繁多,但目前应用较广泛的主要有三种类型:逐次逼近式

Page 99: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

双积分式 量化反馈式和并行式等种 A/D转换器。下面主要介绍前两种 A/D转换器的基本原理。

逐次逼近式 A/D转换器原理:逐次逼近式 A/D转换器电路由比较器,D/A转换器 输出锁寸器和控制逻辑

组成。其转换原理为将输入模拟电压 Uin与D/A转换器的的输出电压 Ui分别输入比较器中的 A,B端进行比较,根据 Ui大于还是小于输入模拟信号 Uin来决定增大还是减小 Ui,以便向模拟输入信号逼近。当 Ui信号与输入模拟信号Uin

相等时,向 D/A转换器输入的数字就是对应模拟输入信号的数字量。其工作过程是:比较开始时,首先对二进制计数器(输出锁存器)的最高

位置“1”,然后进行转换 比较 判断。若模拟输入 Uin大于 Ui,比较器输出为1,则使输出锁存器的最高位保持为 1。然后对较低的位依次按照该办法进行比较和调整,无论那种情况,均应继续比较下一位,直到最末位为止。此时 D/A

转换器的数字输入(输出锁存器内容)即为对应模拟输入信号的数字量。将此数字量输出就完成了 A/D转换过程。这种方法好比用天平称一个物体的重量,第一次放最大的砝码,若不合适,就改放小一号的,依次类推。一旦天平指示砝码太重说明刚才放进去的那个应当取走,显然对于 n 位的转换器,总共需要重复这种过程 n 次。逐次逼近 A/D转换器的主要优点是转换速度比较快,此外与有同样分辨的

双积分型转换器比较,它不需要高精度的运算放大器,而且成本也较低。这种形式的A/D转换器被广泛应用于各种系统中。

双积分式 A/D转换器原理双积分式 A/D转换器,一般具有精度高,抗干扰性好,价格便宜等优点,

Page 100: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

但转换速度慢。双积分式A/D转换器由电子开关,积分器 比较器 计数器和控制逻辑组成。其电路的工作原理如下:电路由外来的启动信号启动后,未知的输入模拟

电压加到积分电路进行固定时间的积分,同时计数器开始对时钟脉冲进行计数。这时计数器是作为定时器来使用的。当计满一个预先规定的固定值后(通常这段时间约为整个转换周期的三分之一),则将极性相反的标准电压加到积分电路上,积分电路从刚才积分的终值开始进行反向积分。与此同时,计数器清零并重新开始对时钟脉冲计数,直至积分器输出到达零,使计数器停止计数。这时控制逻辑电路向 CPU发出“数据有效”的状态信号。CPU可从计数器的输出端得到转换结果。输入模拟电压 Uin幅度越大,在固定时间的终了时,积分器的输出电压值也越大,因而反向积分所需的时间也越长。本实验板的 A/D转换实验硬件主要是由 ADC0809转换芯片和四个可变电

位器组成(见原理图)。ADC0809是 8 位 8通路逐次逼近式 A/D转换器,输入电压在 0~5伏,最大不可调误差小于±1LSB,它具有高速 高精度 温度依赖度底以及在长期工作条件下能耗小 重复性好等优点。ADC0809芯片的结构原理如下图。由图可看芯片主要是由一个 8 位 A/D转换器(虚框内部分) 8 路模拟输入选通开关 地址锁存及译码电路工作,和三态数据输出锁存器组成。为实现 8 路模拟通道能有条不紊的工作,首先通过地址译码锁存器选通所要开通的8 路模拟通道中的一路开关,将模拟信号送入位 A/D转换器中实现 A/D的转换,转换后的数据放到三态数据锁存器中等待 CPU来取,取后由 CPU启动新一次的地址译码,重复以上完成新一次的 A/D转换。ADC0809芯片提供了高转换速度 高精密度 环境影响小和低功耗等优点,被广泛应用于各种控制领域。

Page 101: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

图 8-1 ADC0809结构图ADC硬件原理图

Page 102: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

ADC0809有 8个通道,从原理图可知,通道 0 连接方波发生器,通道 1 连

接三角波发生器,通道 2 连接正弦波发生器,通道 3 连接DC的输出,通道 4 连

接直流输入。

7.3.2 软件实现原理

ADC0809的每一个输入通道对于 CPU而言就如同一个挂在地址和数据总线上的一个 BYTE的RAM。只不过其数据是不断更新的。从原理图可以看出,ADC

的硬件地址是:0xfd000000+通道号(ABC共组合为 8通道);因此,只要每次从 ADC0809 挂接的地址读取数据就可以得到不同通道AD转换的数值了。在这个实验里,我们特意加入了定时器作为练习。也就是我们向内核注册了一个定时器,并传递给内核一个结构来告诉内核如何使用这个定时器,我们在结构中指定了定时器到时的时候内核应该自动运行那个读取 ADC数值的子程序,我们还指定了每过多少时间定时器到时。也就是只要内核还在工作,经过一定的时间间隔,定时器就会被运行,就会自动读取 ADC的转换结果,而每次,我们将取得的转换结果保存在一个 BUFFER中,并不断更新。直到有应用程序来读取ADC这个设备的时候就将BUFFER的内容拷贝给应用程序传递进来的指针。另外在示例程序中,我们选择了通道 0作为输入通道。

Page 103: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

7.4 实验内容

1) 利用实验板上的 ADC0809转换芯片的通道 4,学习编写 A/D转换设备(AD0809)的驱动程序模块,完成一路模拟量->数字量->用户空间,观察并记录转换数值,并会出波形图。

2) 将模拟输入信号选择跳线跳到直流波形,以直流信号为模拟输入信道 0的信号源,用万用表测量输入信号电压,与转换电压数值进行比较分析其误差大小及误差来源。

3) 调节变阻旋钮,用万用表测量输入信号电压,与转换电压数值进行比较分析其误差大小及误差来源。

注意:测试程序的输出数值 N 与电压 V 之间的换算关系为:V = N * 256/5,单位:伏特

7.5 实验步骤

1) 编写一个 AD驱动程序和应用程序,并分别编译成 ad.o 和 adc文件。 、/usr/local/src/src/ad.tgz 是示 例 代 码的压缩包,可以用# tar zxvf

ad.tgz 解开。 /usr/local/src/bin/ad.o 和 adc是编译好的二进制文件。2) 正确连接试验设备,并确保 J15没有短接。连接实验箱 UART1与 PC的串口,。

3) 在 LINUX 环境下执行# minicom. 请确 认 已配置 MINICOM 的波特率为 115200,8个数据位,1个停止位 无流控。打开实验箱的电源开关,在

Page 104: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

MINICOM可以看到有数据输出。按照屏幕提示按任意键。然后在MINICOM

中输入 blob > ldrboot kernel 启动实验箱上的 LINUX,然后在MINICOM上输入# cd /tmp.

4) 下载模块:在MINICOM中键入 # zmrx 。在MINICOM中按 CTRL+A 然后按 S键,然后选择以 ZMODEM 协议发送我们在第一步编译得到的 ad.o

文件。或者按第二章介绍用 FTP和USB方式下载 ad.o文件。加载模块:在MINICOM中输入 # insmod ad.o channel=4 控制台上出现 using ad.o

5) 下载键盘测试程序:MINICOM中键入 # zmrx。在MINICOM中按 CTRL+A

然后按 S键,然后选择以 ZMODem 协议发送我们在第一步编译得到的 adc

文件。或者参照第二章说明使用 FTP或者USB方式下载 adc文件。6) 执行 adc程序:在控制台中输入: # chmod +x adc将 adc文件的属性改为可执行。然后在控制台中输入 # ./adc 即可运行 adc程序。

7) 调节 RW5 电位器,并重复步骤 6,观察输入结果的变化。并计算一下 ADC

转换精度。直流电压可在 J19脚用万用表量取。ADC 输出的结果带入以下公式反向计算输入电压:V = N * 256/5,单位:伏特。

8) 卸载模块:在MINICOM中输入 # rmmod ad

实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

Page 105: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第八章 D/A 实验

8.1 实验目的

(1) 学习 D/A转换原理(4) 学习 D/A 驱动程序和应用编写方法(5) 熟悉驱动程序和应用程序中 ioctl的用法(4) 了解静态输出和动态输出区别

8.2 系统资源配置

(1) 嵌入式 EM-ARM9实验系统(2) 示波器一台(3) 数字万用表一块(4) DAC硬件详细描述参见 3.2.21节。

Page 106: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

8.3 实验原理

8.3.1 D/A转换原理

D/A转换接口技术是应用系统后向通道典型应用技术之一。它涉及了 D/A

转换芯片的选择 参考电压源的配置 数字输入码与模拟输出电压的极性等问题,而其中最核心的问题是D/A转换芯片的选择与应用问题。

D/A转换器的基本功能是将一个用二进制表示的数字量转换成相应的模拟量。实现这种转换的基本方法是对应于二进制的每一位,产生一个相应的电压(电流),而这个电压(电流)的大小正比于相应的二进制位的权。D/A转换器主要由三部分 构成,即加权电阻解码网;受输入数字量控制的电子开关组和由运算放大器构成的电流-电压转换器。电子开关组受输入二进制数据 D7~D0 控制,当某一位为“1”,则电子开关闭合,基准电压 Vref接电阻解码网络,使某一支路电阻上有电流流过。当某一位为“0”时则电子开关断开,该支路电阻上无电流流过。加权电阻解码网络各支路的电阻值与二进制数据 D7~D0的“权”相对应,“权”大的电阻值小,“权”小的电阻值大。因此各支路的电流不仅决定于输入数字量的值(0或 1),还决定于“权”,各支路的电流如下:

Page 107: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

因此,总电流为 :

该总电流经电流-电压转换器(运算放大器)后,电压 为:

其中 , , 为第 i 位 输入数字 量,其值为“0”或“1”。

由上式看出,尽管使用的网络结构不同,但对于D/A转换器的输入 输出来说是等效的。就 8 位 D/A转换器而言,每一数字输入位所代表的输出模拟量是其相邻的两倍,这样就组成二进制数字量到模拟量的转换器。D/A转换特性

不同的DAC芯片有着不同的特点和指标。从接口的角度考虑DAC有以下特点:(1) 输入数据位数。经常用的 DAC芯片有 8 位 10 位 12 位 14 位,在

与CPU接口时,将分为 8 位和大于 8 位的DAC两种情况考虑。(2) 接口电平。由于CPU的接口电平与 74系列的逻辑电路的电平均为

TTL 电平,因此应用DAC芯片时,应选用 TTL接口电平的芯片。(3) 输出电压范围。DAC的输出有电流输出和电压输出之分,对于电流

输出的DAC,则需要外加电流-电压转换电路(运算放大器),这时电压的输出范围不仅与DAC的 Vref有关,也与电流-电压转换器有关。输出电压范围为 0~5V 0~10V 5V 10V等。

Page 108: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(4) 输出电压极性。输出电压极性有单极性和双极性之分,如 0~5V

0~10V为单极性输出, 5V 10V为双极性输出。D/A0832 性能指标

D/A转换芯片的主要性能指标有:(1) 分辨率。表征D/A转换器对微小输入量的敏感程度,通常用数字量

的数位表示,如 8 位 12 位,14 位等。分辨率为 10 位的D/A转换器,表示它可以对满量程的 1/1024的增量作出反应。

(2) 相对精度。在满刻度已较准的前提下,在整个刻度范围内,对于任一数码的模拟量输出与它的理论值之差。通常用偏差几个 LSB来表示和该偏差相对满刻度的百分比表示。

(3) 转换时间。数字变化量是满刻度时,达到终值 LSB/2 所需要的时间,通常为几十纳秒至几微秒。

(4) 非线性误差。通常给出在一定温度下的最大非线性度,一般为0.01%~0.03%。

本实验板选用了 DAC0832转换芯片。DAC0832是属于DAC0830系列的是 8 位 CMOS D/A转换器,广泛地应用于单片机控制系统中,其结构原理图如下。

Page 109: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

图 9-1 DAC0832结构图它由 8 位输入寄存器 8 位 DAC 寄存器 8 位 D/A转换器和转换控制电路构成。两级寄存器使它能够实现多路 D/A的同步转换输出;内部无参考电压,须外接参考电压;为电流输出型D/A转换器,要获得模拟电压输出,需外加转换电路。下图为由单极放大器组成的模拟电压输出典型电路。

图 9-2 电压输出典型电路

Page 110: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

8.3.2 DAC 硬件原理图:

8.3.3 软件设计原理和框架

DAC0832对于 CPU而言就如同一个挂在地址和数据总线上的一个 BYTE的RAM。只不过这个RAM可以将CPU写入的数据实时转换为输出电压。从原理图上可以看出 DAC的地址是 0xfb000000。因此,只要每次向 0xfb000000写入数据就可以得到DA转换的电压了。在这个实验的驱动程序里,本该将应用程序向 DAC设备的写入数据的时候,将数据写入 DAC0832 挂接的地址,但是为了学习 IOCTL的用法,我们换个方式,用 IOCTL实现。IOCTL本来是提供一种通道用于改变设备工作状态。这里,我们用它来实现变相的写入操作。当应用程序调用 IOCTL方法的时候会向驱动程序传入命令和参数。为此我们定义一个写

Page 111: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

命令(虽然不合理,但是合法)同时约定当命令是写的时候,参数表示要写入的数据。于是,驱动程序在 IOCTL方法中判断来自应用程序的命令为写的时候,就会将参数作为数据写入 DAC0832 挂接的地址,实现 DA转换。DAC应用程序通过 IOCTL依次向 DAC写入 5 组数据。

8.4 实验内容

1) 利用实验板上的DAC0832转换芯片,学习编写D/A转换设备(DAC0832)

的驱动程序模块,完成一路数字量->模拟量的转换,反应在 DAC0832的模拟输出端。

2) 编写一段小程序,使DAC 输出连续变化的直流电压以,以测试该设备是否能够正常使用。

3) 在DAC0832的模拟输出端使用万用表或者示波器观察其输出值。

注意:测试程序的输出数值 N 与转换输出电压 V 之间的换算关系为:V = N * 256/5,单位:伏特

8.5 实验步骤

1) 编写一个 DA驱动程序和应用程序,并分别编译成 da.o 和 dac 文件 。/usr/local/src/src/da.tgz是示例代码的压缩包,/usr/local/src/bin/da.o

和 dac是编译好的二进制文件。2) 编译: # make,得到 da.o文件和 dac文件.

3) 正确连接试验设备,并确保 SW1 位于 on-off-off-on 状态。连接实验箱与 PC

Page 112: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

的串口。4) 在 LINUX 环境下执行 # minicom. 请先确认已经配置MINICOM的波特率为

115200,8个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM 中可以看到有数据 输 出。按照屏幕提 示按任意键。然后在MINICOM中输入 blob>ldrboot kernel 启动实验箱上的 LINUX,然后在MINICOM上输入# cd /tmp.

5) 下载模块:在MINICOM中键入 # zmrx 。在MINICOM中按 CTRL+A 然后按 S键,然后选择以ZMODem 协议发送我们在第一步编译得到的 da.o

文件。或者参照第二章说明使用 FTP和USB方式下载 da.o文件。6) 加载模块:在MINICOM中输入 # insmod da.o 控制台上出现 using

da.o7) 下载键盘测试程序:MINICOM中键入 # zmrx 。在MINICOM中按 CTRL+A

然后按 S键,然后选择以 ZMODem 协议发送我们在第一步编译得到的 dac

文件。或者参照第二章说明使用 FTP或者USB方式下载 dac文件。8) 执行 dac程序 # chmod +x dac

9) 将 adc文件的属性改为可执行。然后在控制台中输入# ./dac 即可运行 dac

程序。10)用万用表连续测量 J17脚。再次执行 dac程序,可以测量到 5 组数据转换的

结果。按照V = N * 256/5,单位:伏特 计算一下,并记录转换误差。11)卸载模块 # rmmod da

实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

Page 113: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第九章 LCD 实验

9.1 实验目的

(1) 了解 LCD 显示原理(3) 了解 MX1 LCD 控制器基本原理(2) 学习基于 Frame Buffer的底层图形程序的编写和使用 LCD API编程。

9.2 系统资源配备

(6) 嵌入式 EM-ARM9实验系统(2) LCD硬件详细描述见 3.2.14节。

Page 114: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

9.3 实验原理

9.3.1 LCD 显示原理

LCD是基于液晶光电效应的显示器件。液晶显示器的工作原理是利用液晶的物理特性,在通电时,液晶排列变得有秩序,使光线容易通过;不通电时,排列则变得混乱,阻止光线通过。即液晶工作时,使用的是外部的光线,自己本身并不发光,所以与 CRT相比,液晶显示器的耗电量较低。

LCD中使用的 为液晶照明的方式有两种:传送式和反射式。传送式屏幕要使用外加光源照明,称为背光(backlight),照明光源要安装在 LCD的背后。传送式 LCD在正常光线及暗光线下,显示效果都很好,但在户外,尤其在日光下,很难辩清显示内容。反射式屏幕,则不需要外加照明电源,使用周围环境的光线(或在某些笔

Page 115: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

记本中,使用前部照明系统的光线)。这样,反射式屏幕就没有背光,所以,此种屏幕在户外或光线充足的室内,才会有出色的显示效果,但在一般室内光线下,这种显示屏的显示效果就不及背光传送式的。在嵌入式 em-ARM9实验系统中使用的传送式背光(CCFL) 彩色 STN液晶屏。 

9.3.2 MX1 对液晶屏接口支持

MX1 LCDC(液晶显示控制器,Liquid Crystal Display Controller)提供了对单色,灰度,被动式彩色点阵液晶和主动式彩色点阵液晶屏的支持.主要特性如下:

支持自刷新方式 LCD

最多 16 级灰度显示 被动式与主动式彩色液晶屏接口 可编程刷新率 支持 16/12/8/4/2/1 位的数据总线宽度 支持 4/8bpp的被动式彩屏(CSTN)

支持 4/8/12/16bpp的主动式彩屏(TFT)

9.3.3灰度显示原理

实际上,LCD 显示屏并不是设置成不同的亮度去驱动每一像素的。它对象素要么显示,要么关闭。LCD 显示屏的一个常用指标是它的反应时间,反应时

Page 116: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

间指的是一个像素从显示到关闭所花费的时间,典型的是几百ms。一种调制技术被用于驱动每个像素,即用整个固定时间周期的一部分驱动每个像素。

LCD 控制器内部有 1个 16周期计数器,用于产生 16周期的间隔。当驱动像素时,它读帧缓冲数据所指的,在调色板寄存器中的半字节数据。该数据确定在16周期间隔里像素显示的次数。例如该值等于 4,则该像素每隔 4个时钟周期显示 1 次,等于整个 16周期间隔的 4/16。即认为该像素以最大亮度的 1/4进行显示

9.3.4 彩色显示原理

彩色显示时,每个像素点有 3个子彩色像素(红 绿 蓝)。灰度显示的技术应用到彩色显示中,每个子彩色像素有 15种浓度的感觉效果。可用红 绿 蓝 3

种颜色的 15种浓度中的一种去驱动 1个像素点。如果 LCD 控制器编程为 4

bpp模式,可支持最高 15×15×15=3 375种不同的颜色;2 bpp模式时,可支持 64种不同的颜色;1 bpp模式时,可支持 8种不同的颜色。对于一个1/4VGA 显示屏,实际像素的数量等于 320×400×4=921600 位或 115200

字节,小于上面提到的最大帧缓冲的限制(128KB)。另外一个显示特性是刷新率,指的是整个数据帧被重新写到显示屏的频率。

如果数据写得太慢,将影响显示质量;太快则显示器的反应时间跟不上像素驱动状态的改变。大部分显示屏推荐的速率是 70~80Hz。

9.3.5 MX1片内 LCD 控制器操作

屏幕显示大小

Page 117: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

屏幕显示区域的尺寸是可编程的.下图显示了屏幕大小与内存窗口之间的关系.

屏幕宽度(XMAX)与屏幕高度(YMAX)决定了在 LCD 显示屏上的实际显示区域大小.LCDC会扫描 SSA 寄存器指向的显示内存起始地址,将上图所示内存区域的数据按指定格式在 LCD屏上表现出来.最大虚拟显示页宽度由 VPW 参数指定.VPH 不实际影响 LCDC,且只受内存大小限制.改变 SSA 寄存器的值,就可以让屏幕窗口在虚拟显示页中水平或垂直滚动.软件应正确控制 SSA的值,以确保屏幕窗口被控制在 VPW和 VPH指定的显示范围内.实际上,VPH对 LCDC的内部逻辑不起任何作用,只是在软件需要检查屏幕边界的时候才会用到;VPW用来计算每一个显示行的起始地址.SSA指定了每一帧第一行的起始地址,而后面的每一行起始地址需用 VPW的值累加到前一行地址来得到。 黑白两色模式的操作1bpp模式即黑白两色模式,每一位的0或1对应了屏幕上一个点的黑或白。 灰度模式操作

Page 118: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

MX1 LCDC最多产生16级灰度。每个点由2或4位的数据表示其灰度值,2位数据表示4级灰度,4位数据则可以表示16级灰度。这些灰度是通过控制每个屏幕显示点在每16帧中有几帧是“亮”的状态来显示到液晶屏的。这种方法叫作“Frame Rate Control”。(参见前面的“灰度显示原理”部分)

Gray-Scale Pixel Generation 色彩生成屏幕每个彩色显示点的色彩值,是由显存中对应的 4/8/12/16 位编码值表示的,像素点值被简单的从显存中直接传送到 12 位的 LCDC 输出总线上。其中 4 位和8 位模式,LCDC会把色彩值用其内部的色彩映射内存(调色板)映射到12位色,然后输出。在连接主动式点阵彩屏时,12位 RGB 值直接被输出到显示屏;连接被动式点阵彩屏时,12位 RGB 值被送到 FRC模块,将红绿兰三色分别独立处理,产生三种颜色各自需要的显示灰度。

Page 119: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

被动显示模式的点色彩生成

Page 120: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

主动模式的点色彩生成 彩色 LCD 的驱动

LCD的驱动程序需要在系统初始阶段对 LCDC的几个主要寄存器作初始化。本实验指导手册给出的例子考虑使用 320x240x8bpp 的彩色显 示方式,LCDC 寄存器请参考源代码:

9.3.6 EM-ARM9 的液晶显示系统

em-ARM9教学板上配备了 4096色的 STN液晶显示屏,属于被动式彩色点阵液晶屏。控制信号由 MX1 LCDC 输出,同屏最高显示256色。本实验中的例子都是基于256色显示方式的。

硬件平台

MC9328MX1片内 LCD 控制器的功能是产生显示驱动信号,驱动 LCD 显示器。用户只需要通过读写一系列的寄存器,完成配制和显示控制。MX1中的 LCD 控制器可支持单色/彩色 LCD 显示器。支持彩色 TFT时,可提供 4/8/12/16 位颜色模式,其中 16 位颜色模式下可以显示 64k种颜色。配置 LCD 控制器重要的一步是指定显示缓冲区,并分配一个 DMA通道连接该缓冲区与 LCD 控制器的FIFO。这样 LCD 控制器会定时将显示缓冲区的内容传送到 LCD 显示屏上。其大小由屏幕分辨率和显示颜色数决定。在本例中,本系统采用的 STN 显示模块,在 320×240分辨率下可提供 8 位彩色显示。

软件原理和架构:

Page 121: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

1 Linux 的帧缓冲设备

帧缓冲(framebuffer)是 Linux为显示设备提供的一个接口,是把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置 换页机制等等具体细节。这些都是由 Framebuffer设备驱动来完成的。帧缓冲驱动的应用广泛,在Linux的桌面系统中,Xwindow服务器就是利用帧缓冲进行窗口的绘制。尤其是通过帧缓冲可显示汉字点阵,成为 Linux汉化的唯一可行方案。

帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达 32个,分别为/dev/fb0到/dev/fb31,而/dev/fb

则为当前缺省的帧缓冲设备,通常指向/dev/fb0。当然在嵌入式系统中支持一个显示设备就够了。帧缓冲设备为标准字符设备,主设备号为 29,次设备号则从 0

到 31。分别对应/dev/fb0-/dev/fb31。

通过/dev/fb,应用程序的操作主要有这几种:

1. 读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。例如用 cp /dev/fb0 tmp命令可将当前屏幕的内容拷贝到一个文件中,而命令 cp tmp > /dev/fb0 则将图形文件 tmp 显示在屏幕上。

2. 映射(map)操作:由于 Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。为此,Linux在文件操作 file_operations 结构中提供了 mmap 函数,可将文件的内容映射到用户空间。对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。而且若干个进程可以映射到同一个显示缓冲区。实际

Page 122: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

上,使用帧缓冲设备的应用程序都是通过映射操作来显示图形的。3. I/O 控制:对于帧缓冲设备,对设备文件的 ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。ioctl的操作是由底层的驱动程序来完成的。

在应用程序中,操作/dev/fb的一般步骤如下:

1. 打开/dev/fb设备文件。

2. 用 ioctrl操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。

3. 将屏幕缓冲区映射到用户空间。

4. 映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示了。

典型程序段如下:

#include int main() {  int fbfd = 0; struct fb_var_screeninfo vimnfo; struct fb_fix_screeninfo finfo; long int screensize = 0;

/*打开设备文件*/ fbfd = open("/dev/fb0", O_RDWR);

/*取得屏幕相关参数*/ ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo); ioctl(fbfd, FBIOGET_VSCREENINFO, &vimnfo);

/*计算屏幕缓冲区大小*/

screensize = vimnfo.xres * vimnfo.yres * vimnfo.bits_per_pixel / 8;

/*映射屏幕缓冲区到用户地址空间*/ fbp=(char*)mmap(0,screensize,PROT_READ|PROT _WRITE,MAP_SHARED, fbfd, 0);

Page 123: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

/*下面可通过 fbp指针读写缓冲区*/ …… }

2 帧缓冲驱动的编写

帧缓冲设备属于字符设备,其目的就是通过配置MX1 寄存器,在一段指定的内存与 LCD 之间建立一个自动传输的通道。这样,任何程序只要修改这段内存中的数据,就可以改变 LCD上的显示内容。帧缓冲设备驱动也采用“文件层-驱动层”的接口方式。在文件层次上,Linux为其定义了

static struct file_operations fb_fops = { owner: THIS_MODULE,

read: fb_read, /* 读操作 */

write: fb_write, /* 写操作 */

ioctl: fb_ioctl, /* 控制操作 */

mmap: fb_mmap, /* 映射操作 */

open: fb_open, /* 打开操作 */

release: fb_release, /*关闭操作*/

};

其中的成员函数都在文件 linux/driver/vimdeo/fbmem.c中定义。

由于显示设备的特殊性,在驱动层的接口中不但要包含底层函数,还要有一些记录设备状态的数据。Linux为帧缓冲设备定义的驱动层接口为 struct fb_info 结构,在 include/linux/fb.h中定义。这个结构比较长,限于篇幅,文章中就不全部列出了。幸运的是,嵌入式系统要求的显示操作比较简单,只涉及到结构中少数几个成员,下面只对编写驱动中要用到的几个关键成员作一说明。

fb_info中纪录了帧缓冲设备的全部信息,包括设备的设置参数,状态以及操作

Page 124: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

函数指针。每一个帧缓冲设备都必须对应一个 fb_info 结构。其中成员变量modename为设备名称,fontname为显示字体,fbops为指向底层操作的函数的指针,这些函数是需要驱动程序开发人员编写的。成员 fb_var_screeninfo和 fb_fix_screeninfo也是结构体。其中 fb_var_screeninfo 记录用户可修改的显示控制器参数,包括屏幕分辨率和每个像素点的比特数。fb_var_screeninfo中的 xres定义屏幕一行有多少个点, yres定义屏幕一列有多少个点, bits_per_pixel定义每个点用多少个字节表示。而 fb_fix_screeninfo中记录用户不能修改的显示控制器的参数,如屏幕缓冲区的物理地址,长度。当对帧缓冲设备进行映射操作的时候,就是从 fb_fix_screeninfo中取得缓冲区物理地址的。上面所说的数据成员都是需要在驱动程序中初始化和设置的。

在了解了上面所述的概念后,编写帧缓冲驱动的实际工作并不复杂,需要做的工作是:

1. 编写初始化函数:初始化函数首先初始化 LCD 控制器,通过写寄存器设置显示模式和显示颜色数,然后分配 LCD 显示缓冲区。在 Linux可通过 kmalloc 函数分配一片连续的空间。本系统采用的 LCD 显示方式为 320x240,16 位彩色。需要分配的显示缓冲区为 320x240x2 = 150k 字节,缓冲区通常分配在大容量的片外 SDRAM中,起始地址保存在 LCD 控制器寄存器中。

最后是 初始化一个 fb_info 结 构 ,填充其中的成 员变 量 ,并 调用register_framebuffer(&fb_info),将 fb_info登记入内核。

2. 编写结构 fb_info中函数指针 fb_ops对应的成员函数:对于嵌入式系统的简单实现,只需要下列三个函数就可以了:

struct fb_ops { ……

Page 125: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info); int (*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info); int (*fb_set_var)(struct fb_var_screeninfo *var, int con,struct fb_info *info); …… };

struct fb_ops在 include/linux/fb.h中定义。这些函数都是用来设置/获取 fb_info 结构中的成员变量的。当应用程序对设备文件进行 Ioctl操作时候会调用它们,读者可参考前文中的应用程序例子。例如,对于 fb_get_fix(),应用程序传入的是fb_fix_screeninfo 结构,在函数中对其成员变量赋值,主要是 smem_start(缓冲区起始地址)和 smem_len(缓冲区长度),最终返回给应用程序。而 fb_set_var()函数的传入参数是 fb_var_screeninfo,函数中需要对 xres,yres,和 bits_per_pixel赋值。

驱动程序编写完成后,开发者可选择将其编译为动态加载模块,或静态地编译入内核中。由于篇幅所限,有关这方面的内容请读者参考相关驱动程序文档。本系统的 LCD底层驱动在 linux源代码树中 linux/driver/vimdeo/dbmx1fb.c中。

9.3.7 LCD API

LCD API是一套应用层编程接口,它将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。示例的 LCD API 提供了画点,画线,画圆等基本图形操作,应用程序可以利用这些基本操作画出更复杂的图形。lcd_init(void) int lcd_putpixel(short x, short y, unsigned char c, int xorm) char lcd_getpixel(short x,short y) int lcd_hline(short x1,short y, short x2,unsigned char c,int xorm)int lcd_vline(short x,short y1, short y2,unsigned char c,int xorm)int lcd_vline(short x,short y1, short y2,unsigned char c,int xorm)int lcd_hline( short x1, short y,short x2, unsigned char c,int xorm) int lcd_fillrect(short x1, short y1, short x2, short y2, int c) int lcd_textout(short x,short y,unsigned char* buf,int color)

Page 126: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书int lcd_putbigpixel(short x, short y, unsigned char c, int xorm) int lcd_ellipse(short x,short y,short a,short b,unsigned char c,int xorm)int lcd_bitmap(short x0, short y0,short width,short height,unsigned

char *pcc, int xorm)void show_palette(void)void cls(void)lcd_initialize完成屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。 。lcd_putpixel是画图的基础,直线,矩形,椭圆,圆都是在此基础上的算法。要注意显示缓冲区和象素之间的映射方式。Lcd_textout 在 使 用 这 个 函 数 显 示 字 符 的 时 候 , 需 要将/usr/local/src/example//bin/hz16 字库文件下载到实验箱中/tmp目录中。此次试验中,屏幕的设置是 320×240,考虑到每个象素用8位表示,所以在显存中的一个字节就代表了屏幕上一个点。点的色彩是用对应字节的值作索引,从MX1内部 LCD 控制器调色板中相应的12位 RGB 值决定的。本试验采用的是linux 默认的调色板。

9.4 实验内容

(1) 阅读/usr/local/src/linux/driver/video/fbmem.c 和 dbmx1fb.c文件,了解显示驱动原理。

(2) 解压/usr/local/src/src/lcd.tgz 并阅读源代码,了解 LCD API的原理。(3) 参考 LCD API和/usr/local/src/src/lcd.tgz中的 testlcd.c编写

一个应用程序,在 LCD上画不同颜色的同心圆并显示汉字。

Page 127: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

9.5 实验步骤

1) 编写应用程序和makfile文,执行# make令编译,得到 testlcd文件。示例代码在/usr/local/src/src/lcd.tgz中。

2) 正确连接试验设备,并确保 J15没有短路。连接实验箱UART1与 PC的串口3) 在 LINUX 环境下执行# minicom. 请确认已配置MINICOM的波特率为

115200,8个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。按照屏幕提示按任意键。然后在MINICOM中输入 # blob>ldrboot kernel 启动实验箱上的 LINUX,然后在MINICOM上输入# cd /tmp.

4) 下载 LCD 测试程序:MINICOM中键入 # zmrx 。在MINICOM中按

CTRL+A 然后按 S键,然后选择以 ZMODEM 协议发送我们在第一步编译得到的 testlcd文件和 hz16。或者参考第二章用 FTP方式下载 testlcd文件。

5) 执行 testlcd程序:在控制台中输入: # chmod +x testlcd,将 testlcd文件的属性改为可执行。然后在控制台中输入 # ./testlcd 即可,运行 testlcd 程序。

6) 观察 LCD上是否画出同心圆并显示出汉字。

实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

Page 128: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第十章 触摸屏实验

10.1. 实验目的

(1)了解触摸屏工作原理(2)掌握 Linux下触摸屏驱动程序和应用程序的编写

Page 129: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

10.2. 系统资源配备

(1)MX1片上ASP接口(2)触摸屏(3)触摸屏硬件原理部分请参考 3.2.15节

10.3. 实验原理

10.3.1 触摸屏硬件原理

触摸屏的工作部分一般由三部分组成:两层透明的阻性导体层 两层导体之间的隔离层 电极,如图 1 所示。

图 1 触摸屏结构触摸屏工作时,上下导体层相当于电阻网络,如图 2。当某一层电极加上

电压时,会在该网络上形成电压梯度。如果有外力使得上下两层在某一点接触,则在电极未加电压的另一层可以测得接触点处的电压,从而知道接触点处的坐标。如,在顶层的电极(X+,X-)上加上电压,则在顶层导体层上形

Page 130: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

成电压梯度,当有外力使得上下两层在某一点接触,在底层就可以测得接触点处的电压,再根据该电压与电极(X+)之间的距离关系,知道该处的 X

坐标。然后,将电压切换到底层电极(Y+,Y-)上,并在顶层测量接触点处的电压,从而知道Y坐标。

实验箱的触摸屏采用标准触摸屏,采用模拟信号输入,使用MC9328MX1芯片的ASP模块(Analog Signal Processor)提供的专用于触摸屏输入的4路9位数模转换(ADC)结构,触摸屏置于Sharp LCD之上。另有2路9

位A/D用于测量电池电压。本节主要介绍与触摸屏相关的ASP寄存器。

图 2 触摸屏工作示意图

10.3.2 ASP 的编程模式

详细资料查阅参考文献 1 第 259页 14.7 Programming Model 小节。这一小节主要介绍与触摸屏相关的 7个 32 位寄存器(见表 4)。

Page 131: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

表 4 与触摸屏相关的 7个 32 位寄存器描述 名称 地址Control Register ASP_ACNTLCR 0x00215010Pen A/D Sample Rate Control Register

ASP_PSMPLRG 0x00215014

Compare Control Register ASP_CMPCNTL 0x00215030Interrupt Control Register ASP_ICNTLR 0x00215018Interrupt/Error Status Register

ASP_ISTATR 0x0021501C

Clock Divimde Register ASP_CLKDIV 0x0021502CPen Sample FIFO ASP_PADFIFO 0x00215000这7个寄存器的详细说明请参考MC9328MX1RM.pdf

10.3.3 软件实现原理

ASP驱动的实现原理:ASP驱动是一个字符设备。与KEY驱动相同,ASP驱动实现了以下设备方法:

struct file_operations ts_fops = {open: asp_open,release: asp_release,read: asp_read,poll: asp_poll,ioctl: asp_ioctl,

};

以下是ASP驱动的流程图。ASP的特性决定了ASP驱动要跟踪笔落下和移动以及抬起的全过程,所以状态迁移是ASP驱动程序设计的关键。

落笔打开设备文件Open:Asp_open Asp_fasyn

cAsp_poll

Page 132: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

图5 UML状态迁移图和时序图图5是程序的状态迁移图,作为一个字符设备驱动程序,主要是实现必要的

文件系统操作read open close等,触摸屏设备不可写只读,另外注册中断处理程序读取寄存器到内存缓冲。Asp.c主要是通过三个中断处理程序实现对FIFO

数据的读取,通过buffer进行缓存,唤醒上层应用进行read读取,也可用ASP_READ对/dev/asp设备进行轮询,同时支持非阻塞读和poll/fasync异步接口,是一个实现的比较完整的可作为典型范例的字符设备驱动程序。

ASP应用程序的实现原理:ASP应用程序采用常规方法,OPEN ASP设备后就可以SELECT和READ。与

标准文件操作相同。尤其是可以参考KEY实验说明。

Close:Asp_release

移笔抬笔

移笔

Pen Touch Interrupt(Pen Interrupt)中断发生(调用asp_touch_int)

enable_auto_sample开始采样,enable_data_interrupt, disable_pen_interrupt, set_pen_up_threshold 允许 Pen-up

FIFO Full 中断 (Data Interrupt)发生 ,PEN DOWN 事件 ( 调用asp_pendata_int),读取 FIFO数据写到 buffer,唤醒 read有数据可读

Pen-up interrupt中断发生,PENUP事件写到 buffer(调用asp_comp_int),唤醒 read有数据可读, disable_auto_sample,停止

采样,

关闭设备文件,disable_pen_interrupt协载模块Asp_cleanup

Page 133: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

10.3.4 关于 PAD

图6 触摸屏跳变现象示例pad 可以用于防止由于触摸屏品质问题所产生的跳变对于应用程序品质的

影响,增加应用程序的可用性,具体为:1,当用户进行手写输入时,发现随机的出现一些笔画的跳变现象,会突然出现一些直线笔画而影响笔画的识别以及用户的体验满意度2,有可能出现用户点击默写按钮时(这种情况进进出现在点击动作需要 mouse-down + mouse-up 同时作用时),有时会发现不能够完成想要的操作,例如,用户可能无法通过点击应用程序右上角的关闭按钮来关闭应用程序窗口。这是由于,当用户点下时,返回的坐标与抬起时所返回的坐标不一致,即抬起坐标超出了关闭按钮的范围,因此,不能够产生该按钮上的 mouse-up 事件,因此,该按钮无法执行相应的按下操作。使用了 pad 之后,在 GUI 层面就可以进行适当的过滤操作:即,我们可以

使用两个 threshold 值,len_threshold 和 time_threshold,分别表示笔画长度以及两个笔画时间间隔的阈值。在针对某一类特定设备进行大量测试的基础上,适当的设定这两个阈值,当两个笔画之间的时间间隔小于 time_threshold 而且/或者笔画长度大于 length_thershold 时,将此信息过

Page 134: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

滤掉,或者强行认为该 mouse-up(如果是一个 mouse-up 事件的话) 事件的坐标为上一个信息的坐标即可。

对于asp这样的字符设备驱动,应用程序读取的内容除了应该包含x坐标,y坐标以外,还应包含pressure-用来表示笔的抬起或者落下的状态,和一个连续计数的pad值,供某些应用程序用来判断笔画的速度。在这个实验中我们采取的一下的结构来表示触摸屏的信息

typedef struct { unsigned int pressure; unsigned int x; unsigned int y;

unsigned int pad;} ts_event_t;

但是在asp的驱动中并没有对pad值进行更新。

10.4 实验内容

(1)编写一个ASP驱动程序(2) 编写一个应用程序读取 ASP 输入值并在 LCD上画直线连接前后两点。(3)在实验箱上下载并运行ASP驱动程序和应用程序。(4)参考代码 asp驱动程序源代码 /usr/local/src/src/ts.tgz asp 测试程序源代码/usr/local/src/src/asp.tgz

10.5 实验步骤

(1)编写一个ASP驱动程序和应用程序,并分别编译成 asp.o 和 asp文件。(2) 确连接试验设备,并确保 J15没有短路。连接实验箱UART1与 PC的串口

Page 135: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(3) 配置MINICOM的波特率为 115200,8个数据位,1个停止位 无流控.

启动MINICOM # minicom。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。按照屏幕提示按任意键。然后在MINICOM中输入 blob>ldrboot kernel 启动实验箱上的 LINUX,按屏幕提示按回车。然后在MINICOM上输入 # cd tmp.

(4) 运行校准程序:# calibrate 校准的结果如果和实际象素相差 5个点,校准程序会会重新进行,请耐心校对。

(5) 下载模块:在MINICOM中键入 # zmrx (回车)。在MINICOM中按

CTRL+A 然后按 S键,然后选择以 ZMODEM 协议发送我们在第一步编译得到的 asp.o文件。或者参考第二章用 FTP或者USB方式下载 asp.o文件。

(6) 加载模块:在MINICOM中输入 # rmmod key 和 # rmmod asp(卸载系统启动时自动加载的 key和 asp驱动)# insmod asp.o (加载我们下载的新的 asp驱动),控制台上出现 using asp.o 因 ASP作为标准设备,其设备节点已经存在于/dev/asp,所以无须再创建设备节点。

(7) 下载 asp 测试程序:MINICOM中键入 # zmrx (回车)。在MINICOM中按

CTRL+A 然后按 S键,然后选择以 ZMODem 协议发送我们在第一步编译得到的 asp文件。或者参考第二章用 FTP或者USB方式下载 asp文件。

(8) 执行 asp程序:在控制台中输入: # chmod +x asp,将 asp文件的属性改为可执行。然后在控制台中输入 #./asp 即可运行 asp 程序。 ]

(9) 测试 asp驱动模块:用手写笔在触摸屏上轻点,观察 LCD屏幕上的显示效果。

Page 136: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(10) 卸载模块:在minicom中输入 # rmmod asp

实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

Page 137: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

十一章 音频实验

11.1 实验目的

(1) 了解音频播放的原理;了解在嵌入方系统中如何实现音频播放;(2) 了解 AUDIO驱动程序的结构框架(3) 掌握DMA通道的使用方法

11.2 系统资源配置

(1) 嵌入式 EM-ARM9实验系统(2) AUDIO部分硬件原理请参考 3. 2.11节。

11.3 实验原理

11.3.1 cs4340 的原理和作用

CS4340是一个用于音频的DAC,下面是典型的CS4340应用电路。

Page 138: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

下面是 CS4340工作的时序图

音频流数据在 SCLK同步下从 SDATA引脚输入,同时 LRCK的高低变化标识了对应的音频流数据是属于左右声道中的哪一个。

CS4340按组(一组音频数据包含左声道数据和右声道数据)转换,然后通过左右声道输出。下图是实验箱中AUDIO部分的原理示意图。SSI_TXDA

T

MC9328MX1

PC5

PB17

SSI_TXCLK

SSI_TXFS

SDATA

MUTEC

LRCKSCLK

MCLK#RST

AOUTR

AOUTL

CS4340

Page 139: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

CS4340无须设置,通过MX1片内 SSI写入 CS4340的数据均被 CS43430转换后输出模拟信号驱动发声器件。

11.3.2 MX1 与 CS4340 的接口以及CS4340 驱动的作用

MX1 处理器上有专门的 SSI 控制器,该控制器负责与 CS4340通讯,软件所要做的工作就是配置好 SSI 控制器的工作方式,然后将解码后的MP3音频数据连续写入 SSI 控制器的 BUFFER中,MX1会自行将数据传输到 CS4340上。CS4340的驱动就是要实现以上功能。

11.3.3 MP3播放的实现

MP3的解码不属于本课程范畴,这里只提供一个已经编译好的 MP3

播放软件(该软件已经包含在文件系统中),该软件读取 MP3文件,对MP3进行解码转换为 PCM格式(音频流), 然后查找/dev目录下名为dsp的设备节点,将 PCM数据写入该设备节点。对于随机配套的MP3 播放程序 playmp3,audio设备节点必须放在/dev目录下,且节点的名称必须是 dsp。Audio设备遵从 OSS规范,具体细节可以查找OSS规范。在示例驱动中实现了以下方法。

Page 140: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书static struct audio_driver ssi_audio_driver ={ owner: THIS_MODULE, open: ssi_audio_open, close: ssi_audio_close, output_block: ssi_audio_output_block, ioctl: ssi_audio_ioctl, prepare_for_output: ssi_audio_prepare_for_output, halt_io: ssi_audio_reset, //copy_user: ssi_copy_user, trigger: ssi_audio_trigger, set_speed: ssi_audio_setspeed, set_bits: ssi_audio_setbits, set_channels: ssi_audio_setchannel,};

对于有些方法,比如 open close,ioctl,我们已经很熟悉了。这里简单介绍以下其他的方法。output_block:这个方法实际是要求驱动准备好音频数据流与AUDIO 输出口之间的数据通道(DMA通道),halt_io是终止 AUDIO 输出 。set_speed 设置播放速率,set_bits设置音频数据格式 set_channels 是设置放音通道。Trigger则是启动设置好的数据通道开始播放音频流了。

各个方法的含义很清楚,但具体操作是依赖于MX1 处理器和 4340 解码芯片的。

11.4 实验内容

1 解 压并阅读 /skiff/local/src/src/audio.tgz 的源代 码,分析AUDIO驱动的框架。

2 编译并加载 AUDIO驱动,向实验箱下载一首 MP3,并利用系统自带的MP3 播放器(PLAYMP3)播放该 MP3。

Page 141: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

11.5 实验步骤

(1) 进入/usr/local/src/example/目录 # cd /usr/local/src/src

解压 audio.tgz # tar zxvf audio.tgz

执行 make . # cd audio # make

可以得到 audio.o文件。

(2) 正确连接试验设备,并确保 J15没有短路。连接实验箱UART1与 PC的串口。

(3) 在 LINUX 环境下执行# minicom. 请配置MINICOM的波特率为115200,8个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。按照屏幕提示按任意键。然后在MINICOM中输入 blob> ldrboot kernel 启动实验箱上的 LINUX,然后在MINICOM上输入 # cd tmp.

(4) 下载模块:在MINICOM中键入 # zmrx (回车)。在MINICOM中按 CTRL+A 然后按 S键,然后选择以ZMODem 协议发送我们在第一步编译得到的 audio.o文件。或者参考第二章使用 FTP或者USB方式下载audio.o文件。

(5) 加载模块:在MINICOM中输入 # insmod audio.o (回车)(6) 下载 MP3:MINICOM 中键入 # zmrx (回车)。在 MINICOM 中按

CTRL+A 然后按 S键,然后选择以 zmodem 协议发送一首 MP3(本例

Page 142: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

是/skiff/local/src/src/mp3/demo.mp3)。(7) 播放 MP3:在minicom中输入: #playmp3 demo.mp3。此时应该

可以听到音乐的声音。实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

第十二章 以太网实验

12.1 实验目的

(1) 了解嵌入式 LINUX操作系统下网络芯片驱动程序编写流程(2) 了解嵌入式 LINUX操作系统下网络芯片运行流程(3) 嵌入式网络的应用及 TELNET样例

12.2 系统资源配备:

(1) 网卡芯片 CS8900A.

(2) 网卡部分硬件原理见 3.2.13节。

12.3 实验原理

12.3.1 硬件原理

缓冲器MX1_D[00:07]

MX1_A00

MX1_#RW

MX1_#CS1

#XFER

#WR1

#CS

D[0:7]

DAC0832

RFB

MC9328MX1

74HC244

#WR2

#IOUT2#IOUT1

运算放大器

Page 143: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

MX1片内没有以太网控制器,需要外接以太网控制芯片。对与MX1而言,以太网控制芯片就是如同接在地址空间的大小为一个 BYTE的存储器。所有对以太网控制芯片的设置的读写操作都要通过 8 位数据总线。驱动 CS8900的关键就是按照芯片要求向 CS8900 所挂接的地址写入特定数据来配置 CS8900的工作方式,超时,数据长度,协议类型,MAC 地址,接收方式等。然后每次接收到 CS8900 产生的中断时,从 CS8900 所挂接的地址读取数据即可。对照原理图和 MX1 硬件手册,可以看出 CS8900 芯片挂接的地址就是0xfe000300。

12.3.2 驱动程序实现原理

驱动程序要完成的就是实现网络驱动的设备方法,以下是本例中的实现方

Page 144: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

法。Net_device->open = net_open;Net_device ->stop = net_close;Net_device ->tx_timeout = net_timeout;Net_device ->watchdog_timeo = HZ;Net_device ->hard_start_xmit = net_send_packet;Net_device ->get_stats = net_get_stats;Net_device ->set_multicast_list = set_multicast_list;Net_device ->set_mac_address = set_mac_address;

这些方法的含义和功能已经在教材中介绍的很清晰了。所要做的只是在初始化函数 init_module中配置好 CS8900的工作参数。然后根据要实现的以上设备方法,参考 CS8900硬件手册,通过向 CS8900 所挂接的地址写入手册中特定数据组合和读取数据就可以了。协议层由 KENEL去实现。

11.4 实验内容

(1)阅读/usr/local/src/src/ethernet下以太网驱动的源代码,分析以太网驱动的框架。

(2) 加载以太网驱动后,通过实验箱运行 TELET程序登陆到清华 BBS。

11.5 实验步骤

(1)示例代码的压缩包在 /usr/local/src/example/ethernet.tgz 解压并阅读 cs89x0.c

文件,了解网络驱动程序的框架(2)编译以太网驱动程序: # make 得到 cs89x0.o文件。(3)正确连接试验设备,并确保 J15没有短路。连接实验箱与 PC的串口。用网线

连接实验箱的网口与局域网内的HUB。

Page 145: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(4)在 LINUX 环境下执行# minicom. 请先确认已配置MINICOM的波特率为115200,8个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。按照屏幕提示按任意键。然后在MINICOM中输入 blob> ldrboot kernel 启动实验箱上的 LINUX,然后在MINICOM上输入 # cd tmp.

(5)下载模块:在MINICOM中键入 # zmrx 。在MINICOM中按 CTRL+A 然后按 S键,然后选择以ZMODEM 协议发送我们在第一步编译得到的cs89x0.o文件。或者参考第二章用 FTP方式下载该文件。

(6)下载模块:在MINICOM中键入 # zmrx (回车)。在MINICOM中按 CTRL+A 然后按 S键,然后选择以ZMODEM 协议发送我们在第一步编译得到的 cs89x0.o文件。或者参考第二章用 FTP或者USB方式下载该文件。

(7) 因为系统启动后自动加载了文件系统中的以太网驱动,为了实验我们的驱动,需要卸载原有的以太网驱动 # netdown # rmmod PTSC_Ethnet

(8)加载模块:在MINICOM中输入 # insmod cs89x0.o

MAC=01:02:03:04:05:06 MAC后面是MAC 地址,也就是要设置的网卡的物理地址,物理地址由 6个二位的 16进制数组成。MAC 地址在网内应该是唯一的,如果连接了某些型号的交换机,可能对MAC 地址有特别限制,请参考 PC端MAC 地址,照抄并修改最后两位。

(9)在MINICOM中输入# ifconfig eth0 192.168.***.*** 这条命令将设置网络设备的 IP 地址,网内的 IP 地址是唯一的。

(10) 在超级终端上输入 # ifconfig eth0 broadcast 192.168.0.255

netmask 255.255.255.0这个命令将设定广播地址和子网掩码.

Page 146: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(11) 在超级终端上输入# route add default gw 192.168.***.*** eth0

这个命令设置了默认网关,其地址应该与局域网网关相同。(12) 在超级终端上输入 # ping www.sina.com.cn可以看到已经 ping通

了新浪网,如果局域网没有连接到外部,可以 ping局域网内替他主机(13) 在超级终端上输入 # telnet bbs.tsinghua.edu.cn可以得到以下画面

(13) 在超级终端上输入 # ftp ftp.kernel.org

可以看到终端上已经实现了 telnet 和 ftp 功能。如果网络条件不好,也可以 telnet和 ftp网内服务器实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

Page 147: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第十三章 USB 实验

13.1 实验目的

(1)了解 USB 协议和USB设备(2)了解如何编写实现 USB存储设备驱动程序

Page 148: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

13.2 系统资源配置

(1) MX1片上USB接口。(2) USB硬件原理请参考 2.23节。(3) 需要windows 2000操作系统(因为已经自带 USB驱动)。

13.3 实验原理

13.3.1 USB 介绍

USB(Universal Serial Bus)就是通用串行总线。本实验主要介绍 usb1.1

协议。USB主要优点可归结为以下几点:A 速度快。USB有高速和低速两种方式,主模式为高速模式,速率为

12Mbps,另外为了适应一些不需要很大吞吐量和很高实时性的设备,如鼠标等,USB 还提供低速方式,速率为 1.5Mb/s。相比之下,串口数据传输率是115kbps-230kbps,标准并口的数据传输率为 1Mbps,这些都要低于 USB

的传输速率,现在刚刚推出的 USB2.0 协议,在理论上其传输率可以达到480Mbps。

B 设备安装和配置容易。USB设备支持即插即用,安装 USB设备不必再打开机箱,加减已安装过的设备,完全不用关闭计算机。所有 USB设备支持热拔插,系统对其进行自动配置,不再占用中断资源或者 DMA资源,彻底抛弃了过去的跳线和拨码开关设置。USB为接缆和连接头提供了单一模型,解决了

Page 149: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

外设越来越多造成的插槽紧张问题。C 易于扩展。用USB 连接的外围设备数目最多达 127个,共 5 层。所谓 5

层是指从主装置开始可以经由 4个集线器进行菊花链接。标准USB 电缆长度为3米(5米,低速)。通过Hub或中继器可以使外设距离达到 12米。

D 能够采用总线供电。USB 总线提供最大达 5V,500mA 电流,对于功耗较小的设备来说这是非常有效的。

E 使用灵活。USB共有 4种传输模式:控制传输(control)、同步传输(Synchronization)、中断传输(interrupt)、批量传输(bulk),以适应不同设备的需要。

13.3.2 USB原理

USB是一种主从总线,工作时 USB主机处于主模式,设备处于从模式 。USB系统所需要的唯一的系统资源是,USB系统软件所使用的内存空间 USB

主控制器所使用的内存地址空间(I/O 地址空间)和中断请求(IRQ)线。USB

设备可以作低速或者高速设备。低速设备最大速率限制在 1.5 Mb/s,每一个设备有一些专有寄存器,也就是端点(endpoint)。在进行数据交换时,可以通过设备驱动间接访问它。每一个端点支持几种特殊的传输类型,并且有一个唯一的地址和传输方向。不同的是端点 0 仅用作控制传输,并且其传输可以是双向的。系统上电后,USB主机负责检测设备的连接与拆除 初始化设备的列举过程,

并根据设备描述表安装设备驱动后自动重新配置系统,收集每个设备的状态信息。设备描述表标识了设备的属性 特征并描述了设备的通信要求。USB主机根据

Page 150: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

这些信息配置设备 查找驱动,并且与设备通信。USB 协议将设备分为几大类,每一大类又分为若干子类,分别满足不同场

合的应用。每一大类都用一个类型号标识。如音频设备为 01,人机界面设备为03,海量存储类为 08。本实验中由于我们的目的是用 USB传输大文件,可以将 USB 控制器配置

为标准的海量存储类型,将嵌入式开发系统中的部分 RAM虚拟为一个磁盘,在RAM 盘开始的 512 字节按 FAT 表的格式填入数据。在 PC 机端利用Windows2000 下的标准驱动程序,这样,我 们的目标板将显 示为Windows2000 浏览器中的一个驱动器。驱动器的大小由 RAM盘 FAT 表中的信息决定。用拷贝 粘贴命令可直接传送大文件。USB接口部分的原理图如图 1 所示

图 1.1 USB接口部分的原理图

13.3.3 USB设备的工作原理

各种 USB设备的工作过程在 USB 标准 1.1中有详细的描述,在此简述如下:

Page 151: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

USB的传输方式分为 4种:控制传输,批传输,中断传输和等时传输。控制传输用来传输设备控制指令 设备状态查询及确认命令。批传输主要用于完成主机和设备之间的大块数据传输,支持两个方面的数据传输(即主机到设备和设备到主机)。中断传输用来完成设备到主机的少量数据传输,只支持设备到主机方向数据传输。等时传输主要用来完成主机和设备之间实时数据的传输(如麦克风 音箱以及电话等)。USB传输事务均由主机启动,总线采取主从式结构,实际的通信过程由主机和设备的端点来完成。一个 USB设备有多个端点,其中端点 0专门用于设备的控制。端点被定义为单向的数据通道:只能为接收端点或发送端点。具有相同传输方式的多个收发端点组成通信界面。所有的通信过程都由主机控制USB设备通过接收端点接收主机的各种请求,如读写数据 请求状态,通过发送端点对请求做出应答。在本例中,由于将 USB设备配置为海量存储方式,只使用了两种传输方式:控制传输和批传输,定义了三个端点:除了端点 0 外,还定义了批传输的接收端点 ep1和发送端点 ep2。

不同类型的 USB设备有不同的配置信息。主机将根据设备报告的初始化信息加载不同的驱动程序。通过初始化请求包,主机可要求设备报告五种配置信息1. 设备描述表,2. 配置描述表,3. 界面描述表,4. 端点描述表,5.字串描述表。

USB设备必须向主机报告一个设备描述表和至少一个界面描述表。USB 协议对不同设备类型的各种配置信息都有具体的规定,开发者可参考相应的文档。具体编程时,当收到主机的配置请求包后,只要将设备描述表和配置描述表发给主机就完成了配置过程。当配置过程完成后,主机和设备就可以传输数据了。

作为海量存储类设备,主机将以访问磁盘的方式来访问设备。所以,在使用前,先需要按磁盘分区表(FAT 表)的格式对一片 RAM进行格式化。在本例中采

Page 152: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

用了 FAT16的格式。本例中支持四种对 RAM盘的操作:读/写磁盘扇区 查询磁盘大小和弹出设备。对于读/写操作,只需要将主机请求读/写的扇区数转换成为RAM盘的地址,将数据写入或读出就可以了。文件发送完毕后,在Windows

2000下选择弹出设备操作,设备收到后会终止 USB 连接。

13.3.4 USB 控制器

MX1的USB1.1 控制器提供了 6个端点,分别是端点 0到 5,配置如表 2-1。除了端点 0保留作控制外,端点 1~5都可配置为中断 等时或批传输方式,支持全速 12Mbps的传输速度和 8 16 32 64 字节的包长度。工作方式可选择查询 中断或 DMA传输方式。这里只使用了 ep0,ep1和 ep2。其中 ep0为 Control方式,ep1,ep2为 bulk方式。Ep1用来从实验板向 PC机器发送数据,ep2用来接收来自于 PC机器数据和命令。

表 2-1 Endpoint 配置

USBD_#OE

MC9328MX1

USBD_VM

USBD_RVC

USB接口USBD_SPEEDUSBD_VMOUSBD_VPO

USBD_VP

Page 153: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

13.3.5 USB存储设备软件原理

USB存储设备的驱动程序比较复杂。本实验中,我们编写一个设备驱动,这个驱动程序在初始化的时候就注册了USB口的传输中断,当有实验箱通过USB线插入PC时,由于硬件的设计,在PC端会产生中断,通知PC机有USB设备接入,PC端就会通过endpiont 0 向实验箱发送命令要求上传设备描述符用来识别设备类型,驱动要做的就是在即时上传一个USB存储设备的描述符,随后PC会按照Mass Storage的接口协议发送其他命令来获取这个“U盘”的其他信息,比如,容量,标识。。。需要的时候PC端也会发送命令要求读取某扇区。驱动要做的就是申请一块内存用来模拟磁盘,然后执行PC端的命令请求。

另一个问题就是,linux下应用程序该怎么访问被自己伪装起来的这块“U

盘”,这就需要为这个“U”盘实现一个块设备接口。也就是说,我们的这个驱动主体上应该是个块设备。块设备涉及到VFS,比较复杂,本课程里不作介绍了有兴趣的可以参考《linux设备驱动》和示例代码。实验者可以只关注与USB有关的部分。

Page 154: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

在软件设计上,我们在初始化函数init_module中配置好MX1片上USB控制器,然后注册中断处理函数。完成此步后,当实验箱通过USB线接入PC机,PC端就会主动向实验箱发送数据进行设备识别和注册(PC端),并根据PC端用户的操作读写实验箱。这样实验箱每次与PC的数据和指令交互都是从PC端发起的,并引起MX1的响应中断。软件所要做的就是,在中断处理函数中正确识别PC的请求并给予正确的响应,识别需要存储的数据(文件)保存到LFASH存储器中。并根据PC的请求将RAM中已经保存的数据发送给PC。

13.4 实验内容

示例代码在 /usr/local/src/src/usb.tgz 解压并阅读示例代码,下载驱动到实验箱运行。

13.5 实验步骤

1)解压并阅读示例代码/usr/local/src/src/usb.tgz

执行make 编译, # make 得到 usb.o文件2)正确连接试验设备,并确保 J15没有短路。连接实验箱UART1与 PC串口。3)在 LINUX 环境下执行 # minicom. 请确认已配置 MINICOM 的波特率为115200,8个数据位,1 个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。按照屏幕提示按任意键。然后在MINICOM

中输入 # ldrboot kernel 启动实验箱上的 LINUX,然后在MINICOM上输入 # cd tmp

Page 155: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

4)下载驱动:MINICOM中键入 # zmrx (回车)。在MINICOM中按 CTRL+A

然后按 S键,然后选择以 ZMODEM 协议发送我们在第一步编译得到的 usb.o

文件。或者参考第二章以 FTP或者USB方式发送该文件。5)加载模块:系统启动时已经加载 USB驱动,为了实验,需要先卸载原来的USB驱动。在MINICOM中输入 # rmmod usb # insmod usb.o

用USB 电缆连接实验箱的USB接口与 PC的USB接口。 等待一段时间应该可以在 PC端观察到实验箱已经被识别为 USB盘,并且在“我的电脑”中出现一个新盘符,我们接下来可以格式化这个“U盘”并拷贝一些小文件到这个U盘上。 6)为了再实验箱的 linux下读取上一步拷贝的文件,在我的电脑中右键单击 U

盘弹出。

7) 挂装块USB设备 # mount /dev/usb /mnt/usb

8) # ls /mnt/usb 此时应该可以看到刚才在 PC上向 U盘拷贝的那些文件了。实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

第十四章 内核剪裁和文件系统创建实验

14.1 实验目的

(1) 了解内核剪裁的步骤和方法

Page 156: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(2) 了解内核下载的方法(3) 了解文件系统创建的方法(4) 了解文件系统的下载方法

14.2 系统资源配备

(1) 实验箱(2) 标准串口线(3) 以太网线

14.3 实验原理

14.3.1 内核剪裁

内核的剪裁本质上是利用 make程序强大的功能,根据实验箱的硬件组成和软件未来的需要,选择将那些支持功能加入内核中。适当的剪裁可以精简内核大小,提高内核运行速度。

为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:

---自己定制编译的内核运行更快(具有更少的代码)---系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)---不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞---将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些

Page 157: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

在 LINUX环境下,进入 kernel源码树,运行make menuconfig配置内核了,在选择相应的配置时,有三种选择,它们分别代表的含义如下:

Y--将该功能编译进内核N--不将该功能编译进内核M--将该功能编译成可以在需要时动态插入到内核中的模块用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里

可以是空,"*"和"M"。这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要在所提供的几个选项中选择一项。在编译内核的过程中,最烦杂的事情就是这步配置工作了,不清楚到底该如何选取这些选项。实际上在配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。

14.3.2 创建文件系统

文件系统就是文件和目录按一定的组织结构组织起来的实体。嵌入式 linux

也需要文件系统。我们可以想象实验箱中的 FLASH存储器就是硬盘。与硬盘类似,我们需要在 flash上创建文件系统(如同格式化)才能被 linux 识别和使用。

Linux支持绝大多数文件系统,在实验箱中我们选用了 cramfs文件系统。这种文件系统是只读的,有利于保护内核等重要内容不被意外修改。

Page 158: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

为了创建文件系统,我们需要在 pc linux环境下建立一个目录,向目录中拷贝那些我们期望出现在实验箱的 LINUX系统中的文件和目录(有些目录和文件是必须的)。然后执行# cramfs 文件名 目录名 随后将生成一个新文件,名字就是我们刚才输入的文件名。可以将这个新生成的文件比做硬盘或者光盘镜象文件。下一步,类似于刻录

光盘,我们只要将这个文件“复制”到实验箱的 flash中特定地址即可被 linux

内核识别和使用了。前面说过 cramfs是只读的,因此我们还写一个操作 ram的驱动程序,伪装

成硬盘,并且挂载到 /tmp目录。这样,文件系统中出现的/tmp目录实际指向RAM,因此可写,这就是为什么系统中只有/tmp目录是可写的原因。

14.3.3 实验内容

(1) 剪裁内核,增加内核对 EXT3文件系统的支持,然后重新编译。(2) 创建一个 cramfs文件系统,在原有的文件系统的/usr下中加一个 readme

文件。(3) 将新的内核和文件系统下载到实验箱中运行。

14.3.3 实验步骤

1 内核剪裁实验(1) 进入/usr/local/src/src/目录:# cd /usr/local/src/src

(2) 拷贝 linux.tgz 到 /home/下自己帐户的目录 #cp /usr/local/src/src/linux.tgz

Page 159: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

/home/***(***是自己的目录名)

(3) 进入自己的目录 解压 linux.tgz # cd /home/*** # tar zxvf linux.tgz

(4) 进入 linux目录 # cd /home/***/linux 执行 # make menuconfig

(5) 移动方向键盘,到“File systems”按空格进入(6) 移动方向键盘,到“ext3 jouranlling file System support ”按空格,直到这一

行前面的<>中出现*(7) 移动左右方向键直到最下行的”exit”被加亮,然后按回车退回上级菜单(8) 移动左右方向键直到最下行的”exit”被加亮,然后按回车退出(9) 选择“yes”保存刚才做的修改(10) 执行 #make dep #make clean # make Image 重新编译内核。(11)# ll arch/arm/boot 可以看到生成了一个新的 Image文件。(12) 拷 贝 Image 文件到 TFTP 开放 出的目录下。 # cp arch/arm/boot/Image

/tftpboot/Image (对于 linux服务器方式的实验者,请将 Image用 FTP方式下载并拷 贝到 windows 下 TFTP 软件开发的目录下,并启动 TFTP

SERVER )

(13) 配置 PC 端以太网# ifconfig eth0 192.168.0.*** broadcast 192.160.0.255

netmask 255.255.255.0 # route add defaule gw 192.168.0.*** eth0(***是自己主机的 IP 地址。如果 PC机网络工作正常,可以省略,对于 linux服务器方式的实验者,则需要配置自己 PC 在 windows 下的网络和 TFTP

SERVER软件的配置)。(14) 正确连接试验设备,并确保 J15没有短路。连接实验箱 UART1与 PC的

串口。连接实验箱网口与 PC的网口。 在 PC机的 LINUX 环境下执行#

Page 160: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

minicom. 请确认已配置MINICOM的波特率为 115200,8个数据位,1

个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。直到出现 BLOB>

(15) 在 minicom 中配置 BLOB 下实验箱的网络环境 blob> ipconfig ip

192.168.0.xxx server 192.168.0.*** 其中 server 的 ip一定要与配置 PC的时候使用的 IP相同。(xxx是为实验箱分配的 IP 地址,***是 tftp服务器的IP 地址)

(16) 在 BLOB 下使用 TFTP 下载内核:在 MINICOM 中输入 blob> twrite

kernel Image 其中 kernel 是 TFTP命令的参数,Image 是内核文件的文件名。

(17) 启动新 kernel, blob> ldrboot kernel

(18) 恢复原有的内核,将镜像文件/usr/local/src/bin/Image,并烧录到实验箱中。

2 创建文件系统实验(1) 进入/usr/local/src/src/目录 # cd /usr/local/src/src

(2) 拷 贝 fs.tgz 文件到自己 /home/下的子目录 # cp fs.tgz /home/*** #cd

/home/***(***是自己的目录名)(3) 解压 fs.tgz # tar zxvf fs.tgz # cd fs

(4) 进入 fs/usr/local 目录。# cd fs/usr/local

(5) 拷贝一个文件到当前目录:# cp /usr/local/src/src/io.tgz io.tgz

(6) 回到上级目录:# cd /home/***(***是自己的目录名)(7) 创建文件系统:# mkcramfs fs fs.cram 得到 fs.cram文件

Page 161: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(8) 将 fs.cram 拷 贝到 TFTP SERVER 开放 出的目录下: # cp fs.cram

/tftpboot/fs.cram (对于 linux服务器方式的实验者,请将 Image用 FTP

方式下载并拷贝到 windows下 TFTP软件开发的目录下,并启动 TFTP

SERVER)(9) 配置 PC端以太网 # ifconfig eth0 192.168.0.*** broadcast 255.255.255.255

netmask 255.255.255.0(***是 PC机的 IP 地址)(10)正确连接试验设备,并确保 SW1 位于 on-off-off-on 状态。连接实验箱子板的串口与 PC的串口。连接实验箱网口与 PC的网口。 在 PC的 LINUX

环境下执行 # minicom. 请确 认 已配置 MINICOM 的波特率为115200,8个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。直到出现 BLOB>

在minicom中配置 BLOB下实验箱的网络环境 blob> ipconfig ip

192.168.0.*** server 192.168.0.*** 其中 server 的 ip一定要与配置 PC的时候使用的 IP相同。(xxx是为实验箱分配的 IP 地址,***是 tftp服务器的 IP 地址)

(11)在 BLOB 下使用 TFTP 下载内核:在 MINICOM 中输入 blob> twrite

ramdisk fs.cram 其中 ramdiskl 是 TFTP命令的参数,fs.cram 是内核文件的文件名。

(12)启动新 kerner并使用新的文件系统, blob> ldrboot kernel

(13)在MINICOM中输入: # ls /usr/local 可以看到我们已经在文件系统中添加了 io.tgz文件。

(14)恢复原来的文件系统,将文件系统/usr/local/bin/fs.cram烧录到实验箱中。

Page 162: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

Page 163: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第十五章 CAN总线实验

15.1 试验目的

熟悉 CAN 总线控制器MCP2510的工作原理,学会编写MCP2510的驱动程序;熟悉 MX1内部的 SPI借口编程(MX1通过 SPI接口与 MCP2510进行交互);

15.2 系统资源配备

(1) MX1片上 SPI1接口(2) CAN 总线接口器件MCP2510

15.3 实验原理

15.3.1 硬件原理

CAN 总线是一种有效支持分布式控制和实时控制的串行数据通信协议,它是一种多主总线,网络上任意一个节点均可以在任意时刻主动地向网络上的其它节点发送信息,而不分主从,节点之间有优先级之分,因而通信方式灵活;CAN可以点对点、一点对多点(成组)及全局广播等几种方式传送和接收数据 ;CAN采用非破坏性位仲裁技术,优先级发送,可以大大节省总线冲突仲裁时间,在重负荷下表现出良好的性能。

Page 164: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

CAN上的节点数实际可达 110个,通信介质可以是双绞线、同轴电缆或光导纤维,直接通信距离最远可达 10km(传输速率为 5kbps);最高通信速率可达1Mbps(传输距离为 40m)。CAN 协议的一个最大特点是废除了传统的站地址编码,而代之以对通信数据块进行编码,CAN数据链路层采用短帧结构,每一帧为 8个字节,易于纠错。可满足通常工业领域中控制命令,工作状态及测试数据的一般要求。同时,8个字节不会占用总线时间过长,从而保证了通信的实时性。 CAN 总线具有较强的纠错能力,每帧信息都有 CRC校验及其它检错措施,有效地降低了数据的错误率。CAN节点在错误严重的情况下,具有自动关闭的功能,使总线上其它节点不受影响。支持差分收发,因而适合高干扰环境。

MX1片内没有 CAN 总线接口,使用了外部接口转换芯片MCP2510,MX1

Page 165: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

与MCP2510使用 SPI接口连接,通过 SPI接口,MX1 向 MCP2510发送命令和数据,完成数据传输。

15.3.2 软件原理

根据 CAN 总线提供的物理层通讯协议的数据传输特点,CAN 总线驱动属于字符设备,但如果考虑到具体的应用中可能需要将 CAN作为类似网卡的网络设备使用,就需要编写一个网络设备驱动,并在内核中添加 CAN 总线上层协议的支持。在这里,我们仅仅将 CAN 总线作为字符设备,只实现简单的通讯功能。分析原理图,可以得知,MX1通过片内的 SPI口向 MCP2510发送命令和数

据,进行硬件配置,数据传输和接收。所以,驱动程序要做的工作就是,配置MX1片内 SPI 控制寄存器,设置好 SPI的工作方式,时钟频率,通过 SPI 向MCP2510发送命令字,配置MCP2510的工作模式,完成以上初始化配置后就可以通过 SPI 向 MCP2510发送读或者写命令字实现 CAN 总线上数据的发送和接受,随后 MX1 通过 SPI 向 MCP2510 发送 读 取 状 态 寄存器命令,读 取MCP2510 状态寄存器的状态,经过查询(本实验中没有使用中断),来确认数据已经发送或者接收,如果是接收操作,那么再通过 SPI发送读取 MCP2510数据接收 BUFFER命令,将接收的数据读回 MX1。我们只需搭建一个字符驱动程序的框架,将上面的软件实现填充到相应的文件操作结构中就可以了。注意:实验中,我们用软件将 MCP2510设置成 loopback模式,这样一台实验箱就可以完成数据收发实验,需要连接外部设备的时候取消 loopback模式既可。

Page 166: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

15.4 实验内容

(1)阅读 MCP2510的硬件说明文档和MX1芯片手册中有关 SPI接口的内容(2)解压并阅读示例代码 /usr/local/src/src/can.tgz

(3)编写一个字符设备驱动实现 CAN 总线接收和发送功能(4) 编写一个应用程序,通过命令行接收字符串并通过 CAN 总线驱动发送出

去,然后接收回来显示在终端上

15.5 实验步骤

(1) 进入/usr/local/src/src目录 # cd /usr/local/src/src

解压缩 can.tgz文件 # tar zxvf can.tgz

进入 can目录 # cd ./can 执行 make . # make

可以得到 can.o 和 cantest 文件。 (linux 服务器方式的用户需要将/usr/local/src/src/can.tgz 拷贝到/home下自己的目录下解压和编译)。

(2)正确连接试验设备,并确保 J15没有短路。连接实验箱 UART1与 PC的串口。

(3) 在 PC的 LINUX 环境下执行 # minicom. 配置MINICOM的波特率为115200,8个数据位,1 个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。按照屏幕提示按任意键。然后在MINICOM

中输入 # ldrboot kernel 启动实验箱上的 LINUX,然后在MINICOM上输入 # cd tmp.

Page 167: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(4)下载模块:在 MINICOM中键入 # zmrx (回车)。在 MINICOM中按 CTRL+A 然后按 S键,然后选择以 ZMODEM 协议发送我们在第一步编译得到的 can.o文件。或者参考第二章使用 FTP方式或者USB方式下载 can.o文件。重复操作下载 cantest文件。(5) 加载模块:在MINICOM中输入 # insmod can.o (回车)(6) 更改 cantest文件属性 # chmod +x cantest

(7) 执行 cantest # ./cantest [string] 其中 string是希望 CAN 总线向外发送的字符串(示例代码对 string的长度限制是 8个字节),随后的接收操作灰接收到这个字符串并显示出来。观察结果,并更改其他字符串测试。实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

Page 168: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

第十六章 串口通讯实验

15.1 试验目的

掌握 linux下串口编程15.2 系统资源配备

(1) MX1片上UART 2接口(底板上的串口接口)(2) 额外的一根串口线

15.3 实验原理

15.3.1 硬件原理

使用MX1片内的UART 控制器,硬件原理请参考 MX1芯片文档。

Page 169: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

15.3.2 软件原理

串 口 的 驱 动 程 序 在 linux 的 内 核 源 码 中 , linux/drivers/char/

serial_mx1_int_uart.c本系统串口的驱动应为涉及到控制台,不作介绍,只了解应用程序如何配置和使用串口。串口的设备节点是字符型的,/dev/ttyS0 是第一个串口 /dev/ttyS1 是第二个

串口,在本系统中/dev/ttyS0 已经被作为控制台使用,我们使用/dev/ttyS1进行本章实验。串口操作串口操作需要的头文件

#include <stdio.h> /*标准输入输出定义*/

#include <stdlib.h> /*标准函数库定义*/

#include <unistd.h> /*Unix 标准函数定义*/#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> /*文件控制定义*/

#include <termios.h> /*PPSIX 终端控制定义*/

#include <errno.h> /*错误号定义*/

打开串口在 Linux 下串口文件是位于 /dev 下的 串口一 为 /dev/ttyS0

串口二 为 /dev/ttyS1 打开串口是通过使用标准的文件打开函数操作:

Page 170: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

int fd;/*以读写方式打开串口*/fd = open( "/dev/ttyS0", O_RDWR);if (-1 == fd){ /* 不能打开串口一*/

perror(" 提示错误!");}

设置串口最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。 struct termio{ unsigned short c_iflag; /* 输入模式标志 */

unsigned short c_oflag; /* 输出模式标志 */

unsigned short c_cflag; /* 控制模式标志*/unsigned short c_lflag; /* local mode flags */unsigned char c_line; /* line discipline */unsigned char c_cc[NCC]; /* control characters */

};

设置这个结构体很复杂,我这里就只说说常见的一些设置: 波特率设置下面是修改波特率的代码:struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200); /*设置为 19200Bps*/cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);设置波特率的例子函数:

Page 171: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

/***@brief 设置串口通信速率*@param fd 类型 int 打开串口的文件句柄*@param speed 类型 int 串口速度*@return void*/int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,

B38400, B19200, B9600, B4800, B2400, B1200, B300, };int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,

19200, 9600, 4800, 2400, 1200, 300, };void set_speed(int fd, int speed){

int i; int status; struct termios Opt;tcgetattr(fd, &Opt); for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {

if (speed == name_arr[i]) { tcflush(fd, TCIOFLUSH); cfsetispeed(&Opt, speed_arr[i]); cfsetospeed(&Opt, speed_arr[i]); status = tcsetattr(fd1, TCSANOW, &Opt); if (status != 0) {

perror("tcsetattr fd1"); return;

} tcflush(fd,TCIOFLUSH);

} }

}

效验位和停止位的设置:

无效验 8 位Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS8;

Page 172: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

奇效验(Odd) 7 位Option.c_cflag |= ~PARENB;Option.c_cflag &= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;

偶效验(Even) 7 位Option.c_cflag &= ~PARENB;Option.c_cflag |= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;

Space效验 7 位Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= &~CSIZE;Option.c_cflag |= CS8;

设置效验的函数:/***@brief 设置串口数据位,停止位和效验位*@param fd 类型 int 打开的串口文件句柄*@param databits 类型 int 数据位 取值 为 7 或者 8

*@param stopbits 类型 int 停止位 取值为 1 或者 2

*@param parity 类型 int 效验类型 取值为N,E,O,,S*/int set_Parity(int fd,int databits,int stopbits,int parity){

struct termios options; if ( tcgetattr( fd,&options) != 0) {

perror("SetupSerial 1"); return(FALSE);

}options.c_cflag &= ~CSIZE; switch (databits) /*设置数据位数*/{ case 7:

options.c_cflag |= CS7; break;

Page 173: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

case 8: options.c_cflag |= CS8;break;

default: fprintf(stderr,"Unsupported data size\n"); return (FALSE);

}switch (parity) {

case 'n':case 'N':

options.c_cflag &= ~PARENB; /* Clear parity enable */options.c_iflag &= ~INPCK; /* Enable parity checking */ break;

case 'o': case 'O':

options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/ options.c_iflag |= INPCK; /* Disnable parity checking

*/ break;

case 'e': case 'E':

options.c_cflag |= PARENB; /* Enable parity */ options.c_cflag &= ~PARODD; /* 转换为偶效验*/ options.c_iflag |= INPCK; /* Disnable parity checking */break;

case 'S': case 's': /*as no parity*/ options.c_cflag &= ~PARENB;

options.c_cflag &= ~CSTOPB;break; default:

fprintf(stderr,"Unsupported parity\n"); return (FALSE);

} /* 设置停止位*/ switch (stopbits){

case 1: options.c_cflag &= ~CSTOPB; break;

case 2:

Page 174: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

options.c_cflag |= CSTOPB; break;default:

fprintf(stderr,"Unsupported stop bits\n"); return (FALSE);

} /* Set input parity option */ if (parity != 'n')

options.c_iflag |= INPCK; tcflush(fd,TCIFLUSH);options.c_cc[VTIME] = 150; /* 设置超时 15 seconds*/ options.c_cc[VMIN] = 0; /* Update the options and do it NOW */if (tcsetattr(fd,TCSANOW,&options) != 0) {

perror("SetupSerial 3"); return (FALSE);

} return (TRUE); }

需要注意的是:如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下: options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/options.c_oflag &= ~OPOST; /*Output*/

读写串口设置好串口之后,读写串口就很容易了,把串口当作文件读写就是。 发送数据 char buffer[1024];int Length;int nByte;nByte = write(fd, buffer ,Length)

读取串口数据 使用文件操作 read 函数读取,如果设置为原始模式(Raw Mode)传输数据,那么 read 函数返回的字符数是实际串口收到的字符数。

Page 175: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书可以使用操作文件的函数来实现异步读取,如 fcntl,或者 select等来操作。 char buff[1024];int Len;int readByte = read(fd,buff,Len);

关闭串口关闭串口就是关闭文件。 close(fd);

示例代码下面是一个本章实验的部分代码,它从命令行接收波特率和字符串这两个参数,然后改变串口的波特率后发送并从串口读取数据,当从串口读取到回车键后退出。 if ((fd = open(dev, O_RDWR)) < 0){ printf("open <%s> error\n",dev); exit(1); } if ( tcgetattr(fd, &term) ){ printf("error when get attribute \n"); exit(1); } /* set new value */ old = cfgetispeed(&term); term.c_cflag &= ~old; term.c_cflag |= speed; if ( tcsetattr(fd, TCSANOW ,&term) ){ printf("error when set attribute \n"); exit(1); } memset(&term,0x00,sizeof(term)); if ( tcgetattr(fd, &term) ){ printf("error when get attribute \n"); exit(1); } speed = cfgetispeed(&term); speed = cfgetospeed(&term); if(argc > 3){ write(fd, argv[3], strlen(argv[3]));

Page 176: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

do{ read(fd,&c,1); putchar(c); }while(c != '\n'); } close(fd); return ret;

15.4 实验内容

(1)参考示例代码(),编写一个应用程序,它从命令行接收波特率和字符串这两个参数,然后改变串口二的波特率,并发送字符串,然后监测串口二的数据,并打印出来,直到遇到回车为止

(2)示例代码在 /usr/local/src/example/uart.tgz 压缩包中15.5 实验步骤

(1) 进入/usr/local/src/example目录 # cd /usr/local/src/example

解压缩 uart.tgz文件 # tar zxvf uart.tgz

进入 uart目录 # cd ./uart

执行 make . # make

可以得到 uart文件。(linux服务器方式的用户需要将/usr/local/src/src/

can.tgz 拷贝到/home下自己的目录下解压和编译)。(2)正确连接试验设备,并确保 J15没有短路。连接实验箱UART1与 PC的串口。(3)在 LINUX 环境下执行# minicom. 请配置 MINICOM 的波特率为

115200,8个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM 中可以看到有数据 输出。按照屏幕提 示按任意键。然后在

Page 177: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

MINICOM中输入 blob> ldrboot kernel 启动实验箱上的 LINUX,然后在MINICOM上输入 # cd tmp.

(4)下载模块:在 MINICOM中键入 # zmrx (回车)。在 MINICOM中按 CTRL+A 然后按 S键,然后选择以 ZMODEM 协议发送我们在第一步编译得到的 uart文件。或者参考第二章使用 FTP方式或者 USB方式下载 uart

文件。(5) 使用额外的串口线连接实验箱的串口二(底板上的串口)到 PC的串口。打开新的超级终端,设置好波特率为 115200 8 位,无校验,无流控。(6) 更改 uart文件属性 # chmod +x uart

(7) 执行 uart # ./uart /dev/ttyS1 115200 [string] 其中 string是希望向外发送的字符串(示例代码对 string的长度限制是 8个字节),切换刚才新建的超级终端,应该可以看到[string]被打印出来,在这个终端可以输入字符,观察在实验箱的系统上是否可以正确显示,直到输入回车退出。(如果没有第二根串口线可以使用/dev/ttyS0 这样就可以在当前的串口终端上进行实验)。实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

Page 178: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

十七章 多进程编程实验

15.1 试验目的

掌握 linux多进程编程

15.2 系统资源配备

(1) E-ARM9实验箱(2) 示例代码在 /usr/local/src/src/fork.tgz 压缩包中

15.3 实验原理

本节实验是上层应用程序的实验,代码本身与底层硬件无关,但这个实验是综合了前面 lcd实验,audio实验的内容的综合实验。是在前面实验基础上,在

Page 179: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

系统中运行两个进程,一个用来调用 LCD驱动显示交替显示 4幅图片,一个进程用来播放一首 mp3,达到多媒体效果。本小节简要说明以下多进程编程的一些概念。

1、fork 系统调用 在 Linux系统中,用户创建一个进程的一个方法就是使用系统调用 fork。此时内核分配给子进程一个唯一的进程标识号(PID),子进程与父进程具有相同的数据和连接关系(继承)。唯一不同的是 fork 返回子进程的 PID给父进程,而返回 0给子进程。从 fork的返回值可以区分当前执行于那个进程。子进程创建后,将与父进程一起在内核的调度下轮流执行。 系统调用 fork的声明格式如下: pid_t fork(void); 在使用该系统调用的程序中要加入以下头文件: #include <unistd.h> 当调用执行成功时,该调用对父进程返回子进程的 PID,对子进程返回 0。调用失败时,给父进程返回-1,没有子进程创建。 2、wait 系统调用 wait的功能是发出该调用的进程如果有子进程,就睡眠直到它们中的一个终止为止。该调用声明的格式如下: pid_t wait(int *status) pid_t waitpid(pid_t pid, int *status, int options); 在使用这些系统调用的程序中要加入以下头文件 #include <sys/types.h> #include <sys/wait.h> 发出 wait 调用的进程进入睡眠直到它的一个子进程退出时或收到一个不能被忽略的信号时被唤醒。如果调用发出时,已经有退出的子进程(这时子进程的状态是僵死状态),该调用立即返回。其中调用返回时参数 status中包含子进程退出时的状态信息。 调用 waitpid与调用 wait的区别是 waitpid等待由参数 pid指定的子进程退出。其中参数 pid的含义与取值方法如下: (1) 参数 pid < -1 时,当退出的子进程满足下面条件时结束等待:该子进程的进程组ID(process group)等于绝对值的 pid这个条件。 (2) 参数 pid = 0时,等待任何满足下面条件的子进程退出:该子进程的进程组 ID等于发出调用进程的进程组 ID。 (3) 参数 pid > 0时,等待进程 ID等于参数 pid的子进程退出。 (4) 参数 pid = -1时,等待任何子进程退出,相当于调用wait。 对于调用waitpid中的参数 options的取值及其含义如下: WNOHANG:该选项要求如果没有子进程退出就立即返回。 WUNTRACED:对已经停止但未报告状态的子进程,该调用也从等待中返回和报告状态。如果 status 不是空,调用将使 status指向该信息。下面的宏可以用来检查子进程的返回状态。前面三个用来判断退出的原因,后面三个是对应不同的原因返回状态值: (1) WIFEXITED(status):如果进程通过系统调用_exit或函数调用 exit 正常退出,该宏的值为真。 (2) WIFSIGNALED(status):如果子进程由于得到的信号(signal)没有被捕捉而导致退出

Page 180: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书时,该宏的值为真。 (3) WIFSTOPPED(status):如果子进程没有终止,但停止了并可以重新执行时,该宏返回真。这种情况仅出现在waitpid 调用中使用了 WUNTRACED选项。 (4) WEXITSTATUS(status):如果 WIFEXITED(status) 返 回 真,该宏返 回 由子进程调用_exit(status)或 exit(status)时设置的调用参数 status 值。 (5) WTERMSIG(status):如果WIFSIGNALED(status)返回为真,该宏返回导致子进程退出的信号(signal)的值。 (6) WSTOPSIG(status):如果WIFSTOPPED(status)返回真,该宏返回导致子进程停止的信号(signal)值。 该调用返回退出的子进程的 PID;或者发生错误时返回-1;或者设置了 WNOHANG选项没有子进程退出就返回 0;发生错误时,可能设置的错误代码如下: ECHILD:该调用指定的子进程 pid 不存在,或者不是发出调用进程的子进程。 EINVAL:参数 options无效。 ERESTARTSYS:WNOHANG没有设置并且捕获到 SIGCHLD或其它未屏蔽信号。 关于wait 调用的例子,前面在介绍 fork 调用时,就有了简单的应用。此处不再举例。 注意 子进程退出(SIGCHLD)信号设置不同的处理方法,会导致该调用不同的行为,详细情况见 Linux信号处理机制。 3、sleep 函数调用 函数调用 sleep可以用来使进程挂起指定的秒数。该函数调用的声明格式如下: unsigned int sleep(unsigned int seconds) 在使用这个函数调用的程序中加上以下的头文件: #include <unistd.h> 该函数调用使得进程挂起一个指定的时间,直到指定时间用完或者收到信号。系统的活动对指定的时间有一定的影响。Linux系统是用 SIGALRM实现的,在 Linux系统里,sleep 函数不能和 alarm()调用混用。 如果指定挂起的时间到了,该调用返回 0;如果该函数调用被信号所打断,则返回剩余挂起的时间数(指定的时间减去已经挂起的时间)。 下面我们看看本章实验的部分示例代码。该例子产生一个子进程,父进程在 LCD上显示一个动画,子进程播放 MP3。 源代码在光盘 example/ fork目录中。

int fb;

int status;

pid_t cld_pid;

int fp_bmp;

struct termios save;

int current_vt;

unsigned char *lcd_base = NULL;

Page 181: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书static struct fb_cmap cmap, original_cmap;

char fn[4][20]={"cat01.bmp", "cat02.bmp", "cat03.bmp", "cat04.bmp"};

int times, od;

static void get_cmap(struct fb_cmap *cmap, int fb)

{

memset(cmap, 0,sizeof(struct fb_cmap));

cmap->start=0;

cmap->len=256;

cmap->red=calloc(256, sizeof(__u16));

cmap->green=calloc(256, sizeof(__u16));

cmap->blue=calloc(256, sizeof(__u16));

ioctl(fb, FBIOGETCMAP, cmap); /*调用 ioctl 读取系统调色板*/}

int fb_init()

{

struct fb_fix_screeninfo finfo;

struct fb_var_screeninfo vinfo;

struct termios current;

tcgetattr(0, &save); /*设置系统控制台属性*/

Page 182: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书current = save;

current.c_lflag &= ~ICANON;

current.c_lflag &= ~ECHO;

current.c_cc[VMIN] = 1;

current.c_cc[VTIME] = 0;

tcsetattr(0, TCSANOW, &current);

current_vt = open("/dev/tty", O_RDWR);

ioctl(current_vt, KDSETMODE, KD_GRAPHICS);

fb = open("/dev/fb0", O_RDWR, 0);

if (fb < 0) {

printf( "Can't open /dev/fb0\n");

return 1;

}

if ( ioctl(fb, FBIOGET_FSCREENINFO, &finfo) < 0 ) {

/*读取 LCD配置信息*/

printf("Can't get FSCREENINFO\n");

close(fb);

return 1;

}

if ( ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) < 0 ) {

printf("Can't get VSCREENINFO\n");

close(fb);

Page 183: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书return 1;

}

if (vinfo.bits_per_pixel != 8) { /*是否为 8位色显示模式*/

vinfo.bits_per_pixel = 8;

ioctl(fb, FBIOPUT_VSCREENINFO, &vinfo);

}

lcd_base = mmap(NULL, 320*240 , PROT_READ|PROT_WRITE, MAP_SHARED, fb, 0);

if ( lcd_base == MAP_FAILED )

{

printf("Can't mmap\n");

close(fb);

return 1;

}

printf("Video memory address = 0x%x\n",lcd_base);

// memset(lcd_base,0x3f,320*240);

get_cmap(&original_cmap, fb);

return 0;

}

int display_bmp(char * bmp, int fb)

{

Page 184: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书unsigned int size,pos=0x36;

char * tp;

char tmp[4];

tp=malloc(76800);

if(!tp){

printf("No enough memoryp\n");

return 1;

}

fp_bmp = open(bmp,O_RDONLY);

if (!fp_bmp) {

printf("Can't open %s\n",bmp);

return 1;

}

get_cmap(&cmap,fb);

lseek(fp_bmp, pos, SEEK_SET);

for(size=0;size<256; size++){ /*提取位图的调色板,并转换为 12位模式*/

read(fp_bmp,&tmp,4);

cmap.blue[size]= (tmp[0]>>4)<<12;

cmap.green[size]=(tmp[1]>>4)<<12;

cmap.red[size]= (tmp[2]>>4)<<12;

}

Page 185: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书#if 1

if( ioctl(fb, FBIOPUTCMAP, &cmap)<0){ /*将位图的调色板写入系统*/

printf(" FBIOPUTCMA ERROR\n");

free(tp);

close(fp_bmp);

return 1;

}

#endif

lseek(fp_bmp, pos+1024, SEEK_SET); /* 向frambuffer写入象素数据*/

read(fp_bmp, tp, 76800);

for(size=0;size<76800;size++)

*(lcd_base+size)=*(tp+76800-size);

free(tp);

close(fp_bmp);

return 0;

}

int main()

{

cld_pid=fork(); /*创建子进程

Page 186: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书switch(cld_pid)

{

case -1:

break;

case 0:{ /*这是子进程*/system("playmp3 demo.mp3"); /*system

系统调用*/exit(0);

}

default:{ /*这是父进程*/

if(fb_init()) break; /*初始化 lcd*/

memset(lcd_base,0x3f,320*240); /*向frambuffer填充背景色*/

od=0;

for(times =0 ; times< 80;times++){

if(display_bmp(fn[od], fb)){ /*交替显示图片*/

printf("display error %s\n",fn[od]);

Page 187: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书break;

}

od++;

if(od>3) od=0;

sleep(1);

}

}

}

if(cld_pid)

{

waitpid(cld_pid,&status,0);

/*等待子进程退出*/

if( ioctl(fb, FBIOPUTCMAP, &original_cmap)){ /*

恢复系统默认调色板*/ printf(" FBIOPUTCMA ERROR\n");

close(fb);

return 1;

}

memset(lcd_base,0x3f,320*240);

close(fb);

}

exit(0);

}

Page 188: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

15.4 实验内容

(1)编写一个应用程序,它从命令行接收波特率和字符串这两个参数,然后改变串口二的波特率,并发送字符串,然后监测串口二的数据,并打印出来,直到遇到回车为止

(2)示例代码在 /usr/local/src/src/fork.tgz 压缩包中

15.5 实验步骤

(1) 进入/usr/local/src/src目录 # cd /usr/local/src/example

解压缩 uart.tgz文件 # tar zxvf fork.tgz

进入 uart目录 # cd ./fork

执行 make . # make

可以得到 fork文件。(linux服务器方式的用户需要将/usr/local/src/src/can.tgz

拷贝到/home下自己的目录下解压和编译)。

(2)正确连接试验设备,并确保 J15没有短路。连接实验箱UART1与 PC的串口。

(3) 在 LINUX 环境下执行# minicom. 请配置MINICOM的波特率为 115200,8

个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。按照屏幕提示按任意键。然后在MINICOM中输入 blob> ldrboot kernel 启动实验箱上的 LINUX,然后在MINICOM上输入# cd tmp.

Page 189: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

(4)下载程序,图片和mp3模块:在MINICOM中键入 # zmrx (回车)。在MINICOM中按 CTRL+A 然后按 S键,然后选择以ZMODEM 协议发送我们在第一步编译得到的 fork文件。或者参考第二章使用 FTP方式或者USB方式下载 fork文件。同样的方式下载/usr/local/src/bmp下的四个 bmp

文件和/usr/local/src/mp3下的 demp.mp3。

(5) 更改 fork 文件属 性 # chmod +x fork 加载音频驱动 #insmod /dervier/audio.o

(6) 执行 fork # ./fork 观察是音乐是否播放,lcd上是够有卡通动画。

实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

十八章 MiniGUI 编程实验

18.1 试验目的

了解 MiniGUI,以及基于MiniGUI的开发过程。

Page 190: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

18.2 系统资源配备

(1) E-ARM9实验箱(2) 示例代码在 /usr/local/src/src/MiniGUI-suits.tgz 压缩包中

18.3 实验原理

本节实验是上层应用程序的实验,代码本身与底层硬件无关。主要介绍一个嵌入式 Linux 系统中,应用较为广泛的图形用户界面系统(GUI)-- MiniGUI,以及基于MiniGUI进行嵌入式软件开发的过程,我们将以一个 helloworld程序,来说明基本的编程过程。

本小节简要说明一下关于MiniGUI的一些概念。

MiniGUI是一个由中国人发起的自由软件项目,是基于 Linux、面向嵌入式系统的轻量级图形用户界面支持系统。MiniGUI 项目开始于 1998 年底,到目前为止,已经走向成熟和稳定,并且在许多实际产品或项目中得到了广泛的应用。

18.3.1、事件驱动编程

MiniGUI 是一个图形用户界面支持系统,通常的 GUI 编程概念均适用于MiniGUI编程,如窗口以及事件驱动编程等。在传统的 GUI 图形系统模型中,键盘和鼠标动作产生由应用程序不断轮询的事件。这些事件通常被发送到具有焦点的窗口,而应用程序把这些事件交由和该

Page 191: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

窗口联系的例程来处理。这些窗口例程通常是由应用程序定义的,或者是某些标准例程中的一个。操作系统、其它窗口的事件处理例程和应用程序代码等都可以产生事件。用于处理事件的窗口例程通常标志了某一个“窗口类”,具有相同窗口例程的窗口实例被认为是属于同一窗口类。焦点和光标的概念用于管理输入设备和输入事件的传送。一个指点光标是一个绘制在屏幕之上的小位图,指示当前的指点位置。以某种非破坏性的方式绘制该位图是窗口系统的责任,不过应用程序可以控制绘制哪一个位图以及是否显示该光标。应用程序还可以捕捉指点光标和获取光标事件,即使该光标已经超出该应用程序窗口的显示范围。键盘输入同样有键盘焦点和键盘光标的概念。只有具有键盘焦点的窗口才能获取键盘事件。改变窗口的焦点通常由特殊键的事件和指点光标事件完成。具有键盘焦点的窗口通常绘制有一个键盘光标。该光标的存在形式、位置、和该光标的控制完全是由窗口的事件处理例程控制的。应用程序会通过发送事件来要求重绘窗口或窗口的某一部分,这些事件通常

由窗口例程来处理。

18.3.2 MiniGUI-Lite和MiniGUI-Threads

MiniGUI目前分为两个不同的版本-MiniGUI-Lite版和MiniGUI-Threads版。MiniGUI的早期版本也就是MiniGUI-Threads采用基于 POSIX 线程的消息传递和窗口管理机制,这种实现提供最大程度上的数据共享,但也同时造成MiniGUI 体系结构上的脆弱。如果某个线程因为非法的数据访问而终止运行,则

Page 192: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

整个系统都将受到影响。为了解决这个问题,使MiniGUI更符合嵌入式系统应用,MiniGUI 从 0.98开始推出 Lite版本。Lite版本的MiniGUI使用进程机制,抛弃了 pthread 库,从而使得MiniGUI更稳定和更高效率。在MiniGUI Lite 版本中,我们可以同时运行多个 MiniGUI 应用程序。首先我

们启动一个服务器程序 mginit,然后我们可以启动其他作为客户端运行的 MiniGUI 应用程序。如果因为某种原因客户终止,服务器不受影响,可以继续运行。

MiniGUI-Lite 区别于 MiniGUI-Threads的最大不同在于可以在 MiniGUI-Lite

程序中创建多个窗口,但不能启动新的进程建立窗口。除此之外,其他几乎所有的 API 都和 MiniGUI 原有版本是兼容的。此外,MiniGUI 提供类Win32的 API,熟悉Win32编程的读者可以很快地掌握MiniGUI编程的基本方法和各个的API接口函数。18.3.3 HelloWorld 程序下面我们看看本章实验的部分示例代码。该例子是一个典型的 helloworld程序。 源代码在光盘 example/minigui目录中。

/*

* helloworld.c

*

*/

#include <minigui/common.h>

#include <minigui/minigui.h>

#include <minigui/window.h>

Page 193: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书#include <minigui/gdi.h>

static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)

{

HDC hdc;

switch (message) {

case MSG_PAINT:

hdc = BeginPaint (hWnd);

TextOut (hdc, 0, 0, "Hello, world!");

EndPaint (hWnd, hdc);

break;

case MSG_CLOSE:

DestroyMainWindow (hWnd);

PostQuitMessage (hWnd);

return 0;

}

return DefaultMainWinProc(hWnd, message, wParam, lParam);

}

int MiniGUIMain (int argc, const char* argv[])

Page 194: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书{

MSG Msg;

HWND hMainWnd;

MAINWINCREATE CreateInfo;

#ifdef _LITE_VERSION

SetDesktopRect(0, 0, 800, 600);

#endif

CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;

CreateInfo.dwExStyle = WS_EX_NONE;

CreateInfo.spCaption = "HelloWorld";

CreateInfo.hMenu = 0;

CreateInfo.hCursor = GetSystemCursor(0);

CreateInfo.hIcon = 0;

CreateInfo.MainWindowProc = HelloWinProc;

CreateInfo.lx = 0;

CreateInfo.ty = 0;

CreateInfo.rx = 300;

CreateInfo.by = 220;

CreateInfo.iBkColor = COLOR_lightwhite;

CreateInfo.dwAddData = 0;

CreateInfo.hHosting = HWND_DESKTOP;

Page 195: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

hMainWnd = CreateMainWindow (&CreateInfo);

if (hMainWnd == HWND_INVALID)

return -1;

ShowWindow(hMainWnd, SW_SHOWNORMAL);

while (GetMessage(&Msg, hMainWnd)) {

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}

MainWindowThreadCleanup (hMainWnd);

return 0;

}

该程序在屏幕上创建一个大小为 300x220像素的应用程序窗口,并在窗口客户区的中部显示“Hello world!”,如图 18.1 所示:

Page 196: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

图 18.1 helloworld程序的输出

18.3.3.1 头文件

helloworld.c 的开始 所包括的三个头文件 <minigui/minigui.h>、 <minigui/

common.h>、和<minigui/window.h>是所有的MiniGUI应用程序都必须包括的头文件。minigui.h包含了全局的和通用的接口函数以及某些杂项函数的定义,common.h包括MiniGUI常用的宏以及数据类型的定义,window.h定义了和窗口有关的宏、数据类型、数据结构和窗口函数。使用GDI 函数和控件的MiniGUI应用程序还必须包括另外两个常用的头文件

-<minigui/gdi.h>和<minigui/control.h>。所以,一个MiniGUI程序的开始通常包括如下的MiniGUI相关头文件:

#include <minigui/common.h>

#include <minigui/minigui.h>

#include <minigui/window.h>

#include <minigui/gdi.h>

Page 197: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书#include <minigui/control.h>

18.3.3.2 程序入口点

一个 C 程序的入口点为 main 函数,而一个 MiniGUI 程序的入口点为MiniGUIMain,通常如下:

int MiniGUIMain (int argc, const char* argv[])

main 函数已经在MiniGUI中定义了,该函数在进行一些MiniGUI的初始化工作之后调用MiniGUIMain 函数。所以,每个MiniGUI应用程序(无论是 server

端程序mginit 还是客户端应用程序)的入口点为 MiniGUIMain 函数。参数 argc

和 argv与 C程序main 函数的参数 argc和 argv的含义是一样的,分别为命令行参数个数和参数字符串数组指针。

18.3.3.3 设置显示区域 SetDesktopRect(0, 0, 320, 240);

SetDesktopRect是MiniGUI-Lite版本专有的函数。在MiniGUI-lite版本中,每一个MiniGUI客户端程序在调用其它 MiniGUI 函数之前必须调用该函数以设置程序的桌面显示矩形区域。

SetDesktopRect是一个宏,定义在头文件minigui.h中,如下: #define SetDesktopRect(lx, ty, rx, by) \

JoinLayer ("", "", lx, ty, rx, by)

所以,你也可以用 JoinLayer 函数来代替 SetDesktopRect,来设置程序的桌面

Page 198: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

显示区域。

18.3.3.4 创建和显示主窗口 hMainWnd = CreateMainWindow (&CreateInfo);

每个MiniGUI应用程序的初始界面一般都是一个主窗口,你可以通过调用CreateMainWindow 函 数 来 创 建 一 个 主 窗 口 , 其 参 数 是 一 个 指 向MAINWINCREATE 结构的指针,本例中就是 CreateInfo,返回值为所创建主窗口的句柄。MAINWINCREATE 结 构 描述一个主窗口的属 性,你在使用CreateInfo创建主窗口之前,需要设置它的各项属性。

CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;

设置主窗口风格,这里把窗口设为可见、有边线和标题。 CreateInfo.dwExStyle = WS_EX_NONE;

设置主窗口的扩展风格,该窗口没有扩展风格。 CreateInfo.spCaption = "HelloWorld";

设置主窗口的标题为“HelloWorld”。 CreateInfo.hMenu = 0;

设置主窗口的主菜单,该窗口没有主菜单。 CreateInfo.hCursor = GetSystemCursor(0);

设置主窗口的光标为系统缺省光标。

Page 199: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书 CreateInfo.hIcon = 0;

设置主窗口的图标,该窗口没有图标。 CreateInfo.MainWindowProc = HelloWinProc;

设置主窗口的窗口过程函数为 HelloWinProc,所有发往该窗口的消息由该函数处理。

CreateInfo.lx = 0;

CreateInfo.ty = 0;

CreateInfo.rx = 300;

CreateInfo.by = 220;

设置主窗口在屏幕上的位置,该窗口左上角位于 (0, 0),右下角位于 (300,

220)。 CreateInfo.iBkColor = COLOR_lightwhite;

设置主窗口的背景色为白色,COLOR_lightwhite是MiniGUI预定义的颜色值。 CreateInfo.dwAddData = 0;

设置主窗口的附加数据,该窗口没有附加数据。 CreateInfo.hHosting = HWND_DESKTOP;

设置主窗口的属主窗口为桌面窗口。 ShowWindow(hMainWnd, SW_SHOWNORMAL);

创建完主窗口之后,还需要调用 ShowWindow 函数才能把所创建的窗口显示

Page 200: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

在屏幕上。ShowWindow的第一个参数为所要显示的窗口句柄,第二个参数指明显示窗口的方式(显示还是隐藏),SW_SHOWNORMAL 说明要显示主窗口,并把它置为顶层窗口。

18.3.3.5 进入消息循环

在调用 ShowWindow 函数之后,主窗口已经显示在屏幕上。和其它 GUI一样,现在是进入消息循环的时候了。MiniGUI为每一个MiniGUI程序维护一个消息队列。在发生事件之后,MiniGUI将事件转换为一个消息,并将消息放入目标程序的消息队列之中。应用程序现在的任务就是执行如下的消息循环代码,不断地从消息队列中取出消息,进行处理:

while (GetMessage(&Msg, hMainWnd)) {

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}

Msg 变量是类型为MSG的结构,MSG 结构在window.h中定义如下:typedef struct _MSG

{

HWND hwnd;

int message;

WPARAM wParam;

LPARAM lParam;

#ifdef _LITE_VERSION

Page 201: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书 unsigned int time;

#else

struct timeval time;

void* pAdd;

#endif

} MSG;

typedef MSG* PMSG;

GetMessage 函数调用从应用程序的消息队列中取出一个消息: GetMessage(&Msg, hMainWnd)

该函数调用的第二个参数为要获取消息的主窗口的句柄,第一个参数为一个指向 MSG 结构的指针,GetMessage 函数将用从消息队列中取出的消息来填充该消息结构的各个域,包括:

hwnd 消息发往的窗口的句柄。在 helloworld.c 程序中,该 值与hMainWnd相同。

message 消息标识符。这是一个用于标识消息的整数值。每一个消息均有一个对应的预定义标识符,这些标识符定义在 window.h 头文件中,以前缀MSG开头。

wParam 一个 32 位的消息参数,其含义和值根据消息的不同而不同。 lParam 一个 32 位的消息参数,其含义和值取决于消息的类型。 time 消息放入消息队列中的时间。

只要从消息队列中取出的消息不为MSG_QUIT,GetMessage就返回一个非 0

Page 202: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

值,消息循环将持续下去。MSG_QUIT消息使 GetMessage 返回 0,导致消息循环的终止。

TranslateMessage(&Msg);

TranslateMessage 函数把击键消息转换为MSG_CHAR消息,然后直接发送到窗口过程函数。

DispatchMessage(&Msg);

DispatchMessage 函数最终将把消息发往该消息的目标窗口的窗口过程,让它进行处理,在本例中,该窗口过程就是 HelloWinProc。也就是说,MiniGUI在Dispatch 函数中调用主窗口的窗口过程函数(回调函数)对发往该主窗口的消息进行处理。处理完消息 之后,应用程序的窗口过程函数将返 回到DispatchMessage 函数中,而 DispatchMessage 函数最后又将返回到应用程序代码中,应用程序又从下一个GetMessage 函数调用开始消息循环。

18.3.3.6 窗口过程函数

窗口过程函数是MiniGUI程序的主体部分,应用程序实际所做的工作大部分都发生在窗口过程函数中,因为 GUI程序的主要任务就是接收和处理窗口收到的各种消息。在 helloworld.c程序中,窗口过程是名为 HelloWinProc的函数。窗口过程函数可以由程序员任意命名,CreateMainWindow 函数根据 MAINWINCREATE 结构类型的参数中指定的窗口过程创建主窗口。

Page 203: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

窗口过程函数总是定义为如下形式:static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)

窗口过程的 4个参数与MSG 结构的前四个域是相同的。第一个参数 hWnd是接收消息的窗口的句柄,它与 CreateMainWindow 函数的返回值相同,该值标识了接收该消息的特定窗口。第二个参数与MSG 结构中的message域相同,它是一个标识窗口所收到消息的整数值。最后两个参数都是 32 位的消息参数,它提供和消息相关的特定信息。程序通常不直接调用窗口过程函数,而是由 MiniGUI进行调用。也就是说,

它是一个回调函数。窗口过程函数不予处理的消息应该传给 DefaultMainWinProc 函数进行缺省处理,从 DefaultMainWinProc 返回的值必须由窗口过程返回。

18.3.3.7 屏幕输出

程序在响应 MSG_PAINT消息时进行屏幕输出。应用程序应首先通过调用BeginPaint 函数来获得设备上下文句柄,并用它调用GDI 函数来执行绘制操作。这里,程序使用 TextOut 文本输出函数在客户区的中部显示了一个“ Hello

world!”字符串。绘制结束之后,应用程序应调用 EndPaint 函数释放设备上下文句柄。

18.3.3.8 程序的退出

Page 204: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个 MSG_CLOSE消息。helloworld程序在收到MSG_CLOSE消息时调用DestroyMainWindow 函数销毁主窗口,并调用 PostQuitMessage 函数在消息队列中投入一个MSG_QUIT消息。当GetMessage 函数取出 MSG_QUIT消息时将返回 0,导致程序退出消息循环。程序最后调用MainWindowThreadCleanup 清除主窗口所使用的消息队列等系统资源并最终由 MiniGUIMain 返回。

18.4 实验内容

(1)编写一个 HelloWorld 应用程序,它在 LCD 上显 示“Hello Linux GUI

World!”。(2)示例代码在 /usr/local/src/src/ mde-1.3.0.em-arm9.tgz 压缩包中,与实验有关的代码是其中 hello子目录下的内容。

18.5 实验步骤

(1) 进入/usr/local/src/src目录 # cd /usr/local/src/src

解压缩MiniGUI-suits.tgz文件 # tar zxvf mde-1.3.0.em-arm9.tgz

进入mde-1.3.0.em-arm9目录 # cd ./ mde-1.3.0.em-arm9

配置编译环境 # ./buildlib-mx1-em-arm9

Page 205: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

进入 hello目录 # cd hello

执行 make . # make

可以得到 hello 文件。 (linux 服务器方式的用户需要将 /usr/local/src/src/

MiniGUI-suits.tgz 拷贝到/home下自己的目录下解压和编译)。

(2)正确连接试验设备,并确保 J15没有短路。连接实验箱UART1与 PC的串口。

(3) 在 LINUX 环境下执行# minicom. 请配置MINICOM的波特率为 115200,8

个数据位,1个停止位 无流控。打开实验箱的电源开关,在MINICOM中可以看到有数据输出。按照屏幕提示按任意键。然后在MINICOM中输入 blob> ldrboot kernel 启动实验箱上的 LINUX,然后在MINICOM上输入# cd /tmp/mgapp 删除mgapp文件, # rm mgapp.

(4)下载程序:在MINICOM中键入 # zmrx (回车)。在MINICOM中按 CTRL+A 然后按 S键,然后选择以ZMODEM 协议发送我们在第一步编译得到的 hello文件。或者参考第二章使用 FTP方式或者USB方式下载hello文件。同样

(5) 更改 hello文件属性并改名为mgapp: # chmod +x hello # mv hello

magpp(本应该将 mde-1.3.0.em-arm9/hello/res下的全部文件拷贝到实验箱/tmp/

mgapp/res下,随机提供的文件系统启动后,这两个目录的内容完全相同,所以只要mde-1.3.0.em-arm9/hello/res下的文件没有修改过,可以不必下载了)

(6) 启动minigui:进入mginit 目录#cd /root/minigui/mginit

设置动态库路径 #export LD_LIBRARY_PATH=/lib:/usr/local/lib

Page 206: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

运行触摸屏校准程序 # calibrate

以后台方式执行 mginit # ./mginit &

(7) 运行应用程序:我 们有两种方式可以在 minigui 上运行我 们编写的hello(已经改名为mgapp)程序。

方式 1: 回到/tmp/mgapp目录下运行 mgapp # ./mgapp

方式 2: 用触摸笔点击屏幕上托盘上第三个小图标。观察 lcd上是否有标题为”Hello World”的窗口产生

(8)退出 minigui:退出的方式也有两种方式 1:在MINIGUI的界面中点击 QUIT

方式 2: 在超级终端中按 ctrl-c

实验结束后关闭实验箱电源,将电源线和串口线放入实验箱。关闭 PC机。

附录 LINUX 常用操作介绍

1 linux 常用命令

登陆:开机后需要登陆才可进入 LINUX环境,不同的用户拥有不同的权限,其权限由超级用户 root指定。

Logout: 注销当前用户,重新登陆。

Page 207: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

Reboot:重新启动主机

shutdown 0 : 立即关机

Command –help: 获取 command命令的帮助信息。

Ls {file or dir}: 查看{file}文件或者 dir下所有文件列表。省略 file 表示查看当前目录下所有文件。

Ll: {file or dir}: 查看{file}文件或者 dir 下所有文件的详细属性。省略 file 表示查看当前目录下所有文件。

Cd [directory]: 进入[directory]目录。根目录用 /表示, 上级目录用..表示。

Rm [file] {-f} {-r} 删除 file文件。 -f 表示无须确认直接强制删除。 -r 表示删除目录。

Cp [sfile ] [dfile] 拷贝 sfile并命名为 dfile.

Mv [sfile] [dfile] 移动 sfile 为 dfile.

Mount [dev] [dir] 挂装 dev设备上的文件系统到目录 dir.

Chmod +x file 将文件 file的属性改为可执行。只有具有可执行属性文件才可被执行。

Page 208: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

Tar zxvf [file] [--directory=dir] 将压缩文件 file 解压到 dir目录下(如果没有指定 dir则解压到当前目录下)

Tar zcvf [file1] [file2 or dir] 将 file2 或者 dir 压缩成 file1文件。

Make [-f file] 按照 file文件指定的编译规则编译源代码。如果没有指定 file

那么 make程序自动在当前目录下寻找名makefile 或者 Makefile的文件作为编译规则。

2 VIM 编辑器的使用

1 进入 vim

# vim file :用 VIM编辑器打开 file文件,如果 file文件不存在就在当前目录下创建一个 file文件。

2 使用 vim

进入VIM后,VIM 处于命令接收状态,所有的输入都会被认为是命令。此时键入 I或者 Insert键可以切换到文本插入状态,此时可以在光标处以插入的方式输入文本。在文本插入状态下按 insert键可以在文本插入状态和文本替换状态下切换,文本替换状态是指,键入的文本替换光标位置处的原文本。按下 ESC

键可以返回到命令状态。

3 退出 vim

在命令状态下键入:x 则 vim 会保存编辑的文本并退出(某些设置的 vim 不支

Page 209: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书

持)。在命令状态下键入:q! 则 vim 会放弃保存文本并退出。在命令状态下键入:w! 则 vim 会保存编辑的文本但不退出 vim。

3 minicom 的配置和使用

配置:当要改变串口属性的时候在 LINUX命令行中键入# minicom –s然后从菜单中选择 serial port setup,回车。以配置为 115200 8 N 1为例。执行以下操作:按 e键,然后依次按下 I、Q键,确认 current 显示为 115200

8N1,回车, 按下 A键,在 SERVER DEVICE下输入串口设备名(如果选择串口 1,输入/dev/ttyS0。如果选择串口 2,输入/dev/ttyS1)。然后两次回车。从菜单中选择 MODem AND DIALING,键入 A,删除 INIT STRING中的内容,按回车。键入 B,删除 RESET STRING中的内容,按回车。按下 F键,修改HARDWARE FLOW CONTROL 为NO。然后按回车返回上级菜单。从菜单中选择在菜单中选择 save setup as dfl 回车,然后从菜单中选择 EXIT FROM

MINICOM 退出 。 运行:运行配置好的MINICOM:在 LINUX命令行中键入 minicom。 退出:从运行中的MINICOM中退出:先按 ctrl-a 然后按下Q 退出。 发送文件:在 MINICOM中使用 ZMODem 协议发送文件:运行配置好的MINICOM,先按 ctrl-a 然后按下 s键。选择ZMODem 协议回车。然后用箭头和双击空格选择要发送的文件,然后按回车发送。

Page 210: 第一章read.pudn.com/downloads166/doc/fileformat/761898/linux... · Web viewJ24管脚 功能 相关说明 1 NC 悬空 2 TXD UART1信号发送线 3 RXD UART1信号接收线 4 NC

嵌入式 Linux&ARM9教学实验指导书