摘要:从事海思嵌入式设备调试,经常和 U‑Boot 环境变量、tftp 烧写、JFFS2 文件系统、tslib 触摸屏、sqlite 数据库、挂载外设打交道。整理日常反复复制粘贴的命令片段,方便后续项目复盘,也给做嵌入式 Linux 的朋友做参考。
一、U‑Boot 网络环境配置(TFTP 烧录必备)
开发板通过 TFTP 下载镜像,首要配置网卡、IP、网关,保证开发板和 PC 服务器网络互通。
shell
# 设置网卡MAC地址
setenv ethaddr 00:30:3d:35:8f:9d
# TFTP服务器IP(电脑端tftp服务地址)
setenv serverip 192.168.110.21
# 开发板本机IP
setenv ipaddr 192.168.110.253
# 网关
setenv gatewayip 192.168.110.1
二、JFFS2 根文件系统制作 & U‑Boot 烧写
JFFS2 多用于 NOR Flash,-e 指定 flash 擦除块大小。
shell
# 制作jffs2镜像,块大小0x20000
./mkfs.jffs2 -d ../rootbox -l -e 0x20000 -o smy3.img
# 擦除flash对应区间
erase 0x34300000 0x35ffffff
# tftp下载镜像到内存
tftp 0x34300000 smy3.img
也可以下载图片资源到 flash 存放:
shell
setenv vobuf 0x34020000
tftp 0x34020000 fenjin.jpg
Flash 分区烧写示例
shell
# 擦除+下载boot镜像
erase 0x80100000 +0x200000
tftp 0x80100000
# 擦除+下载rootfs镜像
erase 0x80300000 +0xD00000
tftp 0x80300000
bootargs 启动参数(海思平台多套备选)
mem 内存大小,console 串口,root 根文件系统,mtdparts flash 分区,是嵌入式最核心参数。
shell
# 方案1 jffs2根文件系统 physmap‑flash
setenv bootargs 'mem=54M console=ttyAMA0,115200 root=1f01 rootfstype=jffs2 mtdparts=physmap‑flash.0:3M(boot),13M(rootfs) busclk=220000000'
setenv bootcmd 'lload;bootm 0x80100000'
saveenv
# 方案2 initrd启动
setenv bootargs mem=64M console=tty0 115200 root=/dev/ram0 initrd=0x21100000,0x250000 ip=192.168.110.253:192.168.110.21:192.168.110.1:255.255.255.0:::eth0:off
# 方案3 海思hisilicon mtd分区 jffs2
setenv bootargs mem=32M console=ttyAMA0,57600 root=/dev/mtdblock/1 rootfstype=jffs2 mmz=sdram,1,0x620M,32M boardip=192.168.110.77 mtdparts=hisilicon:3M(boot),24M(system),1M(setting)
写完
saveenv保存环境变量,重启板子生效。
三、TFTP 文件上传下载(开发板 <‑>PC)
U‑Boot 阶段是 tftp;内核启动后 linux 用户态 tftp 命令:
shell
# 下载:从服务器拿main文件到本地
tftp -g -l main -r main 192.168.1.21
# 上传:把本地sqlite3传到tftp服务器
tftp -p -l sqlite3 -r sqlite3 192.168.110.21
四、挂载 SD 卡、U 盘 vfat 外设
嵌入式经常需要读 SD 卡、U 盘做升级、拷贝资源。
shell
# SD卡整块设备
mount -t vfat /dev/mmcblk0 /mnt
# SD卡第一个分区
mount -t vfat /dev/mmcblk0p1 /mnt
# U盘scsi设备挂载
mount -t vfat /dev/scsi/host0/bus0/target0/lun0/part1 /mnt/
注意:vfat 不支持 linux 权限,适合存放资源文件,不适合做根文件系统。
五、设备节点软链接
很多嵌入式板子硬件节点名称和上层应用预期不一致,需要建立符号链接。
shell
ln -s /dev/vc/0 /dev/tty0
ln -s /dev/fb/0 /dev/fb0
ln -s /dev/usb/tts/0 /dev/ttyS0
ln -s /dev/usb/tts/1 /dev/ttyS1
ln -s /dev/usb/tts/2 /dev/ttyS2
ln -s /dev/usb/tts/3 /dev/ttyS3
系统时间同步:硬件时钟同步到系统时间
shell
hwclock --hctosys
六、tar 压缩解压
shell
# 解压
tar zxvf XXX.tar.gz
# 打包压缩多个文件
tar zcvf XXX.tar.gz WWW YYY ZZZ
七、TSLIB 触摸屏环境变量(海思 hi_touchscreen)
MiniGUI/QT 嵌入式触摸屏必备环境变量,指定 tslib 库路径、设备节点、校准文件。
shell
export TERM=vt100;
export V_ROOT=/mnt/fjcts/tslib/
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/misc/hi_touchscreen
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$V_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$V_ROOT/share/ts/plugins
export QWS_MOUSE_PROTO=TPanel:/dev/misc/hi_touchscreen
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$V_ROOT/lib:/mnt/fjcts/lib
export TSLIB_TSEVENTTYPE="H3600"
踩坑点:tslib 环境变量不对,会出现触摸无响应、坐标偏移,需要确认
hi_touchscreen设备节点是否存在。
八、网络配置(内核启动后)
shell
# 设置网卡IP
ifconfig eth0 192.168.110.77 netmask 255.255.255.0 up
# 添加默认网关
route add default gw 192.168.110.1
# 回环网卡启用
ifconfig lo up
九、GCC 交叉编译示例(MiniGUI、jpeg、png 多库链接)
shell
gcc -o code code2.c -ljpeg -lpng -lminigui -lpthread
嵌入式交叉编译要使用对应平台交叉编译器,注意库路径与头文件。
十、SQLite3 常用 SQL 语句
嵌入式本地存储大量使用 sqlite,建表、改表、删表、查询示例:
sql
-- 查询表是否存在
select * from sqlite_master where tbl_name='TM_TOOLS';
-- 给已有表增加字段
ALTER TABLE 'TM_TOOLS' ADD [REMARK] [VARCHAR](500);
-- 创建温度数据表
create table WenDu(ID,stime,val1,val2,val3,val4);
-- 删除测试表
drop table test;
-- 创建带自增主键、默认本地时间的表
create table test (
[tkid] integer PRIMARY KEY autoincrement,
[tktype] int default 0,
[tableid] varchar (50),
[createdate] datetime default (datetime('now', 'localtime'))
);