0 GIT资料下载
1、想更新韦东山的资料,git clone之后,需要git pull,但是死活不行,提示要先指定远程仓库和分支,但是又死活指定不了,后来经同事指导,需要先进入clone下的目录,在这个目录中执行git pull就可以了。
1 环境搭建
交叉编译工具链安装路径:/opt/fsl-imx-x11/4.1.15-2.1.0
GCC编译器名称:arm-poky-linux-gnueabi-gcc
设置开发板IP地址:
ifconfig eth0 192.168.8.200
开发板挂载网络文件系统nfs:
mount -t nfs -o nolock,vers=3 192.168.8.201:/home/book /mnt
把ubuntu服务器/home/book目录挂在为/mnt目录
每次开机后需要是能环境变量%CC
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
注意:若使用NAT方式配置虚拟机网络,主机的IP地址和虚拟机的IP地址不能为同一个网段!
2 编译操作
编译C程序:
$CC main.c -o main
arm-poky-linux-gnueabi-gcc -march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi -o hello hello.c
制作、使用动态库:按照韦东山视频教程方法一直报错。
3 编译驱动程序操作
编译第一个驱动程序《01_hello_drv》,其中makefile需要进行适应性修改
KERN_DIR = /home/book/linux
all:
make -C $(KERN_DIR) M=`pwd` modules
$(CC) -o hello_drv_test hello_drv_test.c
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
rm -f hello_drv_test
obj-m += hello_drv.o
其中,$(CROSS_COMPILE)gcc -o hello_drv_test hello_drv_test.c
修改为$(CC) -o hello_drv_test hello_drv_test.c
,由于环境搭建的时候source语句已经把CC环境变量设置好了,如下文所示
CC=arm-poky-linux-gnueabi-gcc -march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysrooky-linux-gnueabi
4 装载驱动程序
insmod hello_drv.ko // 安装驱动程序
cat /proc/devices//查看驱动程序
cat命令:linux下的一个文本输出命令,通常是用于观看某个文件的内容的。
/proc/devices文件:这个文件列出字符和块设备的主设备号,以及分配到这些设备号的设备名称。第一列是主设备号,第二列是设备名称。
以下是返回值:
Character devices:
1 mem
4 /dev/vc/0
4 tty
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
29 fb
81 video4linux
89 i2c
90 mtd
108 ppp
116 alsa
128 ptm
136 pts
153 spi
180 usb
189 usb_device
207 ttymxc
216 rfcomm
226 drm
248 hello
249 ttyLP
250 iio
251 watchdog
252 ptp
253 pps
254 rtc
Block devices:
1 ramdisk
259 blkext
7 loop
8 sd
31 mtdblock
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc
主设备号:248
lsmod//查看内核中加载的驱动程序
返回值:
Module Size Used by
hello_drv 3238 0
mx6s_capture 14876 0
ov5640_camera 19965 0
ls /dev/hello -l//查看主设备节点
返回值:
crw------- 1 root root 248, 0 Sep 13 22:01 /dev/hello
ls /dev/100ask_led* -l//查看子设备节点
crw------- 1 root root 248, 0 Sep 13 21:51 /dev/100ask_led0
crw------- 1 root root 248, 1 Sep 13 21:51 /dev/100ask_led1
卸载驱动程序
rmmod hello_drv
5 poll机制学习
(1)查看进程指令
ps -A | grep signal
2807即为进程号
6 更换设备树
6.1 确定需要更换的设备树存储的位置
(1)方法一
我使用的是正点原子的开发板,所以更新设备树文件需要参考该板子的开发手册《【正点原子】I.MX6U 开发板与pc传输文件、单步更新固件参考手册V1.0》P27:
- 使用 ls 指令查看 eMMC 的 boot 分区设备树所在的目录,如下图,有各种屏对应的设备树,
- 根据个人的屏的使用对应的设备树即可,如果没有屏,默认使用的是 imx6ull-14x14-emmc-4.3-48
0x272-c.dtb 这个设备树,更新这个设备树即可。
USER# ls /run/media/mmcblk1p1
(2)方法二
《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.4》P1014 《39.5.3 解决 Linux 内核启动失败》
重启 uboot,进入到命令行模式,输入如下命令查看 EMMC 的分区 1 里面有没有设备树文件:
可以看到以上两种方法分别在linux和uboot查找MMC卡第一个分区中的文件内容。
6.2 确定需要更换的设备树的文件名
从截图中可以看到为了适配不同的屏幕里面有一大堆设备树,那么我目前使用的开发板对应的设备树到底是哪个呢?
(1)方法1
查看内核启动log
(2)方法2
查看uboot内部环境变量设置:
6.3 修改设备树文件
(1)查看设备树文件:arch/arm/boot/dts/imx6ull-14x14-emmc-4.3-480x272-c.dts
直接在文件末尾修改:
直接编译设备树:
`make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs -j16`
6.4重新启动单板
hexdump :十六进制数据查看工具
cat :一个文本文件查看和连接工具。
6.5查看设备树信息
有无对应的platform_device:cd /sys/devices/platform/
设备树的信息:cd /sys/firmware/devicetree/base/
7 更换内核
把服务器上面编译的zImage拷贝到开发板上对应的目录中,稍后重新开发板
cp /mnt/linux-imx-4.1.15-2.1.0/arch/arm/boot/zImage /run/media/mmcblk1p1
reboot
重启开发板之后查看内核日期已经更新