驱动开发之网络调试驱动设备的Linux系统移植

  • 1、Uboot移植到开发板
    • uboot移植
  • 2、开发板网络通讯
    • nfs命令
    • tftp命令
  • 3、Linux移植到开发板
  • 4、BusyBox 构建根文件系统
  • 5、软件运行

1、Uboot移植到开发板

uboot 官网为链接: link.
NXP 维护的 uboot 版 本,下 载 地 址 为 :链接: link.
正点原子提供的 uboot 源码路径为:开发板光盘->1、例程源码->10、开发板教程对应的uboot和linux源码> uboot-imx_rel_imx_4.1.15_2.1.0_ga_alientek.tar

uboot移植

  1. 在 Ubuntu 中安装 ncurses 库, 否则编译会报错
sudo apt-get install libncurses5-dev
  1. 在Ubuntu中samba服务共享文件夹share中创建存放uboot源码的文件夹,将源码压缩包拷贝进创建的文件夹,解压
 tar -vxjf uboot-imx_rel_imx_4.1.15_2.1.0_ga_alientek.tar

  1. 512MB+8G 的 EMMC 核心板,创建shell脚本文件
  1 #!/bin/bash2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-distclean3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-    mx6ull_alientek_emmc_defconfig4 make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
  1. chmod 命令给予 mx6ull_alientek_emmc.sh 文件可执行权限,然后就可以使用这个 shell脚本文件来重新编译 uboot

  2. uboot烧写启动
    将 uboot烧写到 SD 卡中,然后通过 SD 卡来启动来运行 uboot。使用 imxdownload 软件烧写,命令如下:

chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload u-boot.bin /dev/sdd

等待烧写完成,完成以后将 SD 卡插到 I.MX6U-ALPHA 开发板上, BOOT 设置从 SD 卡启动,使用 USB 线将 USB_TTL 和电脑连接,也就是将开发板的串口 1 连接到电脑上。打开MobaXterm,设置好串口参数并打开,最后复位开发板。在 MobaXterm 上出现“Hit any key tostop autoboot: ”倒计时的时候按下键盘上的回车键,默认是 3 秒倒计时,在 3 秒倒计时结束以
后如果没有按下回车键的话 uboot 就会使用默认参数来启动 Linux 内核了。如果在 3 秒倒计时结束之前按下回车键,那么就会进入 uboot 的命令行模式

2、开发板网络通讯

在使用 uboot 的网络功能之前先用网线将开发板的 ENET2 接口和电脑或者路由器连接起来, I.MX6U-ALPHA 开发板有两个网口: ENET1 和 ENET2,一定要连接 ENET2,不能连接错了 。

  • 将开发板和主机连接在同一个路由器或者网域内

使用SD卡移植uboot,启动uboot,在MobaXterm软件终端窗口可以看到启动过程;可以看到开发板的网络功能还没设置,开发板的MAC地址ethaddr、开发板ip地址没设置;

  • 设置ethaddr地址:

  • 在主机端找到自身的网络地址:
    在ubuntu中点击编辑->虚拟网络编辑器,将虚拟机虚拟网卡清除掉,务必将网络设置为桥接模式,使得虚拟机的地址跟主机同一个网段,Ubuntu网络地址 10.23.21.171

  • 点击reset按钮重启uboot发现,因为此时已经有开发板的物理地址,DHCP从路由器获取 IP 地址,前提从开发板连接到路由器上。这时,开发板的ipaddr为10.23.21.89,gatewayip为10.23.21.1。或者通过ping一个同网段的地址看看是否被占用,在设置。

  • 设置ipaddr,10.23.21.89

  • 用ping命令与Ubuntu进行通信,此时发现通信成功,uboot 的网络工作正常

  • 将剩余的网络地址环境变量设置:

  • 用print在软件终端查看信息

nfs命令

nfs的使用见 link.

tftp命令

1、需要安装 tftp-hpa 和 tftpd-hpa,命令如下:

sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd

2、在用户目录下新建一个目录

mkdir /home/bruce/share/linux/tftpboot
chmod 777 /home/bruce/share/linux/tftpboot

3、配置 tftp,安装完成以后新建文件/etc/xinetd.d/tftp

1 server tftp
2 {3 socket_type = dgram
4 protocol = udp
5 wait = yes
6 user = root
7 server = /usr/sbin/in.tftpd
8 server_args = -s /home/zuozhongkai/linux/tftpboot/
9 disable = no
10 per_source = 11
11 cps = 100 2
12 flags = IPv4
13 }

4、启动 tftp 服务

sudo service tftpd-hpa start

5、打开/etc/default/tftpd-hpa 文件,将其修改

1 # /etc/default/tftpd-hpa
2 3
TFTP_USERNAME="tftp"
4 TFTP_DIRECTORY="/home/bruce/share/linux/tftpboot"
5 TFTP_ADDRESS=":69"
6 TFTP_OPTIONS="-l -c -s"

6、重启 tftp 服务器:

sudo service tftpd-hpa restart

3、Linux移植到开发板

Linux 官网为链接: link.
正点原子提供的Linux源码路径为:开发板光盘->1、例程源码->10、开发板教程对应的uboot和linux源码>linux-imx_rel_imx_4.1.15_2.1.0_ga_alientek.tar

1、编译内核之前需要先在 ubuntu 上安装 lzop 库,否则内核编译会失败!命令如下:

sudo apt-get install lzop

2、在Ubuntu中samba服务共享文件夹share中创建存放liunx源码的文件夹,将源码压缩包拷贝进创建的文件夹,解压

 tar -vxjf linux-imx_rel_imx_4.1.15_2.1.0_ga_alientek.tar


3、创建shell脚本文件mx6ull_alientek_emmc.sh

  1 #!/bin/sh2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig4 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig5 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

4、 使用 chmod 给予 mx6ull_alientek_emmc.sh 可执行权限,然后运行此 shell 脚本,命令如下:

sudo chmod 777 mx6ull_alientek_emmc.sh
./mx6ull_alientek_emmc.sh

编译的时候会弹出 Linux 图形配置界面,Linux 的图行界面配置和 uboot 是一样的,这里我们不需要做任何的配置,直接按两下 ESC键退出,退出图形界面以后会自动开始编译 Linux。等待编译完成。

5、编译完成以后就会在 arch/arm/boot 这个目录下生成一个叫做 zImage 的文件, zImage 就是我们要用的 Linux 镜像文件。另外也会在 arch/arm/boo/dts 下生成很多.dtb 文件,这些.dtb 就是设备树文件。

6、将编译出来的 zImage 和 imx6ull-alientek-emmc.dtb 复制到 Ubuntu 中的 tftp 目录下,要在 uboot 中使用 tftp 命令将其下载到开发板中,拷贝命令如下:

cp arch/arm/boot/zImage /home/bruce/share/linux/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-alientek-emmc.dtb /home/bruce/share/linux/tftpboot/ -f

7、启动开发板,进入 uboot 命令行模式,然后输入如下命令将
zImage 和 imx6ull-alientek-emmc.dtb 下载到开发板中并启动:

tftp 80800000 zImage
tftp 83000000 imx6ull-alientek-emmc.dtb
bootz 80800000 - 83000000

4、BusyBox 构建根文件系统

官网地址为:link. 在官网左侧的“Get BusyBox”栏有一行“Download Source”,点击“Download Source”即可打开 BusyBox 的下载页。
路径为: 1、例程源码->6、 BusyBox 源码->busybox-1.29.0.tar.bz2

1、在 Linux 驱动开发的时候都是通过 nfs 挂载根文件系统,在nfs服务器目录中创建子目录,nfs的使用见 link. 创建好的 rootfs 子目录就用来存放我们的根文件系统。

