基于三星 S3C2440 的嵌入式 Linux 攻略

由于 Linux 操作系统内核具备可裁剪定制的特性,因而能够运行于 ARM 架构的嵌入式设备当中。伴随近几年,硬件性能的飞速提升以及价格的快速下降,Raspberry PiNano PiRock PiOrange Pi等可运行完整桌面 Linux 操作系统的卡片电脑大量涌现,通用计算机与嵌入式系统之间的界限愈来愈模糊。各个 IC 厂家不断提升 MCU 性能的同时,也推出了相应的公版外围电路、通用操作系统、驱动程序支持等一揽子完善的嵌入式技术解决方案,与笔者七年以前接触嵌入式技术伊始,早已经不可同日而语。

笔者手上这款 Mini2440 开发板于 2013 年购置,是由广州友善电子科技有限公司于 2010 年推出的 ARM9 开发板,虽然板载的三星 S3C2440 嵌入式微处理器已然廉颇老矣,且对应的Linux 2.6.32.2内核版本也早已壮士暮年。但由于最近涉及 Linux 嵌入式操作系统相关的工作,因此重新上电使用,同时以怀旧心态执笔撰写本文,用于记录一些心得体会,同时也作为日后备忘。

板载资源

软件资源

  • 嵌入式 Linux 系统内核版本为Linux 2.6.32.2,可提供Yaffs2CramfsEXT2FAT32NFS文件系统支持。
  • 采用支持 MiniTools 与 SD 卡脱机烧写的Superboot作为 bootloader,代替三星原厂开源的Supervivi
  • 交叉编译工具为遵循EABI标准的arm-linux-gcc-4.4.3.tar.gz
  • 提供了Python脚本编程支持,可以直接对硬件进行访问。
  • 集成Qt/Embedded 4.8.5支持。

硬件资源

核心资源:

  • 微处理器采用Samsung S3C2440A,主频400MHz最高可达533Mhz
  • 内存采用板载64M容量32bit位宽数据总线的SDRAM,时钟频率可达100MHz
  • Flash 存储器分别采用了板载256MNand Flash, 以及用于安装 BIOS 的板载2M容量Nor Flash
  • 外接3.5英寸240x320分辨率的LCD电阻触摸显示屏。
  • 系统时钟源采用12MHz无源晶振。

外围IO接口:

  • 1 个采用DM9000网络芯片的100M以太网RJ-45接口。
  • 3 个TTL串行口,1 个USB Host和 1 个USB Slave B型接口。
  • 1 个SD 卡存储接口,1 个PWM控制的蜂鸣器。
  • 1 路立体声音频输出和 1 路麦克风输入接口。
  • 1 个10pinJTAG接口。
  • 4 个用户 LED 指示灯,以及 6 个带引出座的用户按键。
  • 1 个用于 A/D 模数转换测试的可调电阻。
  • 1 个用于 I²C 总线读写测试的串行EEPROM芯片AT24C08
  • 1 个20 pin针摄像头接口。
  • 采用5V供电的电源,并板载实时时钟电池。
  • 1 个34pinGPIO接口,以及 1 个40pin系统总线接口。
  • 采用专业复位芯片MAX811实现微处理器所需的低电平复位。

串口终端设置

通过串口连接到开发板进行调试,是嵌入式开发中较为基本的一项工作。由于现代计算机基本不再配置物理串口,因此需要通过专业芯片将 USB 转换为串口,目前市场上较为常见的 USB 转串口芯片有英国FTDI Chip 飞特蒂亚FT232、台湾Prolific 旺玖科技PL2303、江苏沁恒CH34X,这里推荐使用板载FT232芯片的 USB 转串口线,从而获得高速稳定的通信质量,以及兼容性更加良好的驱动程序支持。更为重要的是,避免出现最新版本 Windows 10 操作系统中由于驱动程序签名错误,导致的 USB 转串口线无法正常工作的问题。

当 USB 转串口驱动程序安装成功之后,将线缆从电脑 USB 接口连接至开发板串口,然后首先了解一下串口通信相关的参数配置:

  1. 波特率 Speed(bps) :115200
  2. 数据位 Data bits :8
  3. 停止位 Stop bits :1
  4. 奇偶校验 Parity:None
  5. 数据流控制 Flow Control:None

然后在电脑上启动串口调试工具,Winodws 操作系统上可以选择功能强大的MobaXterm,Linux 环境下则可以选择使用小巧的Minicom,下面我们分别对两者的安装和使用进行总结:

MobaXterm

点击主界面的【New session】,然后选择【Serial】串口模式,输入上面提到的串口通信配置数据:

点击确定保存配置,将S2 开关切换至【Nand Flash】启动模式,上电运行之后可以看到开发板 Bootloader 以及 Kernel 以及各种 Driver 加载的日志信息:

1
2
3
4
5
6
7
8
9
10
Superboot-2440 V1.5(20150414) by FriendlyARM

