S3C2440驱动开发(一)

本文详细介绍了S3C2440驱动开发,包括S3C2440A处理器特点、Mini2440开发板简介,以及2440test程序的使用。通过裸机编译环境搭建,使用ADS1.2进行编译,并通过MiniTools烧录到开发板运行,展示了从裸机程序到Linux驱动开发的学习路径。

1.驱动开发概述

本文主要针对友善之臂mini2440开发板而编写的学习资料。虽然市面上介绍Linux系统驱动原理和内核源码的书很多,但是直接上手比较困难,特买了一个Arm9开发板,希望从裸机程序开始学习,逐步掌握Linux系统驱动开发方法。编写本文的目的为记录学习过程,用于后期回顾。文章主要分为两部分。第一部分,从友善之臂提供的裸机程序开始介绍各各外设驱动开发过程。第二部分,linux驱动开发流程及实践。

1.1 S3C2440A介绍

三星S3C2440是为手持式设备而开发的16/32位精简指令集微处理器。以很小的尺寸提供了低功耗、高性能的解决方案。处理器提供了如下组件:

S3C2440使用ARM920T核心,使用0.13um CMOS标准单元和内存编译器开发。低功率,简单,精巧且全静态的设计特别适合对成本和功率敏感的应用。它采用一种称为高级微控制器总线体系结构(AMBA)的新总线体系结构。

S3C2440A的CPU内核,是由Advanced RISC Machines 公司的Stanley设计的16/32位ARM920T RISC处理器。具有出色的功能, ARM920T通过以下方式实现MMU,AMBA BUS和哈佛缓存体系结构:单独的16KB指令和16KB数据高速缓存,每个高速缓存具有8个字长。

通过提供一套完整的通用系统外围设备,S3C2440A最大限度地降低了总体系统成本,并且无需配置其他组件。集成芯片上的功能包括:

•内部约1.2V,1.8V / 2.5V / 3.3V内存,3.3V外部I / O微处理器,具有16KB I-Cache / 16KB D-缓存/ MMU

•外部存储器控制器(SDRAM控制和芯片选择逻辑)

•带有LCD专用DMA的LCD控制器(最多4K色STN和256K色TFT)

•带外部请求引脚的4通道DMA控制器

•3通道UART(IrDA1.0、64字节Tx FIFO和64字节Rx FIFO)

•2通道SPls

•IIC总线接口(多主机支持)

•IIS音频编解码器接口

•AC’97 CODEC接口

•兼容SD主机接口版本1.0和MMC协议版本2.11

•2通道USB主机控制器/ 1通道USB设备控制器(1.1版)

•4通道PWM计时器/ 1通道内部计时器/看门狗计时器

•8通道10位ADC和触摸屏接口

•具有日历功能的RTC

•摄像头接口(最大支持4096 x 4096像素输入支持。最大2048 x 2048像素输入支持缩放)

•130个通用I / O端口和 24通道外部中断源

•电源控制:正常,低速,空闲和睡眠模式

•带PLL的片上时钟发生器

 

1.2 mini2440介绍

Mini2440 是一款低价实用的 ARM9 开发板,是目前国内性价比较高的一款学习板;它采用 Samsung S3C2440 为微处理器,并采用专业稳定的 CPU 内核电源芯片和复位芯片来保证系统运行时的稳定性。mini2440 的 PCB 采用沉金工艺的四层板设计,专业等长布线,保证关键信号线的信号完整性,生产采用机器贴片,批量生产;出厂时都经过严格的质量控制。开发板提供了 Linux 和 WindowsCE6 系统,它们各自的 bootloader 以及 BSP 均是 100%开放的,可以在网站自由下载,网址:http://www.arm9.net

 

Mini2440 的众多先进特性,可以概括为:

 

(1)第一款被 Linux 社区广泛支持的国产 2440 开发板(自从 Linux-2.6.31 开始,Mini2440被正式加入 Linux 官方内核)

(2)第一款在 Linux 下支持万能 USB 摄像头的 2440 开发板

(3)第一款统一采用支持 EABI 标准交叉编译器的开发板(同类产品仍在使用拼凑的各个版本的编译器,导致开发效率低下,并且不利于初学者入门掌握)

(4)第一款提供齐全 BSP(基于 Linux-2.6.29(当前为 Linux-2.6.32.2)和 WindowsCE  6.0)的开发板,并全面配有图形界面实用应用程序

(5)第一款支持.NET  3.5 和腾讯 QQ 的 2440 开发板(2009 年 10 月,WindowsCE  6.0 补

丁 Release 3 发布)

(6)第一款可以让用户无需编程,即可自由简单定制 WindowsCE 开机画面的开发板,并且可在 10 秒内极速启动系统

(7)第一款完美支持 USB 烧写更新 Linux(support  yaffs2)和 WindowsCE  5.0/6.0 的开发板,并且支持整片 Nand Flash 备份到 PC,真正适合批量生产