2、busybox-1.29.0.tar.bz2 发送到 Ubuntu 中,存放位置大家随便选择,解压

tar -vxjf busybox-1.29.0.tar.bz2


3、修改 Makefile,添加编译器
打开 busybox 的顶层 Makefile,添加 ARCH 和 CROSS_COMPILE的值,如下所示:

164 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-
x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
......
190 ARCH ?= arm

4、配置 busybox
一般使用默认配置即可,make defconfig
命令打开图形化配置界面:make menuconfig
配置路径如下:

Location:
-> Settings
-> Build static binary (no shared libs)不要选择Location:
-> Settings
-> vi-style line editing commands选择Location:
-> Linux Module Utilities
-> Simplified modutils不要选择Location:
-> Linux System Utilities
-> mdev (16 kb) //确保下面的全部选中,默认都是选中的Location:
-> Settings
-> Support Unicode //选中
-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中

5、编译 busybox,将编译结果存放到前面创建的 rootfs 目录中

make
make install CONFIG_PREFIX=/home/bruce/share/linux/nfs/rootfs


编译完成以后会在 busybox 的所有工具和文件就会被安装到 rootfs 目录中

Linux 内核 init 进程最后会查找用户空间的 init 程序,找到以后就会运行这个用户空间的 init 程序,从而切换到用户态。如果 bootargs 设置 init=/linuxrc,那么 linuxrc 就是可以作为用户空间的 init 程序,所以用户态空间的 init 程序是 busybox 来生成的。

6、向根文件系统添加 lib 库
在 rootfs 中创建一个名为“lib”的文件夹,命令如下:mkdir lib
进入如下路径对应的目录:

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linuxgnueabihf/libc/lib

此目录下有很多的* so * ( * 是通配符) 和 .a 文件,这些就是库文件,将此目录下所有的* so * 和.a文件都拷贝到 rootfs/lib 目录中, 拷贝命令如下:

cp *so* *.a /home/bruce/share/linux/nfs/rootfs/lib/ -d

后面的“-d”表示拷贝符号链接,这里有个比较特殊的库文件: ld-linux-armhf.so.3,此库文件也是个符号链接,相当于 Windows 下的快捷方式。会链接到库 ld-2.19-2014.08-1-git.so 上,输入命令“ls ld-linux-armhf.so.3 -l”查看此文件详细信息。ld-linux-armhf.so.3 后面有个“->”,表示其是个软连接文件,链接到文件 ld-2.19-2014.08-1-git.so,因为其是一个“快捷方式”,因此大小只有 24B。但是, ld-linuxarmhf.so.3 不能作为符号链接,否则的话在根文件系统中执行程序无法执行!所以我们需要 ldlinux-armhf.so.3 完成逆袭,由“快捷方式”变为“本尊”。

重新复制 ld-linuxarmhf.so.3,只是不复制软链接即可,先将 rootfs/lib 中的 ld-linux-armhf.so.3 文件删除掉

rm ld-linux-armhf.so.3

然 后 重 新 进 入 到 /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/armlinux-gnueabihf/libc/lib 目录中,重新拷贝 ld-linux-armhf.so.3,命令如下:

cp ld-linux-armhf.so.3 /home/bruce/share/linux/nfs/rootfs/lib/

7、进入如下目录中:

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib

此目录下也有很多的的so和.a 库文件,我们将其也拷贝到 rootfs/lib 目录中,命令如下:

cp *so* *.a /home/bruce/share/linux/nfs/rootfs/lib/ -d

8、向 rootfs 的“usr/lib”目录添加库文件
在 rootfs 的 usr 目录下创建一个名为 lib 的目录,将如下目录中的库文件拷贝到 rootfs/usr/lib目录下:

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib

将此目录下的 so 和.a 库文件都拷贝到 rootfs/usr/lib 目录中,命令如下:

cp *so* *.a /home/bruce/share/linux/nfs/rootfs/usr/lib/ -d