Booting from NAND
Load Kernel...
Uncompressing Linux...................................................................................................................................................... done, booting the kernel.
Linux version 2.6.32.2-FriendlyARM (root@tzs-ThinkPad-X201) (gcc version 4.4.3 (ctng-1.6.1) ) #16 Tue Dec 23 15:08:43 CST 2014
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: FriendlyARM Mini2440 development board
... ... ... ... ...

启动完成后便进入开发板的命令行界面,输入 Linux 命令查看开发板的一些基本信息:

Minicom

1
2
3
4
5
6
Superboot-2440 V1.5(20150414) by FriendlyARM

Booting from NOR
Try to find SD card...... not found.
Hello USB Loop
USB Mode: Connected

Superboot

早期 Mini2440 开发板出厂时预置的 Bootloader 是由友善之臂基于三星原厂Vivi改进而来的Supervivi,需要结合三星配套的 DNW 软件才能实现 USB 下载(官方版本运行在 Win10 上时驱动已经失效)。2014 年以后,友善之臂为 Mini2440 重新开发了一款称为Superboot的 Bootloader,并在同期推出MiniTools作为匹配的 USB 下载工具,该工具无需串口完全通过 USB 下载,并且内置相应的 USB 下载驱动,除了能够进行 Bootloader、Kernel、根文件系统的下载以外,还能够下载并安装裸机程序。由于Superboot必须与MiniTools配套使用,而笔者 Mini2440 开发板购置年限较早,因此需要手动通过 J-Link 仿真调试器将Superboot下载至开发板上的2M容量Nor Flash,下面来介绍 Bootloader 的具体烧写步骤:

首先在电脑上安装JLink_Windows_V644d.exe工具,然后将 Mini2440 开发板断电,并将JLink通过转接板和排线连接至开发板JTAG接口,另一头插入电脑USB接口。

Mini2440 开发板上电之后,在电脑上双击运行J-Link Commander注意弹出的 JLINK 固件更新提示信息,为了防止 JLINK 固件失效这里选择【否】,运行后软件控制台界面输出如下信息表示J-Link已经成功连接至电脑:

1
2
3
4
5
6
7
8
9
10
11
SEGGER J-Link Commander V6.44d (Compiled Mar 27 2019 17:09:10)
DLL version V6.44d, compiled Mar 27 2019 17:08:23

Connecting to J-Link via USB...O.K.
Firmware: J-Link ARM V8 compiled May 27 2009 17:31:22
Hardware version: V8.00
S/N: -1
License(s): RDI,FlashDL,FlashBP,JFlash,GDBFULL
VTref=0.000V

Type "connect" to establish a target connection, '?' for help

开发板将S2开关切换至【Nor Flash】,并打开电源开关让开发板上电,接下来打开J-Flash并加载s3c2440a_embedclub.jflash配置文件,然后点击【Start J-Flash】进入软件主界面:

选择主界面菜单上的【Options】里的【Project settings...】,进入到项目配置界面后选择【Flash】选项卡。

点击【Select flash device】按钮,然后选中当前 Mini2440 开发板用于装载BootloaderNor Flash芯片型号。笔者当前 Mini2440 开发板使用的型号是S29AL016J70TFI02,实物照片如下图:

所以这里直接选择S29AL016Jxxxxxxx2并点击【OK】以及【确定】保存。

接下来,选择J-Link Commander菜单项【Target】下的【connect】命令,使J-Link连接至 Mini2440 开发板。

再选择菜单项【File】下的【Open data file...】选中开发板光盘images目录内的Superboot2440.bin映像文件(注意这里仅支持.bin后缀名格式, 所以如果下载supervivi-64M就需要添加.bin作为后缀名)。此时会弹出下载起始地址对话框,直接输入0以后点击【确定】即可:

进行到这一步时,所有的前期配置工作都已经完成,点击J-Flash菜单【Target】里的【Production Programming】开始烧写Bootloader

下面界面展示编程过程正在进行当中,万众期待的魔法即将发生:

J-Flash界面弹出下图信息的时候,表示Bootloader已经成功的写入到 Mini2440 开发板的Nor Flash当中。

点击【确定】,J-Link断电然后关闭J-Flash,开发板重新上电后开始正常工作。

完成【Superboot】的烧写之后,就可以通过 Mini2440 开发板上的 SD 卡插槽来完成操作系统的安装,首先将 SD 卡格式化为FAT32格式,然后将开发盘光盘中的images目录完全拷贝至 SD 卡,并修改好里面FriendlyARM.ini配置文件为当前开发板适用的选项,将S2 开关切换至【Nor Flash】一侧,重新上电后蜂鸣器发出一声即开始安装操作系统,完成安装之后蜂鸣器将会发出滴滴两声,此时将S2 开关切换至【Nand Flash】重新上电即可启动操作系统。

MiniTools