(8)第一款实现 WinCE/Linux 图形界面均可使用 CMOS 摄像头预览并拍照的开发板(同类产品尚无此功能)

(9)第一款公开所有 BSP 源代码(含 Linux 和 WindowsCE)的开发板(齐全的 BSP 让初学者可以了解更多的底层,让真正做开发的人只需关注上层应用)

(10)第一款内核(含 WinCE 和 Linux)同时支持大页和小页 Nand  Flash 的开发板,这样新老用户均可享用最新的软件,并且使用方式相同

(11)第一款在 WindowsCE 和 Linux 下通过简单直观的图形界面,就可设置各种程序开机自动运行的开发板(同类产品尚无此功能)

(12)Mini2440 目前是国内零售销量最多的 2440 开发板,靠口碑相传及朋友间互相介绍,Mini2440 已经被众多用户称赞和认同

1.3 2440test程序介绍

这是由三星原厂的 2440test 改进而来的一个裸机测试程序,使用 ADS 编译。测试项目包括:中断方式按键测试,RTC 实时时钟测试,ADC 数模转换测试,IIS 音频播放 wav 测试,IIS 音频录音测试,触摸屏测试,I2C 总线读写 AT24C08 测试,三星3.5’LCD、640x480 真彩液晶测试,LCD2VGA 输出测试等。

 

2.裸机编译环境搭建

2.1 ADS1.2安装

下载地址:链接:https://pan.baidu.com/s/1EpzzC90G87pvd-3pK5Pe4w

提取码:bzg4

解压后双击安装文件进行安装。

因软件比较老,安装路径尽量使用英文字符,且不可位于Program Files (x86)目录下,否则会出现编译出错情况。

2.2 编译2440test代码

(1)双击2440test.mcp文件,打开ADS1.2 IDE

(2)配置生成目标。点 Edit 菜单,选择“DebugRel_bin Setting…”

在左侧树形菜单中选择“Target Settings”,进行如下设置:

Linker:选择默认的ARM Linker

Pre_Linker:选择None

Post-Linker:选择在链接完成后,还要对输出文件进行操作。因为在本例中,希望生成一个可以烧写到 Flash 中去的二进制代码,所以在此选择 ARM fromELF,表示在链接生成映象文件后,再调用 fromELF 命令将含有调试信息的 ELF 格式的映象文件转换为其他格式的文件。

(3)在左侧树形菜单中选择“Arm Assembler”。因为在本例中包含汇编代码,所有要用到汇编器,点接选择 ARM Assembler,在右侧出现相应的设置选项,在 ADS 集成开发环境中用的汇编器是 armasm,默认的 ARM 体系结构是 ARM7TDMI,在此要改为 ARM920T,字节顺序默认是小端模式,其他设置,采用默认值即可,如图所示:

本例中还包含了 C 语言代码,因此还需要设置 ARM C Compiler 选项,点接选择 ARM C  Compiler,在右侧出现相应的设置选项,在 ADS 集成开发环境中用的汇编器是 armcc,默认的 ARM 体系结构是 ARM7TDMI,在此要改为 ARM920T,字节顺序默认是小端模式,其他设置,采用默认值即可,如图所示:

(4)点接选择 ARM Linker,在右侧出现相应的设置选项,我们在此详细介绍这些设置框,因为这些选项对最终生成的文件有着直接的影响。

在标签 Output 中,Linktype 中提供了三种链接方式。Partial 方式表示链接器只进行部分链接,经过部分链接生成的目标文件,可以作为以后进一步链接时的输入文件。Simple 方式是默认的链接方式,也是最为频繁使用的链接方式,它链接生成简单的 ELF 格式的目标文件,使用的是链接器中指定的地址映象方式。Scattered 方式使得链接器要根据 scatter 格式文件指定的地址映象,生成复杂的 ELF 格式的映象文件,这个选项一般很少用到。

在本例中,我们选择使用 Simple 方式,这里有一些设置:  

RO Base:这个文本框设置包含 RO 段的加载域和运行域为同一个地址,默认是 0x8000。

这里用户要根据自己的硬件实际 SDRAM 地址空间来修改这个地址,保证这里填写的地址,是程序运行时,SDRAM 地址空间所能到达的范围,针对本目标板,SDRAM 的空间范围是0x3000000-0x34000000,因此这里设置为 0x30000000。

RW Base:这个文本框设置了包含 RW 和 ZI 输出段的运行域地址。如果选中 split 选项,链接器生成的映象文件将包含两个加载域和两个运行域,此时在 RW Base 中所输入的地址为包含 RW 和 ZI 输出段的域设置了加载域和运行域地址。

Ropi:选中这个设置将告诉链接器使包含有 RO 输出段的运行域位置无关。使用这个选项,链接器将保证下面的操作:检查各段时间的重寻址是否有效;确保任何由 armlink 自身生成的代码是只读位置无关的。

