Imx6ull-pro驱动开发基础1

1、linux系统的组成:
Imx6ull-pro驱动开发基础1_第1张图片
linux启动BootLoader,接着启动Linux内核,内核识别跟文件系统,运行APP。
2、拿到板子的操作:
严格按照这个步骤没有问题:

这里我们用的是putty的终端工具,非常简洁,在windows下载的是X86  641、查看串口号,设置波特率、一般都是数据位8停止位1
udhcpc:查看wlan0的IP
ifconfig查看班子IP
2、用SSH登录板子
在ubuntu安装SSH,即可使用MOBAXTERM登录ubuntu
./hello  .代表当前目录,/hello代表当前目录下这个文件
ens32  94.5M对应的是ubuntu的IP
!!!用开发板挂载ubuntu里面的目录:
提前安装nfs;
	mount -t nfs -o nolock,vers=3 192.168.43.254:/home/桌面  /home/orangepi
把虚拟机的某个目录挂载到开发板目录
 

一、开发板登录检测:

1、插上电源
2、插上USB接口
3、查看开发板端口号、设置比特率115200、设置比特流None
4、用Mobaxterm串口/putty登录开发板
5、输入root用户名,密码为空进入系统
	(1)NAT网卡保证ubuntu可以上网(Vmnet8和虚拟机通过net连接)此时虚拟机可以上网ens33 
	(2)虚拟机添加USB网卡作为桥接网卡(ens32),都要设置IP
			给虚拟机设置IP,点击设置网络(192.168.5.11   255.255.255.0  192.168.5.1)
			给windows设置IP,输入ipconfig下的ip地址(192.168.5.10  255.255.255.0  192.168.5.1)
	(3)手工设置开发板的eth0 IP地址
			ifconfig eth0 192.168.5.9  手工设置开发板Ip为此
6、修改文件使开发板ip固定
	(1)ifconfig eth0 192.168.5.92)vi /etc/network/interfaces修改文件内容如下:
			auto lo
			iface lo inet loopback
			auto eth0
			iface eth0 inet static
					 address 192.168.5.9
					 netmask 255.255.255.0
					 gateway 192.168.5.1
	桥接网卡保证开发板和ubuntu互通

给ubuntu安装软件:
book@100ask:~$ git clone https://e.coding.net/weidongshan/DevelopmentEnvConf.git
sudo apt-get update
book@100ask:~$ cd DevelopmentEnvConf
book@100ask:~$ sudo ./Configuring_ubuntu.sh
按2给ubuntu配置环境

遇到问题:
ubuntu新装,(appstreamcli:21755): GLib-CRITICAL **: g_strchomp: assertion 'string != NULL' failed
解决方法:sudo apt-get install libappstream4
配置repo工具:
1、book@100ask:~$ git config --global user.email "[email protected]"
2、book@100ask:~$ git config --global user.name "100ask"
3、git clone https://e.coding.net/codebug8/repo.git
4、mkdir -p 100ask_imx6ull-sdk && cd 100ask_imx6ull-sdk
5、../repo/repo init -u https://gitee.com/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask_imx6ull_linux4.9.88_release.xml --no-repo-verify
6、../repo/repo sync -j4
使用buildroot编译完整系统:(p115)
1、cd /home/book/100ask_imx6ull-sdk
2、cd Buildroot_2020.02.x
3、make clean
4、make 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig
5、 make all -j4
分为四个分区:
book@100ask:~/100ask_imx6ull-sdk/Buildroot_2020.02.x/board/100ask/nxp-imx6ull$: cat genimage.cfg 

1、连接JTG,开关设置USB启动,打开电源。打开编译工具,烧写整个系统。
2、烧到闪存中,然后关闭电源,EMMC启动,打开电源,可以看到开发板进入了新界面
3、设置USB启动,点击更新内核,设备树,U-boot启动。
4、EMMC启动
EMMC即内部自带闪存
5、点击100ask文件夹里led.imx烧写裸机(USB启动),接着EMMC启动,打开电源,绿灯闪烁即裸机启动。
6、设置USB启动,插入内存卡,选择SD,点击烧写整个系统
7、设置SD卡启动,ON  ON  ON  OFF ,打开电源。
8、拔掉SD卡,设置USB启动,打开专业版,烧写re-smart-imx,烧写,可以看到以及进入rt系统

不知道怎么办就重新烧写EMMC

一、HELLO背后没那么简单

交叉编译并允许第一个APP:
1、arm-buildroot-linux-gnueabihf-gcc -o hello hello.c
2、scp hello root@192.168.5.9:/root

二、GCC背后的原理

gcc编译的过程:
gcc test.c -o test -v 查看编译全过程:
可以手动体验:
1、gcc -E -o he1lo.i he1lo.c//把.c变为.s,预处理寻找头文件,展开宏
2、gcc -s -o he1lo.s hello.i//汇编把.s变.o,
3、gcc -c -o he1lo.o he1lo.s
4、gcc -o he1lo hello.o