9、创建其他文件夹
在根文件系统中创建其他文件夹,如 dev、 proc、 mnt、 sys、 tmp 和 root 等

10、创建/etc/init.d/rcS 文件
rcS 是个 shell 脚本, Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件的脚本文件。在 rootfs 中创建/etc/init.d/rcS 文件

1 #!/bin/sh
2
3 PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
5 export PATH LD_LIBRARY_PATH
6
7 mount -a
8 mkdir /dev/pts
9 mount -t devpts devpts /dev/pts
10
11 echo /sbin/mdev > /proc/sys/kernel/hotplug
12 mdev -s

11、使用如下命令给予/ec/init.d/rcS 可执行权限:

chmod 777 rcS

设置好以后就重新启动 Linux 内核

12、创建/etc/fstab 文件
在 rootfs 中创建/etc/fstab 文件, fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区

1 #<file system> <mount point> <type> <options> <dump> <pass>
2 proc /proc proc defaults 0 0
3 tmpfs /tmp tmpfs defaults 0 0
4 sysfs /sys sysfs defaults 0 0<file system>:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
<mount point>:挂载点。
<type>:文件系统类型,比如 ext2、 ext3、 proc、 romfs、 tmpfs 等等。
<options>:挂载选项,在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使
用 defaults,也就是默认选项, defaults 包含了 rw、 suid、 dev、 exec、 auto、 nouser 和 async。
<dump>:为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。

13、创建/etc/inittab 文件
init 程序会读取/etc/inittab
这个文件, inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的 4 个段组成

1 #etc/inittab
2 ::sysinit:/etc/init.d/rcS
3 console::askfirst:-/bin/sh
4 ::restart:/sbin/init
5 ::ctrlaltdel:/sbin/reboot
6 ::shutdown:/bin/umount -a -r
7 ::shutdown:/sbin/swapoff -a第 2 行,系统启动以后运行/etc/init.d/rcS 这个脚本文件。
第 3 行,将 console 作为控制台终端,也就是 ttymxc0。
第 4 行,重启的话运行/sbin/init。
第 5 行,按下 ctrl+alt+del 组合键的话就运行/sbin/reboot,看来 ctrl+alt+del 组合键用于重
启系统。
第 6 行,关机的时候执行/bin/umount,也就是卸载各个文件系统。
第 7 行,关机的时候执行/sbin/swapoff,也就是关闭交换分区。

最后,启动开发板,进入 uboot 命令行模式,然后重新设置 bootargs 环境变量,命令如下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.250:
/home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1:
255.255.255.0::eth0:off' //设置 bootargs
saveenv //保存环境变量

设置好以后使用“boot”命令启动 Linux 内核

5、软件运行

在根文件系统下创建一个名为“drivers”的文件夹,以后我们学习 Linux 驱动的时候就把所有的实验文件放到这个文件夹里面。

1、在 ubuntu 下使用 vim 编辑器新建一个 hello.c 文件

1 #include <stdio.h>
2 3
int main(void)
4 {5 while(1) {6 printf("hello world!\r\n");
7 sleep(2);
8 }
9 return 0;
10 }

2、编译

arm-linux-gnueabihf-gcc hello.c -o hellofile hello //查看 hello 的文件类型以及编码格式

3、将其拷贝到 rootfs/drivers 目录下,在开发板中输入如下命令来执行这个可执行文件:

cd /drivers //进入 drivers 目录
./hello //执行 hello


使用“ctrl+c”来关闭 hello。

