IMX6Ull驱动学习-“原汁“kernel

发布于:2024-05-10 ⋅ 阅读:(25) ⋅ 点赞:(0)
1、拷贝一份deconfig文件

拷贝一份defconfig文件

cd arch/arm/configs
cp imx_v7_mfg_defconfig pan_emmc_defconfig

注释掉CONFIG_ARCH_MULTI_V6选项,不然会影响之后驱动开发

CONFIG_ARCH_MULTI_V6=y

使用自己的defconfig文件编译内核

make pan_emmc_defconfig
2、修改一份设备树

2.1、得到设备树

cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-pan-emmc.dts

2.2、将设备树加入到编译选项

上一步拷贝一份官方的设备树文件之后,还 需 要 修 改 文 件 arch/arm/boot/dts/Makefile , 找 到 dtb-$(CONFIG_SOC_IMX6ULL)配置项,在此配置项中加入imx6ull-pan-emmc.dtb

注:.dts 是设备树源码文件,编译 Linux内核的时候Makefile文件会将其编译为.dtb 文件。

3、使用自己的deconfig和设备树

3.1、使用下面命令先编译出内核镜像

# 深度清理工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
# 生成.config文件,之后内核编译会使用.config决定一些编译选项
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- pan_emmc_defconfig
# 图形化界面配置内核 可直接esc退出。因为上一步已经生成了.config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
# 开始编译内核,使用16核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

# 注:在编译内核的时候一定要注意配置和交叉编译工具链。并且使用ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
# 指定好架构和交叉编译工具

3.2、将得到的zImagedtb文件下载到开发板

# 80800000 这些数字表示的存放地址
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000

注:确保 uboot 中的环境变量 bootargs 内容如下:

# 指定终端,波特率和文件系统的存放地址/dev/mmcblk1p2
console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw

3.3、文件系统找不到问题或者nfs挂载失败

根文件系统存在哪里是由 ubootbootargs 环境变 量 指 定 , bootargs 会 传 递 给 Linux 内 核 作 为 命 令 行 参 数 。上 一 小 节 设 置root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2 中,也就是 EMMC 的分区 2中。

使用网络文件系统nfs,直接设置root的值就可以了。

3.3.1、确定uboot中的bootargs参数

①、使用的是emmc的文件系统 参数应该按照下面设置

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'

注:如果使用emmc文件系统的时候一定要确保之前烧录过文件系统。

②、使用网络文件系统nfs,参数如下设置

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs \ 
 nfsroot=192.168.10.100:/home/pan/imx6ull/nfs/rootfs,proto=tcp rw \ 
 ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off ' 

3.3.2、ubuntu16之后网络文件系统nfs无法正常挂载:

①、修改文件

sudo vi /etc/default/nfs-kernel-server

②、内容如下:

# Number of servers to start up
RPCNFSDCOUNT="-V 2 8"

# Runtime priority of server (see nice(1))
RPCNFSDPRIORITY=0

# Options for rpc.mountd.
# If you have a port-based firewall, you might want to set up
# a fixed port here using the --port option. For more information, 
# see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS
# To disable NFSv4 on the server, specify '--no-nfs-version 4' here
RPCMOUNTDOPTS="-V 2 --manage-gids"

# Do you want to start the svcgssd daemon? It is only required for Kerberos
# exports. Valid alternatives are "yes" and "no"; the default is "no".
NEED_SVCGSSD=""

# Options for rpc.svcgssd.
RPCSVCGSSDOPTS="--nfs-version 2,3,4 --debug --syslog"

③、重启服务

sudo service nfs-kernel-server restart

4、emmc设备驱动配置

设置emmc为8线模式,直接修改设备树

&usdhc2 {
    pinctrl-names = "default", "state_100mhz", "state_200mhz";
    pinctrl-0 = <&pinctrl_usdhc2_8bit>;
    pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
    pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
    bus-width = <8>;
    non-removable;
    status = "okay";
 };