将友善电子提供的Superboot下载到开发板 Nor Flash 中之后,接下来着手 USB 下载工具MiniTools的安装,由于该软件内置的 USB 驱动程序未获得 Windows 10 操作系统驱动签名,因此直接在 Windows 10 环境下安装会提示错误信息。此时,需要通过手动临时关闭 Windows 10 操作系统的驱动程序强制签名验证服务。

点击 Windows 10 右下角通知图标,选择【所有设置】-【更新和安全】-【恢复】-【立即重新启动】;此时操作系统会讯问重启选项,选择【疑难解答】-【高级选项】-【启动设置】-【重启】;此时重新启动并进入启动设置选项,选择【7) 禁用驱动程序强制签名】;进行到这里,重新进入 Windows 10 操作系统后就可以正常安装 MiniTools 了。另外一种更新简单的方法是以管理员身份运行CMD 命令提示符工具,然后执行bcdedit.exe /set nointegritychecks off命令就可以关闭强制签名验证,如果需要恢复验证执行bcdedit.exe /set nointegritychecks on即可。

接下来,在个人电脑上打开MiniTools软件,然后用数据线连接开发板的 USB Slave 和个人电脑上的标准 USB ,并将S2 开关拨至【Nor Flash】一侧,上电启动后就可以看到开发板成功与 MiniTools 建立连接:

Linux 版本MiniTools采用静态编译,基本能够兼容大部分发行版,解压后以root权限执行./start.sh命令即可正常运行。

通过 USB 下载操作系统

点击MiniTools界面上的【Linux】选项,并点击【Location images path】按钮,选择 Mini2440 开发板配套光盘下的images目录,MiniTools会自动加载该目录下FriendlyARM.ini文件中的配置信息并自动填写至软件界面,注意配置文件中的Linux-Kernel项目需要设置为包含有对应液晶屏型号驱动的 Linux 内核,笔者当前开发板液晶屏型号为X35,因此将配置文件修改为zImage_X35,就像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#This line cannot be removed. by FriendlyARM(www.arm9.net)

USBMode = No
Action = Install
OS = Linux
VerifyNandWrite = Yes

LowFormat = No
Status Type = Beeper| LED

# Linux part
Linux-BootLoader = Superboot2440.bin
Linux-Kernel = Linux/zImage_X35
Linux-CommandLine = noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
Linux-RootFs-InstallImage = Linux/rootfs_qtopia_qt4.img

# Windows CE 6 part
WindowsCE6-Bootloader = wince6/nboot_X35.bin
WindowsCE6-BootLogo = wince6/bootlogo.bmp
WindowsCE6-InstallImage = wince6/NK_X35.bin

#User Bin part
UserBin-Bootloader = Superboot2440.bin
UserBin-Image = 2440test/2440test_X35.bin
userBinStartAddress=30000000

点击【Start flashing】按钮即可开始通过 USB 下载相关的镜像文件。

使用MiniTools工具烧写操作系统时,需要确保 SD 卡里images/FriendlyARM.ini配置文件的USB-Mode = yes,或者使用前就先拨出 SD 卡。

使用 USB 下载裸机程序

友善电子提供了一系列无需运行在嵌入式操作系统之上的裸机测试程序,它们都保存在2440test_X35.bin这个文件下,需要通过MiniTools通过 USB 下载并运行在开发板上。

连接开发板的串口与 USB Salve 到计算机,并打开MobaXterm串口终端工具,将S2 开关切换至【Nor Flash】上电启动,打开MiniTools选择【User bin(No OS)】菜单,点击【Download and Run】按钮:

下载完成后,MobaXterm串口终端将呈现如下提示信息,此时通过键入指定序号即可执行相应的裸机程序,按下键盘【Esc】键即可退出执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Superboot-2440 V1.5(20150414) by FriendlyARM

Booting from NOR
Try to find SD card...... not found.
Hello USB Loop
USB Mode: Connected
Downloading User-Bin...
Downloading User-Bin succeed
Run UserBin▒

Superboot-2440 V1.5(20150414) by FriendlyARM

Booting from NOR

<***********************************************>
SBC2440 Test Program VER1.0
www.arm9.net
Build time is: Jul 01 2012 13:05:28
Image$$RO$$Base = 0x30000000
Image$$RO$$Limit = 0x30034c4c
Image$$RW$$Base = 0x30034c4c
Image$$RW$$Limit = 0x300e2a10
Image$$ZI$$Base = 0x3009623c
Image$$ZI$$Limit = 0x300e2a10
<***********************************************>

Please select function :
0 : Please input 1-16 to select test
1 : Test PWM
2 : RTC time display
3 : Test ADC
4 : Test interrupt and key scan
5 : Test Touchpanel
6 : Test TFT-LCD or VGA1024x768 module
7 : Test IIC EEPROM, if use QQ2440, please remove the LCD
8 : UDA1341 play music
9 : Test SD Card
10 : Test CMOS Camera
11 : Test 1-wire LCD backlight control

交叉编译环境建立

存储地址空间与片选