Linux驱动开发_搭建嵌入式开发环境

举报
DS小龙哥 发表于 2022/04/28 23:29:32 2022/04/28
【摘要】 这篇介绍Linux驱动开发相关环境搭建、驱动框架介绍、驱动调用流程,虚拟机环境配置、开发板内核编译、uboot编译烧写、挂载根文件系统等等。

这篇介绍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 //重启开发板


挂载成功的效果:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。