在linux中进行arm交叉编译体验tiny6410裸机程序开发流程

在某鱼上找了一个友善之臂的Tiny6410开发板用来体验一下嵌入式开发。这次先体验一下裸机程序的开发流程,由于这个开发板比较老旧了,官方文档有很多过期的内容,所以记录一下整个过程。

1. 交叉编译器安装

按照光盘A中的文档《04- Tiny6410 Linux开发指南.pdf》的 1.3.5 节描述,用光盘中的 arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz 文件解压后运行命令 arm-linux-gcc -v 得到的结果是:

bash 复制代码
faund@faund-Virtual-Machine:/opt/FriendlyARM/toolschain/4.5.1/bin$ ./arm-linux-gcc
bash: ./arm-linux-gcc: No such file or directory
faund@faund-Virtual-Machine:/opt/FriendlyARM/toolschain/4.5.1/bin$ ./arm-none-linux-gnueabi-gcc
bash: ./arm-none-linux-gnueabi-gcc: No such file or directory
faund@faund-Virtual-Machine:/opt/FriendlyARM/toolschain/4.5.1/bin$ ./arm-none-linux-gnueabi-cpp
bash: ./arm-none-linux-gnueabi-cpp: No such file or directory
faund@faund-Virtual-Machine:/opt/FriendlyARM/toolschain/4.5.1/bin$ ./arm-none-linux-gnueabi-gcc
bash: ./arm-none-linux-gnueabi-gcc: No such file or directory
faund@faund-Virtual-Machine:/opt/FriendlyARM/toolschain/4.5.1/bin$ sudo ./arm-none-linux-gnueabi-gcc
[sudo] password for faund:           
sudo: unable to execute ./arm-none-linux-gnueabi-gcc: No such file or directory

原因应该是官方光盘使用的 Fedora 15 现在已经老旧,它使用的 Linux 内核 2.6.38 版本与我使用的 Linux mint 21.2 的 5.15.0 版本已经相差太远,其二进制可执行文件是不兼容的。

其实发行版中包含了 arm 的交叉编译器,使用下面的命令可以直接安装:

bash 复制代码
sudo apt install gcc-arm-linux-gnueabi

安装完成之后,用 arm-linux-gnueabi-gcc -v 命令可输出如下所列内容的话,说明交叉编译器已经安装完成了。

bash 复制代码
faund@faund-Virtual-Machine:~$ arm-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabi/11/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.3.0-1ubuntu1~22.04.1' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --with-system-zlib --enable-libphobos-checking=release --without-target-system-zlib --enable-multiarch --disable-sjlj-exceptions --with-specs='%{mfloat-abi=hard:-march=armv7-a -mcpu=generic-armv7-a -mfloat-abi=hard}' --with-arch=armv5t --with-float=soft --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include --with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04.1) 

2. 进行交叉编译

所谓交叉编译,就是在我们当前运行的 x86 架构电脑上的 Linux 中,为 arm 芯片编译二进制目标代码,这个目标代码包含了 arm 指令集的汇编代码。

按照官方DVD A的"/裸机程序/Linux平台下裸机程序开发指南"目录内《Linux平台下Tiny6410裸机程序开发指南.pdf》文件中第三节的说明对 1.led_s 例子进行交叉编译,由于使用了不同版本的交叉编译器,需要修改 Makefile ,使用新的交叉编译器中对应的命令。修改后的 Makefile 文件如下:

bash 复制代码
led.bin: start.o
        arm-linux-gnueabi-ld -Ttext 0x50000000 -o led.elf $^
        arm-linux-gnueabi-objcopy -O binary led.elf led.bin
        arm-linux-gnueabi-objdump -D led.elf > led_elf.dis
%.o : %.S
        arm-linux-gnueabi-gcc -o $@ $< -c

%.o : %.c
        arm-linux-gnueabi-gcc -o $@ $< -c 

clean:
        rm *.o *.elf *.bin *.dis  -rf

然后运行 make 命令,输出结果如下:

bash 复制代码
faund@faund-Virtual-Machine:~/embeddedDev/bareDev/code/1.leds_s$ make
arm-linux-gnueabi-gcc -o start.o start.S -c
arm-linux-gnueabi-ld -Ttext 0x50000000 -o led.elf start.o
arm-linux-gnueabi-objcopy -O binary led.elf led.bin
arm-linux-gnueabi-objdump -D led.elf > led_elf.dis

很顺利的,得到了我们需要的裸机程序 led.bin

3. 烧写裸机程序到开发板上

