linux下驱动开发环境,一、Linux 设备驱动介绍及开发环境搭建(续)

1.2.6 uboot 编译安装

嵌入式 bootloader 的功能:

功能类似于 PC 的 BIOS、硬件检测是否正常

加载操作系统镜像到 RAM

设置不同的启动方式

常见的启动方式:

NOR/NAND Flash 启动

从 SD 卡启动

Bootloader 从网络加载 Linux 内核启动

uboot 编译

下载地址:ftp://ftp.denx.de/pub/u-boot/

获取得版本为 u-boot-2017.01.tar.bz2,发布时间为 2017-1-15

主 Makefile 中修改 CROSS_COMPILE,config.mk 中修改 ARCH

配置 make vexpress_ca9x4_defconfig

编译 make -j8

测试 uboot 可用:qemu-system-arm -M vexpress-a9 -kernel u-boot -nographic -m 512M

启动成功后,需要对 uboot 配置网络功能,即 QEMU 网络功能设置

采用桥接(bridge)的网络连接与 Host 通信

需要主机内核 tun/tap 模块支持

配置:

主机安装工具包

sudo apt-get install uml-utilities

sudo apt-get install bridge-utils

创建 tun 设备文件:/dev/net/tun,工具安装成功后,会生成此设备节点

40a6967085544e34c94b5bc2040115d8.png

开启 tun 网络功能,使其声线:

修改 /etc/network/interfaces 文件,重启生效

d07544cac427d5975baf886008edf56e.png

配置 /etc/qemu-ifup、/etc/qemu-ifdown 脚本,这些可能自动生成了,那就不需要配置

e6fd2c871c1a7926b9db76832c56441c.png

重启,使 br0 生效:

2b8c3f8f8fd4749c52f4501754ea9bf6.png

虚拟网口 br0 是 QEMU 虚拟机与Linux主机通讯的网口

内核配置编译:

使用 u-boot 引导内核镜像

需要将内核编译为 uImage 格式

需要指定 uImage 的加载地址

编译时指定:make LOADADDR=0x60003000 uImage -j8

主机 TFTP 工具安装

工具安装:sudo apt-get install tftp-hpa tftpd-hpa xinetd

修改配置文件:/etc/default/tftpd-hpa

TFTP_DIRECTORY 是我们的工作目录,开发板从此目录下载镜像和配置文件,我们的镜像和配置文件也存放此目录中

6cd22ed3c92f65e1773dff58f3946c38.png

创建 tftpboot 目录,mkdir tftpboot, chmod 777 tftpboot

配置 /etc/xinetd.conf,如果没有此文件,则创建此文件:

a49183f83925865b95d9b965aa94ed5d.png

配置 /etc/xinetd.d/tftp 文件,如果没有此文件,则创建此文件

1c70544def9c2a37323eefe4b0f9d8db.png

重启 tftp:

sudo /etc/init.d/tftpd-hpa restart

sudo /etc/init.d/xinetd reload

sudo /etc/init.d/xinetd restart

测试 tftp

cd ..

tftp localhost

tftp> get test.c

获取文件成功,则OK

启动测试:

qemu-system-arm -M vexpress-a9 -kernel u-boot -nographic -m 512M -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 -sd rootfs.ext3

脚本在最后

1.3 挂载 NFS 文件系统

1.3.1 介绍

主机 HOST 支持 NFS 服务

安装:sudo apt-get install nfs-kernel-server

配置NFS

在 /etc/exports 文件中添加:

/home/rootfs *(rw,sync,no_root_squash,no_subtree_check)

/home/rootfs:是根文件系统的主目录

rw:可读可写

sync:磁盘和内存进行同步

no_root_squash:不执行开发板 root 用户映射为主机的匿名用户,保证权限重组

no_subtree_check:不检查根文件系统的子目录

开启 NFS 服务

/etc/init.d/rpcbind restart

/etc/init.d/nfs-kernel-server restart

修改 bootargs 启动参数

设置为 NFS 为根文件系统

设置主机 NFS 文件系统的地址

6ab33b215ae76c658e027be0a1f52fbc.png

nfsroot 是主机的 IP 地址

ip 是开发板的 IP 地址

内核支持挂载 NFS 文件系统

make menuconfig 配置

1936d1d0dec948e6bad86e78d56ffd5c.png

修改完后:make uImage -j8

由于暂时 uboot 没办法启动内核,则单独启动内核