嵌入式Linux(5):驱动开发网络调试驱动设备的Linux系统移植相关推荐

  1. Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)

    文章目录 全系列传送门 1. 在/arch/arm/boot/dts/imx6q-pinfunc.h查找 2. 在设备树配置文件中添加设备节点定义以及其引脚定义 3. 修改设备树文件添加配置 4. d ...

  2. 《linux设备驱动开发详解》笔记——15 linux i2c驱动

    <linux设备驱动开发详解>笔记--15 linux i2c驱动 15.1 总体结构 如下图,i2c驱动分为如下几个重要模块 核心层core,完成i2c总线.设备.驱动模型,对用户提供s ...

  3. Linux驱动开发1:驱动开发与裸机开发的区别

    Linux驱动开发1:驱动开发与裸机开发的区别 1.裸机驱动开发回顾: 裸机驱动开发是非常底层的,跟寄存器打交道,有些MCU为了方便我们开发,提供了一些库,让我们通过调用API函数来间接的实现利用寄存 ...

  4. <Linux开发>驱动开发 -之-platform 驱动

    <Linux开发>驱动开发 -之-platform 驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: < ...

  5. Linux驱动开发—内核I2C驱动详解

    Linux驱动开发--内核I2C驱动 I2C驱动文件结构 I2C数据传输过程 i2c_transfer i2c_msg I2C通讯常用的接口函数(老版本) 快速读写接口函数:(连续读写) 常用的读操作 ...

  6. STM32MP157驱动开发——4G通信模块驱动

    STM32MP157驱动开发--4G通信模块驱动 一.简介 二.驱动开发 1.高新兴 ME3630 驱动开发 驱动修改 添加 ECM 支持程序 配置 Linux 内核 ppp拨号功能测试 ECM 联网 ...

  7. QT开发网络调试助手项目总结

    之前整理了一些使用QT开发串口调试助手的项目. 博客地址:上位机总结 这次继续整理一些使用QT开发网络调试助手的项目. Qt开源作品41-网络调试助手增强版V2022 我的QT学习之路,编写UDP+t ...

  8. linux usbnet网络驱动,[技术资料]基于usb设备的linux网络驱动程序开发

    1 引言 做为开放源代码 (open source) 运动重要组成部分,linux操作系统吸引了数以万计的程序员共同开发.由于linux比较完整的继承了各种unix版本的稳定和高效,并且克服和改进了传 ...

  9. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

最新文章

  1. 编译器架构Compiler Architecture(下)
  2. Java中的volatile关键字
  3. LeetCode35.搜索插入位置
  4. 李宏毅老师机器学习和深度学习
  5. LVS--NAT模型配置
  6. java学习笔记_Java学习笔记day11
  7. hbase sqoop 实验_SQOOP安装及使用-实验
  8. 每天进步一点点《ML - 人工神经网络》
  9. 圆环和环形是一样的吗_Excel不知道还可以这样做圆环图
  10. Django之一个简单的图书管理系统(单表)
  11. Winform—C#读写config配置文件
  12. 超分辨率技术如何发展?这6篇ECCV 18论文带你一次尽览
  13. linux安装redis有什么用吗,Linux下 安装Redis
  14. 网页设计与网站组建标准教程(2013-2015版)
  15. iOS开发之模拟器(simulator)的复制粘贴
  16. 计算机网络技术论文致谢,路由器论文致谢
  17. 神经元模型和BP网络
  18. 单片机加减法C语言,单片机的加减法原理
  19. 纵享丝滑滑动切换的周月日历,水滴效果,可高度定制,仿小米日历
  20. vm虚拟机关机后打不开_VMWARE虚拟机非正常关机导致无法启动的解决办法

热门文章

  1. 宏基因组学数据分析在生物医学领域的应用
  2. E/WindowManager: android.view.WindowLeaked: Activity com.xxx.xxx.xxx has leaked window com.android.i
  3. 华师大 OJ 3053
  4. word文档找不到smartart_word2003SmartArt在哪里
  5. iframe相关,iframe样式
  6. Android修行手册 - 实现可折叠TextView,仅一个类复制即用
  7. 解决Word2010中插入图片时变成空白框问题
  8. linux 如何安装maven
  9. 【论文阅读】深度学习去雾1——论文精选
  10. python 实现京东滑块验证码登录