《Linux平台下Tiny6410裸机程序开发指南.pdf》文件中第三节中已经说明有 2 种方式将 bin 文件烧写到开发板上,这里采用它推荐的直接下载到 DRAM 的方式。需要 2 个步骤: 1) 准备一个带有 USB 下载功能 Superboot 的 SD 卡,2) 将 bin 文件下载到 DRAM 中并运行。

3.1 制作带有 USB 下载功能的 Superboot SD卡

根据 DVD A 上的文档 《03- Tiny6410刷机指南.pdf》中的说明先把 Superboot-6410.bin 文件用 SD-Flasher.exe 程序烧写到 SD 卡中,所有程序和文件都在光盘中,注意,有的光盘镜像中 Superboot-6410.bin 文件是有问题的

我在烧写完成之后遇到了问题,从 SD 卡启动时,只显示 "Booting from SD",等了10多分钟也没有后续输出,后来发现是光盘上的 Superboot-6410.bin 文件是有问题的,在友善之家的论坛中找到了一个文件,重新烧写后才能正常进入 Superboot。

如果遇到和我一样的问题,可以到下面这个链接去下载。

tiny6410从sd卡启动,总是Booting from SD| Linux技术交流区 - 友善之家 嵌入式开发板技术交流社区[size=2]如题,按照步骤来的,想从sd卡上按照bios, ..http://www.aiothome.net/read.php?tid-86547.html

做完上面步骤之后,参照《03- Tiny6410刷机指南.pdf》中 2.1.2 节说明,将光盘中的 images/FriendlyARM.ini 文件拷贝到 SD 卡中的 images 目录下,并且编辑 ini 文件,添加 USB-Mode = yes 项,我在接下来使用的文件内容如下:

#This line cannot be removed. by FriendlyARM(www.arm9.net)

USB-Mode = yes
LCD-Type = H43

CheckOneButton=No
Action=Null
OS= Linux

VerifyNandWrite=No

StatusType = Beeper| LED

#################### Linux #####################
Linux-BootLoader = Superboot-6410.bin
Linux-Kernel = Linux/zImage
Linux-CommandLine = root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200
Linux-RootFs-InstallImage = Linux/rootfs_qtopia_qt4.img
Linux-RootFs-RunImage = Linux/rootfs_qtopia_qt4.ext3

################### Android ####################
Android-BootLoader = Superboot-6410.bin
Android-Kernel = Android/azImage
Android-CommandLine = root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200 androidboot.console=s3c2410_serial0
Android-RootFs-InstallImage = Android/rootfs_android.img
Android-RootFs-RunImage = Android/rootfs_android.ext3

################### WindowsCE6 #################
WindowsCE6-Bootloader= Superboot-6410.bin
WindowsCE6-BootLogo = WindowsCE6\bootlogo.bmp
WindowsCE6-InstallImage = WindowsCE6\NK-i.bin
WindowsCE6-RunImage = WindowsCE6\NK-i.bin

#################### Ubuntu #####################
Ubuntu-BootLoader = Superboot-6410.bin
Ubuntu-Kernel = Ubuntu/uzImage
Ubuntu-CommandLine = root=ubi0:FriendlyARM-root ubi.mtd=2 rootfstype=ubifs  init=/linuxrc console=ttySAC0,115200
Ubuntu-RootFs-InstallImage = Ubuntu/rootfs_ubuntu-slc.ubi
Ubuntu-RootFs-RunImage = Ubuntu/rootfs_ubuntu.ext3

############### UserBin #################
UserBin-Image=WindowsCE/NK-i.nb0
userBin-StartAddress=50100000

弄好的 SD 卡插到开发板上,启动模式开关拨到 SD-BOOT 位置。开发板和电脑的串口线、USB线都连接好然后开机,Superboot 正常启动的情况下 LED1 会闪烁,如果开发板有屏幕,会有如下显示:

串口控制台输出的内容如下:

3.2 把 led.bin 写入开发板的 DRAM 并运行

由于"年久失修",官方 DVD 文档中提到的使用友善之臂提供的 MiniTools 应用进行烧写的办法似乎已经没办法用了。在windows下即使安装了 MiniTools 的驱动,也会一直是"Board is not connected"状态无法使用;Linux下因为需要 QT4 的支持,而目前的发行版普遍支持 QT5 以上版本了,我就没有照这个继续折腾了。还是回到官方的 DNW 软件来做本次体验,所以后面的做法并没有按照官方 DVD 的文档进行。