e885ac3cf99a77701b909c0baf913bd3.png

VFS 已经 mount 成功

在根文件系统(/home/coco/work/rootfs)下创建一个文件:test.c,然后在 linux 控制台查看是否存在此文件

b8e6b20dd9d643470dd2d50899a121a3.png

bd78780b06f918e1e7de64e523def071.png

1.3.2 完善跟文件系统

启动流程:

Linux 内核启动之后,挂载 NFS或其他根文件系统

然后开启 init 进程(前面设置的 bootargs 中,init=/linuxrc),这个init 进程会执行 inittab 脚本

增加内核的各种用户接口,用户接口存在 /proc 和 /sys 下

/etc 内核配置和启动文件,需要在下面添加以下文件

inittab:脚本文件,运行命令

1 ::sysinit:/etc/init.d/rcS ///< 启动 rcS 脚本

2 #::respawn:-/bin/sh

3 #tty2::askfirst:-/bin/sh

4 #::ctrlaltdel:/bin/umount -a -r

5

6 console::askfirst:-/bin/sh ///< 启动控制台,控制台与 shell 绑定一起,"-" 表示启动 shell 之前,要启动 profile

7 ::ctrlaltdel:/sbin/reboot

8 ::shutdown:/bin/umount -a -r

fstab:文件init.d:目录

1 挂载的文件系统 挂载的目录

2 proc /proc proc defaults 0 0

3 tmpfs /tmp tmpfs defaults 0 0

4 sysfs /sys sysfs defaults 0 0

5 tmpfs /dev tmpfs defaults 0 0

6 var /dev tmpfs defaults 0 0

7 ramfs /dev ramfs defaults 0 0

8

9 注意:挂载的目录必须在根文件系统下存在,不存在则创建,这个文件的作用就是将文件系统挂载到目录的节点上

rcS:文件

1 #!bin/sh

2 # 设置环境变量

3 PATH=/sbin:/bin:/usr/sbin:/usr/bin

4 LD_LIBRARY_PATH=/lib

5 export PATH LD_LIBRARY_PATH

6

7 # 挂载各种文件系统,挂载的文件系统与 fstab 有关

8 mount -a

9 mkdir -p /dev/pts

10 mount -t devpts devpts /dev/pts

11 mdev -s

12 mkdir -p /var/lock

13

14 echo "--------------------------------------------------------------------------------"

15

16 echo "Welcome to my cortex-a9 board"

17

18 echo "--------------------------------------------------------------------------------"

profile:文件

1 PS1='cortex_a9@arm:\w # ' ///< 显示控制台的格式,就相当于终端中的 coco@ubuntu:~/work/rootfs/etc$

2 export PS1

3

4 注意:此文件也可以做其他操作

重启 reboot 功能,已经在 inittab 中操作

最终结果

b0eae054c4bc12a383fa4e656eb3ceec.png

1.4 在开发板上运行应用和内核驱动程序

1.4.1 运行应用程序

main.c

291ebe417608b56b3cf9233b82aebd84.png

执行交叉编译:arm-linux-gnueabi-gcc main.c

将生成 a.out 拷贝进开发板中(NFS 文件系统),并执行:

2a4afb60f51c70bc731ae36e60f84bf7.png

1.4.2 运行内核驱动程序

8dcc2d3ef8baef073bfb5a1518b7d2e1.png

Makefile:

1 .PHONY:all clean

2 ifneq ($(KERNELRELEASE),)

3

4 obj-m := hello.o

5

6 else

7

8 EXTRA_CFLAGS += -DDEBUG

9 KDIR := /home/coco/work/kernel/linux-4.4.194

10 all:

11 make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm -C $(KDIR) M=$(PWD) modules

12 clean:

13 rm -fr *.ko *.o *.mod.o *.mod.c *.symvers *.order .*.ko .tmp_versions

14

15 endif

拷贝 hello.ko 进NFS文件系统:cp /home/coco/work/code/test_driver/hello.ko ./work

加载模块:insmod hello.ko

e38699095af6396d086d6e756839f72f.png

查看模块:lsmod

dcd6a98530d024fbac2f1b6727d7eaa8.png

卸载模块:rmmod hello.ko

查看模块:lsmod

0a11b41e4e72911f0f125ea08ca51e90.png

标签:文件,文件系统,etc,init,NFS,内核,Linux,驱动,搭建

来源: https://www.cnblogs.com/kele-dad/p/11560407.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值