jz2440 开发板玩法



话说,开发板的资料目录乱得让人头皮发麻,最后发现 \开发板资料\百问网精智JZ2440开发板4.3寸LCD版使用手册.pdf 是关键

网页资料:http://wiki.100ask.net/分类:ARM裸机加强版

驱动安装

驱动文件目录路径别太长,否则windows会报错:系统找不到指定的文件

百问网的新版 Jz2440 v3.0,插上电源线
Windows:

  1. OpenJTAG 排线口 (被识别成 两个USB<=>JTAG&RS232+一个USB Serial Port
  2. micro USB Serial 串口Prolific USB-to-Serial Comm Port 会被系统自动更新安装
  3. 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

烧写开发板

  1. 用 oflash 烧写工具将U-boot.bin写入开发板的 Nor Flash (通过 OpenJTAG 排线接口)
  2. 通过 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中通过网络方式烧录镜像的几种方法

  1. [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 之类的命令

  1. 根文件系统、 添加 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

  1. 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

编程

  1. 给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 文件

  1. 自己写驱动
    embedded-linux_by_draapho

串口使用

串口占用问题

强制关闭被占用串口的方法,如关闭 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版的 dnwoflashmkyaffsimagemkyaffs2image 等工具 放进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
posted @ 2020-09-16 22:38  蓝天上的云℡  阅读(2771)  评论(10编辑  收藏  举报