在开发板正常引导了 superboot 之后,因为已经用 USB 连接了电脑,所以电脑上出现了一个新的设备,但是在 windows 10 下,这个设备的驱动程序并没有自动安装好:

原因是老旧的驱动没有签名,参考下面链接:

关于win10装不上dnw驱动的问题_新版dnw驱动解决win不兼容_陆少ye的博客-CSDN博客

【dnw驱动数字签名】解决Win10安装USB驱动时,"INF不包含数字签名信息"_aoxiang_ywj的博客-CSDN博客

先要按照下面步骤关闭 windows 10 的强制验证驱动签名

  1. "开始"菜单 ->"设置"->"更新和安全"->"恢复"里的"立即重启";

  2. 电脑这时候会重启,进入一个设置界面,等待出现新界面;

  3. 新界面中选取"疑难解答"->"高级选项"->"启动设置"里点击"重启";

  4. 机器重启后就有一些选项了,第七个就是禁止验证驱动签名,按下数字键"7"就可以了,关闭驱动签名完成;

电脑启动后,到下面的地址下载 DNW 驱动程序:

win7-64位-DNW-USB驱动-FriendlyArm tiny6410 已签名| Linux技术交流区 - 友善之家 嵌入式开发板技术交流社区[b][color=#ff0000][size=5][i] 折腾了几天,终于把 ..http://www.aiothome.net/read.php?tid-80424.html更新之前带有感叹号的 SEC S3C6400X Test B/D 设备驱动:

选取浏览我的电脑以查找驱动程序:

找到刚才下载的 DNW 驱动程序,inf 文件在 secbulk64.zip 包内的 secbulk64\inf64 目录中

选好了 secbulk.inf 文件之后,会出现下面显示,其中显示了 S3C2440 字样,不用管它,应该是通用的驱动,或者是社区驱动作者的笔误,直接点击下一步;

在下面的安全警告窗口中点击"始终安装以驱动程序软件",因为已经关闭了强制验证驱动签名,才有这个机会来安装没有签名的驱动程序,不然会直接告知驱动程序安装失败;

安装结束之后,驱动程序就出现在下图这个位置:

到下面这个链接下载 DNW 软件:

DNW软件改进,添加了快捷按键,增强了界面显示等| 相关资料下载及使用技巧 - 友善之家 嵌入式开发板技术交流社区DNW软件改进,添加了快捷按键,增强了界面显示等http://www.aiothome.net/read.php?tid-3531.html运行这个 DNW 软件,注意到已经有显示"USB:OK",说明已经与开发板 Superboot 正常连接了;

在开发板的串口控制台中按 d 键,即命令开发板 "Download and Run an Absolute User Application",下载并运行裸程序。

此时串口控制台显示正在等待 DNW 传输数据,在 DNW 软件上按 F7,然后选择之前交叉编译好的 led.bin 文件之后,DNW会显示数据传输用时,串口控制台会显示 "Download Done." 等信息。

串口控制台显示"Run Absolute User Application...",现在开发板已经在运行我们的裸机程序了,可以观察到开发板上 LED1 到 LED4 这 4 个 LED 灯一起在闪烁了,效果可以看下面的视频:

友善之臂运行裸程序示例 led.bin

4. 结论

友善之臂的 Tiny6410 开发板虽然已经老旧了,官方很多支持也已经"年久失修",但是在目前还是可以正常进行嵌入式的开发体验的,走通了裸机程序的各个环节之后,可以先进行裸机程序的深入研究,然后再慢慢可以去体验各种操作系统的嵌入式编程。

相关推荐
Hacker_xingchen1 分钟前
天融信Linux系统安全问题
linux·运维·系统安全
张暮笛12 分钟前
抓取手机HCI日志
linux
大猫和小黄14 分钟前
Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit
linux·服务器·windows·git
Joyner201818 分钟前
【Linux】ubuntu通过远程命令行启动桌面应用
linux·服务器·ubuntu
ghostwritten21 分钟前
Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon
linux·运维·服务器
我是唐青枫23 分钟前
Linux xargs 命令使用教程
linux·运维·服务器
未知陨落1 小时前
Linux常用命令
linux·运维·服务器
chian-ocean1 小时前
Linux内核调度优先级详解:如何优化你的系统性能
linux·运维·服务器
望获linux2 小时前
赋能新一代工业机器人-望获实时linux在工业机器人领域应用案例
linux·运维·服务器·机器人·操作系统·嵌入式操作系统·工业控制
御风_212 小时前
Linux——字符设备驱动控制LED
linux·ubuntu·linux驱动