Rwpi:选中该选项将会告诉链接器使包含 RW 和 ZI 输出段的运行域无关。如果这个选项没有被选中,域就标识为绝对。每一个可写的输入段必须是和读写位置无关的。如果这个选项被选中,链接器将进行下面的操作:

检查可读/写属性的运行域的输入段是否设置了位置无关属性;

检查在各段之间的重地址是否有效;

在 Region Table 和 ZISection Table 中添加基于静态存储器 sb 的选项。

该选项要求 RW Base 有值,如果没有给他指定数值的话,默认为 0。

Split Image:选择这个选项把包含 RO 和 RW 的输出段的加载域分成 2 各加载域,一个是包含 RO 输出段的域,一个是包含 RW 输出段的域。

这个选项要求 RW Base 有值,如果没有给 RW Base 选项的值,则默认是 0。

Relocatable:选择这个选项保留了映像文件的重寻址偏移量。这些偏移量为程序加载器提供了有用信息。在 Options 选项中,需要读者引起主义的是  Image  entry  point  文本框。它指定映像文件的初始入口点地址值,当映像文件被加载程序加载时,加载程序会跳转到该地址处执行。如果需要,用户可以在这个文本框中输入下面格式的入口点:

入口点地址:这是一个数值,例如  -entry 0x0

符号:该选项指定映像文件的入口点为该符号所代表的地址处,比如:-entry int_handler  ,如果该符号有多处定义存在,armlink 将产生出错信息。

offset+object(section):该选项指定在某个目标文件的段的内部的某个偏移量处为映像

文件的入口地址,例如:-entry8+startup(startuoseg)在此处指定的入口点用于设置 ELF 映像文件的入口地址。需要引起注意的是,这里不可以用符号 main 作为入口点地址符号,否则将会出现类似“Image dose not have an entry point(Not specified or not set due to multiple choice)”的错误信息。在 Layout 选项中,需要设置 asm.o 目标文件中的 Init 为整个文件的入口点。关于ARM Linker 的设置还很多,对于想进一步深入了解的读者,可以查看帮助文件,都有很详细的介绍。

在 Linker 下还有一个 ARM fromELF:

fromELF 是一个实用工具,它实现将链接器,编译器和汇编器的输出代码进行格式转

换的功能。例如,将 ELF 格式的可执行映像文件转换成可以烧写到 ROM 的二进制格式文件;对输出文件进行反汇编,从而提取出有关目标文件的大小,符号和字符串表以及重寻址等信息。只有在 Target 设置中选择了 Post-linker,才金可以使用该选项。

在 Output  format 下拉框中,为用户提供了多种可以转换的目标格式,本例选择 Plain binary,这是一个二进制格式的可执行文件,可以被烧写到目标板的 Flash 中。

在 Output file name 文本域输入期望生成的输出文件存放的路径,或通过点击 Choose...按钮从文件对话框中选择输出文件。如果在这个文本域不输入路径名,则生成的二进制文件存放在工程所在的目录下。进行好这些相关的设置后,以后在对工程进行 make 的时候,CodeWarrior IDE 就会在链接完成后调用 fromELF 来处理生成的映像文件。

对于本例的工程而言,到此,就完成了 make 之前的设置工作了。

点击 CodeWarrior IDE 的菜单 Project 下的 make 菜单,就可以对工程进行编译和链接了。编译链接结果如图:

2.3烧录到开发板内存运行

使用 USB下载运行2440test 程序不需要并口和JTAG板,借助 MiniTools 的“Download & Run”功能就可以了,下面是详细的操作步骤:

1)  将开发板的 S2 开关设置为 Nor Flash 方式,然后开启电源

2)  在电脑上运行 MiniTools 工具,用 USB 线连接开发板与电脑,MiniTools 应该会提示已连接开发板

3)  接下来在 MiniTools 的界面上,在左侧的菜单中选择裸机程序(No  OS),然后在右侧的主面板中,点“…”选择要下载运行的 2440test 程序,点“下载运行”即可,如下图所示:

2.4烧录到开发板Nand Flash运行

烧写 2440test 到 Nand Flash 的步骤如下:

1)  将开发板的 S2 开关设置为 Nor Flash 方式,然后开启电源;

2)  在电脑上运行 MiniTools 工具,用 USB 线连接开发板与电脑,MiniTools 应该会提示已连接开发板;

3)  接下来在 MiniTools 的界面上,在左侧的菜单中选择裸机程序(No  OS),然后在右侧的主面板中,选择“Install to NAND Flash”,点“…”选择要烧写的 2440test程序,如果NandFlash 中没有 Superboot,还需要选择 Superboot,一切就绪后,点“开始烧写”即可,界面的设置如下图所示:

烧写完成后,将开发板的 S2 开关切换到 Nand Flash 启动,重新开机即可,也可以直接点 MiniTools上的“快速启动”按钮临时启动程序。

2.5运行结果

串口信息如下图

开发板实际显示效果如下图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值