Linux驱动开发_搭建嵌入式开发环境
这篇介绍Linux驱动开发相关环境搭建、驱动框架介绍、驱动调用流程,虚拟机环境配置、开发板内核编译、uboot编译烧写、配置NFS服务器、挂载根文件系统等等。
任务1: 框架复习
应用编程和底层编程==系统编程和驱动编程。---Linux框架
Cortex-M3: 底层编程。 FATFS---->M4或者其他系列单片机。
f_write(“1234”); --------函数调用-----(SD写扇区)
跑Linux操作系统: 很耗资源(RAM)。(M3/M4) UCGUI或者STemwin
一般CPU内置的ROM和RAM很小。 M级别。
SRAM (静态内存)内存条: 1MB -----空间比较小(成本比较高)、电路简单
DRAM (动态内存)内存条: 1GB -----
64KB和512KB
从CPU上电开始到Linux操作系统正常的运行经历的步骤:
1. 由CPU内嵌的程序将SD卡上指定位置的uboot代码读取到CPU内置的RAM里运行。
2. 当UBOOT代码正常运行之后,再初始化DDR内存条,再将SD卡指定位置的内核映像读取到DDR内存条运行。
3. 当内核正常启动之后,就会挂载根文件系统,当根文件系统挂载成功之后,就可以正常的编程了。
任务2: 搭建开发环境
第一个步骤: 清除前面的学习记录。 #rm /work -rf
准备工作: 在根目录下重新创建一个/work/tiny4412文件夹。
1.1 安装交叉编译器
编译器的位置: \友善之臂_Tiny4412\光盘资料\Linux\ arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz
1. 在/work/创建一个arm-linux-gcc的文件夹。
2. 将arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz拷贝过去解压
3. 解压: [root@wbyq arm-linux-gcc]# tar xvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz
4. 获取编译器的绝对路径:
[root@wbyq bin]# pwd /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin |
5. 加入环境变量 PATH
[root@wbyq bin]# gedit /etc/profile |
6. 生效环境变量: [root@wbyq bin]# source /etc/profile
1. 为什么将环境变量代码加到/etc/profile文件中? root用户登录之后,会自动执行/etc/profile文件中的代码。
2. source命令功能: 让操作系统立即解析指定的文件。 用法: source <文件名称>
3. PATH是什么? 系统的环境变量(系统的全局变量),功能是保存整个系统的可执行文件路径。
比如在命令行上面写一个命令: abc 按下回车。
如果想要知道当前的PATH有哪些值? 在命令行上输出: echo $PATH
4. export关键字: 导出---声明全局变量。
想要让arm-linux-gcc在任何终端使用: 注销用户,再重新登录。
1.2 编译UBOOT
源码位置: \Linux驱动课程相关资料\Tiny4412_UBOOT\uboot_tiny4412-sdk1506.tar
1. 在/work/tiny4412创建一个uboot文件夹。
2. 将压缩包拷贝过去,拷贝可以通过虚拟机的共享路径。
[root@wbyq uboot]# mv /mnt/hgfs/linux-share-dir/uboot_tiny4412-sdk1506.tar ./ |
3. 解压:
[root@wbyq uboot]# tar xvf uboot_tiny4412-sdk1506.tar |
4. 配置uboot进行编译
[root@wbyq uboot_tiny4412-sdk1506]# make distclean //清除所有的配置文件 [root@wbyq uboot_tiny4412-sdk1506]# make clean //清除缓存和链接文件 [root@wbyq uboot_tiny4412-sdk1506]# make tiny4412_config //根据开发板配置uboot [root@wbyq uboot_tiny4412-sdk1506]# make //编译uboot |
编译成功的在目录下会生成一个uboot.bin文件。
5. 烧写UBOOT
路径: [root@wbyq tiny4412]# pwd /work/tiny4412/uboot/uboot_tiny4412-sdk1506/sd_fuse/tiny4412 [root@wbyq tiny4412]# ./sd_fusing.sh /dev/sdb 说明: /dev/sdb是SD卡的设备节点。 |
将uboot烧写到SD卡上之后,开发板选择从SD卡启动,以下是串口软件提示的信息:
U-Boot 2010.12 (Nov 26 2018 - 15:35:21) for TINY4412 CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9] APLL = 1400MHz, MPLL = 800MHz Board: TINY4412 DRAM: 1023 MiB vdd_arm: 1.2 vdd_int: 1.0 vdd_mif: 1.1 BL1 version: N/A (TrustZone Enabled BSP) Checking Boot Mode ... SDMMC REVISION: 1.1 MMC Device 0: 7386 MB MMC Device 1: 7456 MB MMC Device 2: N/A *** Warning - using default environment Net: No ethernet found. Hit any key to stop autoboot: 0 reading kernel..device 0 Start 1057, Count 12288 MMC read: dev # 0, block # 1057, count 12288 ... 12288 blocks read: OK completed reading RFS..device 0 Count 13345, Start 8192 MMC read: dev # 0, block # 13345, count 8192 ... 8192 blocks read: OK completed Wrong Image Format for bootm command ERROR: can't get kernel image! |
得到信息: 内核映像要放在SD卡的第1057个块。
1.3 编译内核
源码位置: \光盘资料\Linux\ linux-3.5-20170221.tgz
1. 在/work/tiny4412/创建一个Linux文件夹
2. 将源码包拷贝过去解压: tar xvf linux-3.5-20170221.tgz
3. 配置内核: [root@wbyq linux-3.5]# cp tiny4412_linux_defconfig .config
4. 配置源码: [root@wbyq linux-3.5]# make menuconfig
System Type ---> [ ] Support TrustZone-enabled Trusted Execution Environment (按下空格去掉*号) 再保存退出。 |
5. 编译内核: [root@wbyq linux-3.5]# make
6. 编译成功之后,内核映像放在: arch/arm/boot/zImage
7. 烧写内核到SD卡: [root@wbyq boot]# dd if=zImage of=/dev/sdb seek=1057
最好在烧写完毕之后再执行一个sync命令。
1.4 制作根文件系统
1. 在/work目录下创建一个busybox目录。
2. 将busybox-1.23.2.tar.bz2拷贝到该目录下解压。[root@wbyq busybox]# tar xvf busybox-1.23.2.tar.bz2
3. 配置源码: [root@wbyq busybox-1.23.2]# make menuconfig
(1) 设置编译器
Busybox Settings ---> Build Options ---> () Cross Compiler prefix (NEW) 修改之后--- (arm-linux-) Cross Compiler prefix |
(2) 设置编译之后文件安装的路径
Busybox Settings ---> Installation Options ("make install" behavior) ---> (./install) BusyBox installation prefix 修改之后 (/work/rootfs) BusyBox installation prefix 修改之后保存退出。 |
4. 编译源码并将文件拷贝到指定的目录下
[root@wbyq busybox-1.23.2]# make && make install |
成功之后再/work目录下会生成/rootfs目录。
1.5 完善根文件系统
在work/rootfs目录下操作。
1. 完善目录
[root@wbyq rootfs]# mkdir etc home lib mnt tmp var sys dev proc code work |
etc: 存放linux操作系统的配置文件。
lib: 存放linux操作系统的共享库。
dev: 存放linux操作系统的设备节点。
proc: 存放linux操作系统的调试接口。
2. 完善etc下的配置文件
(1) 将/etc下的fstab文件拷贝到/work/rootfs/etc目录下
[root@wbyq rootfs]# cp /etc/fstab etc/ |
(2) 将/etc下的密码文件和分组文件拷贝到/work/rootfs/etc目录下
[root@wbyq rootfs]# cp /etc/group etc/ [root@wbyq rootfs]# cp /etc/passwd etc/ |
拷贝之后,将passwd文件里的/bin/bash全部改成/bin/sh
(3) 拷贝初始化配置文件
将inittab profile rcS 3个文件拷贝到/work/rootfs/etc目录下。 [root@wbyq etc]# mkdir init.d 再在etc目录下创建一个目录。 [root@wbyq etc]# mv rcS init.d/ 将rcS文件移动到该目录下。 |
3. 拷贝需要使用的动态库
(1) 拷贝必要的动态库
[root@wbyq lib]# pwd /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib [root@wbyq lib]# cp *.so* /work/rootfs/lib/ -fd //将交叉编译器的共享库拷贝到根文件系统lib目录下 |
(2) 拷贝扩展的动态库
[root@wbyq lib]# pwd /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib [root@wbyq lib]# cp *.so* /work/rootfs/lib/ -fd |
1.6 挂载根文件系统
1. 挂载根文件系统的方式介绍: (1) NFS网络挂载 (2) 本地挂载
2. NFS如何挂载? NFS是网络文件系统。分为NFS服务器、NFS客户端。
3. 设置PC机(红帽子系统),开启NFS服务器。
在红帽子系统根目录下创建一个脚本文件xxx.sh
(创建脚本文件: touch xxx.sh),写入以下代码: (脚本必须修改权限 chmod 777 xx.sh )
#!/bin/sh service nfs restart service iptables stop ifconfig eth0 192.168.10.11 |
4. 永久性关闭防火墙
[root@wbyq /]# setup |
5. 设置NFS服务器需要共享出去的目录
[root@wbyq /]# gedit /etc/exports //打开配置文件,填写将要共享的目录 |
6. 测试共享目录是否生效
[root@wbyq /]# exportfs -r [root@wbyq /]# exportfs -v /work/rootfs <world>(rw,wdelay,no_root_squash,no_subtree_check) |
7. 设置系统的IP地址
8. 设置虚拟机的网络桥接方式
额外的说明: <查看电脑上网卡的名称>
9. 重启NFS服务器
运行刚才写的脚本。 [root@wbyq /]# ./NfsServerStartConfig.sh 关闭 NFS 守护进程: [确定] 关闭 NFS mountd: [确定] 关闭 NFS quotas: [确定] 关闭 NFS 服务: [确定] 启动 NFS 服务: [确定] 关掉 NFS 配额: [确定] 启动 NFS mountd: [确定] 正在启动 RPC idmapd: [确定] 正在启动 RPC idmapd: [确定] 启动 NFS 守护进程: [确定] |
10. 将开发板和电脑使用网线连接。
11. 重启开发板,进入到uboot命令行(321的倒计时之前按下回车键)。
12. 软件的基本配置
13. 打印开发板默认的环境变量
TINY4412 # printenv baudrate=115200 bootargs=noinitrd root=/dev/nfs nfsroot=192.168.10.106:/root/work/root_nfs ip=192.168.10.123:192.168.10.106:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 lcd=S702 bootcmd=movi read kernel 0 40008000;movi read rootfs 0 41000000 400000;bootm 40008000 41000000 bootdelay=3 ethaddr=00:40:5c:26:0a:5b gatewayip=192.168.0.1 ipaddr=192.168.0.20 netmask=255.255.255.0 serverip=192.168.0.10 Environment size: 438/16380 bytes |
设置环境变量:
TINY4412 # setenv bootargs root=/dev/nfs nfsroot=192.168.10.11:/work/rootfs ip=192.168.10.123:192.168.10.11:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 lcd=S702 TINY4412 # saveenv //再保存环境变量 Saving Environment to SMDK bootable device... Done TINY4412 # reset //重启开发板 |
挂载成功的效果:
- 点赞
- 收藏
- 关注作者
评论(0)