jz2440 开发板玩法
话说,开发板的资料目录乱得让人头皮发麻,最后发现 \开发板资料\百问网精智JZ2440开发板4.3寸LCD版使用手册.pdf
是关键
网页资料:http://wiki.100ask.net/分类:ARM裸机加强版
驱动安装
驱动文件目录路径别太长,否则windows会报错:系统找不到指定的文件
百问网的新版 Jz2440 v3.0,插上电源线
Windows:
- OpenJTAG
排线口
(被识别成 两个USB<=>JTAG&RS232
+一个USB Serial Port
)
micro USB Serial 串口
的Prolific USB-to-Serial Comm Port
会被系统自动更新安装micro USB Devices 设备开机模式
下的DNW驱动SEC S3C2410X Test B/D
找了很久,最后发现可以直接用开源工具 Zadig 全部一键安装。这里附上2.5版本zadig-2.5.zip
附上:
VMware的三种网络模式
驱动安装完成
排线是三个 OPENJTAG设备(USB Serial Port
+ 100ASK JTAG
+ 100ASK Serial Port
)
靠近网线口的是 micro USB Serial 串口 Prolific USB-to-Serial Comm Port
在usb串口旁边的是 Micro USB Devices SEC S3C2410X Test B/D
,这个设备偶尔会报错, 且会受VMware的影响,重开开发板/虚拟机就可以了(最好是插线开机后再开虚拟机)
可以调整COM端口号,双击设备,端口设置-高级,设置为COM1
编译 Bootloader 和操作系统
Bootloader选用 U-Boot,操作系统选用 Linux-arm
arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
交叉编译ARM版的U-Boot,及插桩打补丁
因为虚拟网卡出了问题,又刚好有个分区没用到,所以直接放uboot等源码文件并映射成虚拟磁盘给VMware用了。
注意:如果按任意键召唤不了uboot菜单,那么建议断开usb,先插电开机再串口调试,按开发板的RESET键重启
准备交叉编译环境
推荐做完以下步骤后,试试自己搭建交叉编译环境 https://crosstool-ng.github.io/docs/ 及其 GithubRepos
鉴于国内垃圾 GFW网络,在此提供官网下的无修改压缩包 crosstool-ng-1.24.0.zip
用资料提供的古老的ubuntu9.10.......,当然我在评论区放了Ubuntu18.04的使用方案
把这个arm-linux-gcc包解压到根目录,然后编辑环境变量
sudo tar -xjf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 -C /opt
sudo vi /etc/profile
在末尾添加如下
export PATH=$PATH:/opt/gcc-3.4.5-glibc-2.3.6/bin
按ESC
,输入:wq
保存退出
刷新环境变量配置
source /etc/profile
**注: ** 如果之前使用了其他版本的gcc,那么应该关闭终端窗口后重新打开,并source /etc/profile,否则make里的gcc变量依然是之前的版本
如果希望自定义交叉编译环境,可以用export 设置仅在当然终端窗口生效的临时全局变量,或者在原 make 命令后接上如 CROSS_COMPILE=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux- 用于指定编译器路径及其前缀
插桩编译 Uboot
tar xjf u-boot-1.1.6.tar.bz2
cd u-boot-1.1.6/
patch -p1 < ../u-boot-1.1.6_jz2440.patch
使用配置并一键编译
make 100ask24x0_config
make
或者指定交叉编译工具链前缀路径变量
make ARCH=arm CROSS_COMPILE=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux- 100ask24x0_config
make CROSS_COMPILE=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-
插桩编译 Linux2.6
tar xjf linux-2.6.22.6.tar.bz2
cd linux-2.6.22.6
patch -p1 < ../linux-2.6.22.6_jz2440.patch
make s3c2410_defconfig #如果不想用现成的config_ok,可以基于uboot提供的2410自己修改(方案1)
cp config_ok .config #直接使用100ask官方做好的配置(方案2)
make menuconfig #配置菜单(可选)
make uImage
烧写开发板
- 用 oflash 烧写工具将
U-boot.bin
写入开发板的 Nor Flash (通过 OpenJTAG 排线接口) - 通过
USB 串口
用终端命令和开发板交互(数字电路原理:信息本质都是通过电信号传输的,所以和网络ssh本质上也没有差别,和ssh一样操作命令就行) 记得设置波特率为115200并关闭流控(Flow Control),然后重开终端窗口 可以通过串口操作Uboot,利用Uboot提供的[k]Download linux kernel uImage
来将嵌入式操作系统如Linux2.6
写入开发板
接上两根usb,用 终端工具 Mobaxterm新建串口终端,
,将开发板开机,在uboot 倒计时间内按空格键
进入uboot菜单,选[k]Download linux kernel uImage
,然后打开 dnw_100ask.exe ,在标题显示USB:OK
时点 USB Port->Transmit选择编译好的uImage烧写即可。
附上官方说明:
在uboot进入接收文件模式后,应注意如下
附上:jz2440在u-boot中通过网络方式烧录镜像的几种方法
- [b]Boot the system.
然后选b启动系统,会打印出Linux启动日志,最后的Linux日志还有报错Panic,开发板的屏幕也是花屏的,但至少成功写入系统了,后面再修修补补应该就可以了。
根据报错日志,初步怀疑是写入的yaffs2文件系统有问题
再搞搞,把开发板资料里提供的二进制文件 fs_mini.yaffs2 通过DNW协议烧写进去
可以看到成功进入Linux命令行了,说明我自己做的文件系统还有问题,那么,就暂时用开发板资料提供的吧
参考:【内核配置】一、从标准linux-2.6.22.6系统到ARM平台JZ2440开发板的linux系统的修改攻略
VMware网络配置
设置两个网卡(一个NAT,一个桥接)
编辑-虚拟网络编辑器,为NAT分配IP段,为桥接设置自动选择物理网卡
NAT固定IP参考:https://www.cnblogs.com/telwanggs/p/10882369.html
完善Linux环境
现在只刷入了一个内核,其他什么都没有。启动不了终端,也敲不了 ls 之类的命令
- 根文件系统、 添加 busybox 工具链及 libc 编程运行支持库
- 内核只提供了内存文件系统等少量东西,如果没有实际的文件系统和运行库,那么就像Windows只有内核文件·C:\Windows\system32\NTOSKRNL.EXE·及其最相关的几个文件,而没有C盘其他文件一样,连cmd都打不开。
- BusyBox是一个适合嵌入式的 Linux 常用命令的精简集,提供了如 ls cp tar 等命令。
- libc 是支持C语言运行的标准支持库,没有这个,连 printf 函数都用不了。(常见的libc有 glibc uClibc等)
参考:构造嵌入式Linux最小根文件系统及其 Busybox、libc运行库
配置NF
- NFS 基于网络协议的文件系统(方便操作,不必每次都烧写文件系统)
服务端(虚拟机系统)操作:
安装NFS服务
sudo apt-get install nfs-kernel-server
编辑配置sudo vi /etc/exports
并添加如下
/work/nfs_root *(rw,sync,no_root_squash)
/home/xx/myCode *(rw,sync,no_root_squash)
重新生效配置
##或者重新读取配置(如果有已挂载了NFS的客户端,请使用这个)
## exportfs来自nfs-utils包
exportfs -arv
##或者重启NFS服务器以生效配置(如果有已挂载了NFS的客户端,就不能重启服务,而只能重新读取配置)
sudo service nfs-kernel-server restart
客户端(开发板)操作:
修改初始化脚本 (/etc/profile 或 /etc/init.d/rcS 之类的,修改其中一个即可)
增加开机静态ip地址,如加上
ifconfig 192.168.123.9 up
(以下 192.168.123.74 是虚拟机系统桥接网卡模式下的IP,路由器列表里可以找到,也可以用 ip a
命令查看)
- 树莓派挂载NFS目录
## mount -t nfs [虚拟机IP地址]:[需挂载目录] [要挂载到开发板哪个路径] -v
mount -t nfs 192.168.123.74:/home/xx/myCode/pi/driver/out /mnt -v
- JZ2440作为客户端挂载NFS目录(JZ2440 比较旧,所以加些参数向下兼容)
## mount -t nfs -o intr,nolock,rsize=1024,wsize=1024,vers=3 [虚拟机IP地址]:[需挂载目录] [要挂载到开发板哪个路径] -v
mount -t nfs -o intr,nolock,rsize=1024,wsize=1024,vers=3 192.168.123.74:/home/xx/myCode/devices/out /mnt -v
ps: -v
是日志参数,便于人工排错
也可修改/etc/fstab使其开机自动挂载
如果修改了fstab,那么可以使其马上生效,命令:
## v是信息; a(all)挂载/etc/fstab里的全部
sudo mount -va
编程
- 给U-boot添加命令
uboot1.1.6为例:在common目录下新建cmd_hi.c
并把 cmd_console.c 的内容复制进去再依样画葫芦地修改,记得去掉#ifdef CONFIG_CMD_CONSOLE
之类的宏定义。
修改 common 目录下的 Makefile文件,在 COBJS 的定义后面增加一行COBJS+= cmd_hi.o
然后编译烧写即可
测试:在u-boot启动时按任意键阻止uboot启动操作系统,然后按q退出菜单。在OPENJtag>
的命令框里输入hi
,即可看到程序执行的结果。
源码 common/cmd_yu.c
/*
* @Author: yu
* copy based on cmd_display.c
*/
#include <common.h>
#include <command.h>
#if (CONFIG_COMMANDS )// & CFG_CMD_YU)
// #undef DEBUG_DISP
// extern void _do_yu (void);
int do_yu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
if (argc == 0)
printf("Hello World, Yu!!!\n");
else
printf("Hello World, %s!\n", argv);
printf("More Message print: \n");
printf("=======================\n");
printf("Flag is %d\n", flag);
printf("Argc is %d\n", argc);
printf("Argv are %s\n", argv?argv:"");
return 0;
}
/***************************************************/
U_BOOT_CMD(
yu, 2, 1, do_yu,
"yu- a demo for print Hello World\n",
"[<string>]\n"
" - with <string> argument: print \"Hello World, <string>!\" \n"
" - without arguments: print \"Hello World, Yu!!!\" \n"
);
#endif
/* CFG_CMD_YU */
记得改一下 common目录下的 Makefile 文件
串口使用
串口占用问题
强制关闭被占用串口的方法,如关闭 COM3
任务管理器-性能-(左下角)资源监视器
或者设备管理器-右击COM3-属性-端口设置-高级
修改端口
然后确定,串口就会被强制关闭并被系统修改端口
配置开发板的串口文件传输工具 sz/rz
(sz/rz)是Z-Modem 串口文件传输协议的支持工具
sz 是 send zmodem file ,即发送文件(基于zmodem协议)
rz 是 recevice zmodem file ,即接收文件(基于zmodem协议)
这种协议比 rx 支持的 X-Modem 协议要快很多
把Z-Modem协议的支持工具发到开发板上
即下载并解压出 sz 和 rz 程序到电脑,然后通过 ARM开发板内置的 rx 命令把这两个发送到开发板
zmodem_tools3.4.8.zip
然后复制到/bin目录,并赋权限 777
cp ./rz /bin/
cp ./sz /bin/
chmod 777 /bin/rz
chmod 777 /bin/sz
以后通过串口传输文件只需要如下步骤即可:
MobaXterm 通过串口发送文件到 嵌入式 Linux 下位机
开发板输入命令
# rz
然后按住Shift键右击,通过 Zmodem 协议发送文件即可
MobaXterm 其他常用使用技巧
复制:只需要按住鼠标左键选中文字,即可自动复制。
粘贴:右击粘贴文字
传输文件:在侧边栏选 SCP 或 FTP,然后就可以看到了,支持拖拽。侧边栏上方的按钮也请多留意。
FTP 等服务器程序:
甚至还能扫端口...
VSCode Remote SSH 远程开发
VSCode+Remote SSH 插件
VMware + Ubuntu18+
MobaXterm 远程终端(支持串口和SSH等)
STC12C5A60s2 系列属于 8051 单片机
使用 Ubuntu18.04LTS x64 代替古老的ubuntu9
原因: Ubuntu9太老了,VSCode Remote SSH 不支持
换USTC软件源
安装ssh服务端(默认自启动)
sudo apt install openssh-server
关闭图形界面
sudo systemctl set-default multi-user.target # 关闭用户图形界面
sudo reboot
sudo systemctl start gdm3.service #临时开启图形界面
sudo systemctl stop gdm3.service #临时关闭图形界面,只在注销用户后才生效
32位支持库注意
64位的Linux执行32位软件是需要安装32位库的,否则如光盘附带的 arm-linux-gcc(即arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2里的gcc)会报错
-bash: /opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc: No such file or directory
安装32位库
sudo apt install lib32ncurses5 lib32z1 lib32stdc++6
解决vi方向键打出字母的问题
sudo apt remove vim-common
sudo apt install vim
复制交叉编译工具
把对方提供的虚拟机系统(如ubunu12)里的 交叉编译工具压缩成 tar.gz 后,放到你自己的虚拟机系统(如 Ubuntu18,记得安装32位库)
然后配置环境变量(参考上面多编译环境的配置)
注 which arm-linux-gcc 可以得到工具的安装路径
将arm-linux交叉编译环境加入临时系统变量
sudo nano /etc/profile #然后在文件末尾加入
export GCC_S3C=/opt/gcc-3.4.5-glibc-2.3.6/bin
export PATH=$PATH:$GCC_S3C # 如果需要多版本gcc就不要把这个加入环境变量配置文件里,而只在使用make的那个窗口执行一下,等于提供临时变量,非常适合多版本gcc的使用
配置虚拟网卡
设置2个虚拟机网卡,但要记得都配置DNS
地址
一个NAT模式,固定IP地址不随网段变化(固定IP且通外网,但被NAT隔离只能在本地和虚拟机内访问,局域网不可见)
一个桥接模式,IP地址随着宿主机网段变化(用于局域网连接,相当于新建一个网卡直接连接到当前局域网内)
也可使用 NAT 端口转发
将虚拟机里的端口转发到本地系统上。这样外部就可以访问该虚拟机端口了
使用VSCode Remote SSH 进行远程开发
VSCode安装Remote SSH插件,然后连接到虚拟机ubuntu进行远程开发,并为虚拟机ubuntu安装vscode远程C/C++插件,一切都舒服了!!!
SSH 免密登录(适用VSCode)
make CROSS_COMPILE=$GCC_S3C/arm-linux- 100ask24x0_config
make CROSS_COMPILE=$GCC_S3C/arm-linux- #如果你还嫌不够方便,可以安装 VSCode的 Code Runner 插件并把这个命令加入其插件的Custom Command配置里,按F1选Run Custom Command(或输入Ctrl+Alt+K)执行
或者根据 VS Code 安装与配置(使用MSYS2环境与mingw-w64 编译环境)(12089) 配置那你的 arm-linux-gcc 编译脚本
也可以把 SEC S3C2410X Test B/D
连接到虚拟机系统里变成一个VMware USB Device
。把linux版的 dnw
、oflash
、mkyaffsimage
、mkyaffs2image
等工具 放进ubuntu
然后直接在Windows操作串口,在ubuntu里编译出u-boot.bin
后用Linux版的dnw 文件名
写入即可。
使用ubuntu16.04配置linux内核和busybox出现错误的解决方法总结
修复变量爆红(头文件Include路径问题)
arm-linux-gcc -v -x c -E /dev/null
然后把#include <...> search starts here:下面的内容,都加入 VSCode 远程安装的 C/C++插件配置里的 includePath
/opt/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/include
/opt/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/../../../../arm-linux/sys-include
/opt/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/../../../../arm-linux/include
另外内核驱动开发,还需要 __KERNEL__
MODULE
以及 linux/autoconf.h 里的宏定义,用 KEY=val 表示。见:https://blog.csdn.net/Ningjianwen/article/details/88075042
VSCode常用快捷键
右击变量 更多功能
Ctrl+鼠标左击 查看函数/变量定义
ALT+左右方向键 前进后退
VSCode 开发 STM32 等单片机
另外,如果你还需要开发单片机程序,那么VSCode有个替代Keil的插件: EIDE
生成开发板系统对应的man手册
到 https://mirrors.edge.kernel.org/pub/linux/kernel/ 下载Linux源码(如 https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/linux-3.4.39.tar.gz ),安装编译手册所需要的工具man和xmlto,然后在下载的Linux源码目录
make mandocs
编译后输出目录为 内核源码/Documentation/DocBook/man
然后安装到 man 手册资料路径下(会安装到内核条目 /usr/local/man/man9/,并不会覆盖原来的 man 1~8)
sudo make installmandocs
然后测试一下
man 9 printk