我们可以用一条命令处理多个源文件:
gcc main.c test.c -o test
我们可以把test.c 和main.c链接起来,运行test
缺点:对所有的文件都会预处理一次
因此应分别编译,最后链接
例如: gcc -c -o a.o a.c
	  gcc -c -o b.o b.c
	  gcc -o test a.o b.o

!!!开发板挂载 Ubuntu 的 NFS 目录

什么是NFS?
windows有C盘、D盘,虚拟机有根目录。
挂载NFS,就是通过网络访问虚拟机的目录。
1、开权限  
虚拟机上cat  /etc/exports  设置共享文件夹
虚拟机上面 ps -A | grep nfs
sudo  mount  -t  nfs -o nolock,vers=3     192.168.5.11:/home/book/nfs_rootfs        /mnt
把192.168.5.11上面的/home/book/nfs_rootfs 文件夹挂载到开发板的/mnt上面
录制宏,避免每次都敲一长串代码挂载
2、开发板运行程序
此时开发板和虚拟机已经形成一定的连接,但是虚拟机编译过的程序开发板并不能直接运行
arm-buildroot-linux-gnueabihf-gcc要借助这个编译工具进行编译
3、配置内核、驱动、设备树
放到板子上

cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88进入到虚拟机该文件夹下面
make mrproper
make 100ask_imx6ull_defconfig
make zImage -j4  只有编译完zlmage后才能编译设备树
make dtbs  编译设备树
译完成后,在 arch/arm/boot 目录下生成 zImage 内核文件, 在
arch/arm/boot/dts 目录下生成设备树的二进制文件 100ask_imx6ull14x14.dtb二进制文件。

cp arch/arm/boot/zImage ~/nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs

cd ~/100ask_imx6ull-sdk/Linux-4.9.88/    进入内核源码目录
make modules   编译内核

开发板上面:uname  -a 查看开发板内核版本  为2020年编译的
挂载前退出挂载目录再 umount  /mnt再点快速挂载目录 

 安装内核和模块到开发板上:
 cp /mnt/zImage /boot
cp /mnt/100ask_imx6ull-14x14.dtb /boot
cp /mnt/lib/modules /lib -rfd

三、MAKEFILE

MAKEFILE最基本的语法是规则,规则是目标文件
规则:
一个简单的 Makefile 文件包含一系列的“规则”,其样式如下:
目标(target): 依赖(prerequiries)<tab>命令(command)
如果“依赖文件”比“目标文件”更加新,那么执行“命令”来重新生成“目
标文件”。
命令被执行的 2 个条件:依赖文件比目标文件新,或是 目标文件还没生成。

Makefile就是名为makefile的文件
例子:
test : main.o sub.o //test目标文件依赖于main.o sub.o
gcc -o test main.o sub.o  
main.o : main.c//main.o依赖于main.c,没有就编译
gcc -c -o main.o main.c
sub.o : sub.c//sub.o依赖于sub.c,没有就编译
gcc -c -o sub.o sub.c

-I  ./代表在当前路径寻找头文件

当有很多依赖文件时:
test : main.o sub.o
gcc -o test main.o sub.o
%.o : %.c
gcc -c -o $@ $<
clean://会导致有同名文件时,无法执行操作
rm *.o test -f
.PHONY clean 把clean定义为假想文件,

$@:目标文件
$<:第一个依赖文件
$^:所有依赖文件


A = xxx // 延时变量
B ?= xxx // 延时变量,只有第一次定义时赋值才成功;如果曾定义过,此赋值无效
C := xxx // 立即变量
D += yyy // 如果 D 在前面是延时变量,那么现在它还是延时变量

例子:
A := $(c)
B =  $(c)
C = abc
D = 100ask
D ?= WEIDONGSHAN

all:
	@echo A = $(A)//取A的值
	@echo B = $(B)
	@echo D = $(D)
#C = C+123

结果:NULL
	NULL
	100ask

Makefile中其他函数:

A=a b c
B=$(foreach f,$(A),$(f).o)//对A中的变量进行.o操作
C=a b c d/
D=$(filter  %/, $(c))//取出C中符合该格式的变量
E=$(filter-out %/, $ (c) )//取出C中不符合该格式的变量
files = $(wildcard *.c)
files2=a.c b.c c.c d.c e.c abc
files3 =$(wildcard  $(files2))//取出files2中真实存在的文件
dep_files = $(patsubst %.c  %.d,$ (files2))//将files2里面的所有.c文件替换为.d文件

all:
@echo B = $(B)
@echo D= $(D)
@echo E= $(E)
@echo files = $(files)
@echo files3 = $(files3)
@echo dep_files = $(dep_files)
结果:a.o b.o c.o
	a b c
	d/
	a.c b.c c.c
	a.c b.c c.c
	a.d b.d c.d d.d e.d

$(foreach var,list,text)  对list里面每个变量执行text公式

你可能感兴趣的:(imx6ull,驱动开发)