嵌入式Linux驱动开发笔记
模拟vexpress-a9
使用QEMU模拟vexpress-a9开发板,网络上教程比较多,可以快速搭建好开发环境。
基本环境
| 项目 | 信息 |
|---|---|
| 操作系统 | Ubuntu 22.04 |
| 内核 | linux-4.14.334 |
| 根文件系统 | busybox-1.36.1 |
| 引导程序 | u-boot-2022.10-rc5 |
安装依赖
1 | sudo apt-get install -y make gcc bc libncurses5-dev bison flex libssl-dev u-boot-tools gcc-arm-linux-gnueabi g++-arm-linux-gnueabi qemu-system-arm |
Linux内核
1 | # 使用vexpress默认配置编译 |
提示没有根文件系统,接下来制作它。
根文件系统
配置编译
1 | cd busybox-1.36.1 |
补充根文件系统
1 | # 拷贝基本文件系统 |
接下来需要制作根文件系统,有两种方式
方式一:模拟SD卡方式启动
这种方式非常简单,但不适合需要经常修改文件系统中的文件的场景1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 创建SD卡根文件系统镜像
sudo mkdir /mnt/rootfs
sudo chmod 777 /mnt/rootfs
dd if=/dev/zero of=rootfs-arm32.ext3 bs=1M count=64
mkfs.ext3 rootfs-arm32.ext3
sudo mount -t ext3 rootfs-arm32.ext3 /mnt/rootfs -o loop
sudo cp -rf rootfs-arm32/* /mnt/rootfs/
sudo umount /mnt/rootfs/
# 启动模拟器
qemu-system-arm -M vexpress-a9 \
-m 512M \
-kernel linux-4.14.334/arch/arm/boot/zImage \
-dtb linux-4.14.334/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
-sd rootfs-arm32.ext3
方式二:通过NFS挂载根文件系统
首先,宿主机需要安装配置nfs1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 安装依赖
sudo apt-get install -y nfs-kernel-server
# 配置nfs
sudo mkdir -p /sync/rootfs
sudo chmod 777 -R /home/johnny/project/ldd4/rootfs-arm32
sudo cat >>/etc/exports <<EOF
/home/johnny/project/ldd4/rootfs-arm32 *(rw,sync,no_root_squash,no_subtree_check)
EOF
# 为解决Linux内核与NFS服务器的兼容问题
# 设置Ubuntu20.04的NFS,使之兼容NFS-V2和NFS-V3并增加调试功能。
sudo sed -i 's/\(^RPCSVCGSSDOPTS="\).*/\1--nfs-version 2,3,4 --debug --syslog"/g' /etc/default/nfs-kernel-server
# 重启nfs服务
sudo systemctl restart rpcbind
sudo systemctl restart nfs-kernel-server
配置主机网络1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 安装依赖
sudo apt-get install -y uml-utilities bridge-utils
# 配置网桥
cat > /etc/network/interfaces <<EOF
auto lo
iface lo inet loopback
auto eth0
auto br0
iface br0 inet dhcp
bridge_ports eth0
EOF
# 创建tap0网卡,用于连接qemu虚拟开发板
sudo tunctl -u root -t tap0
sudo ifconfig tap0 172.16.16.10 promisc up
启动模拟器1
2
3
4
5
6
7
8
9sudo qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel linux-4.14.334/arch/arm/boot/zImage \
-dtb linux-4.14.334/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-net tap,ifname=tap0,script=no,downscript=no,id=net0 \
-net nic,macaddr=00:16:3e:00:00:01 \
-nographic \
-append "root=/dev/nfs rw nfsroot=172.16.16.10:/home/johnny/project/ldd4/rootfs-arm32,proto=tcp,nfsvers=3,nolock init=/linuxrc console=ttyAMA0 ip=172.16.16.20"
100ask-qemu
目前只支持ubuntu 16.04和18.04,需要拥有桌面环境。
已经支持模拟网卡、LCD显示、LED灯、按键、AT24CXX I2C存储芯片的功能
具体参考百问网嵌入式Linux
Linux驱动开发
与通用主机的差异是使用的内核与交叉编译工具不一样,详见Makefile文件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
26ifeq ($(KERNELRELEASE),)
ifeq ($(ARCH),arm)
KERNELDIR ?= /home/johnny/project/ldd4/linux-4.14.334
OBJECTDIR ?= /home/johnny/project/ldd4/objects/vexpress-v2p-ca9
ROOTFS ?= /home/johnny/project/ldd4/rootfs-arm32
CROSS_COMPILE ?= arm-linux-gnueabi-
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) CROSS_COMPILE=$(CROSS_COMPILE) O=$(OBJECTDIR) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) CROSS_COMPILE=$(CROSS_COMPILE) O=$(OBJECTDIR) modules INSTALL_MOD_PATH=$(ROOTFS) modules_install
clean:
rm -rf *.o *.ko .*.cmd *.mod* modules.order Module.symvers .tmp_versions
else
obj-m += globalfifo.o
endif