目录
sudo找不到交叉编译器
问题
无法找到交叉编译器
原因
- 不同用户初始的PATH是不一样的。切换用户系统会先将PATH设为初始值,然后再根据调用的初始化脚本,添加PATH中的路径。并不是所有用户共用一个PATH。
- su - root,产生一个登录shell去执行后面的指令。登录 shell 执行的是shell 登录的流程,会执行 /etc/profile,/etc/profile.d/下定义的*.sh都会执行。
- su root,产生一个非登录交互shell,非登录交互shell,只执行 用户家目录下 .bashrc等配置文件。
- su - root:以root身份登录,then the shell is login shell, .bash_profile and .bashrc will be sourced.
- su root/其他命令:与root建立一个连接,通过root执行命令。then only .bashrc will be sourced.
- 最直接的区别是su目录还是原先用户目录,su - root后目录就变为root用户的主目录。
因此,可以在.bashrc修改PATH、PHP、APACHE、Mysql等路径。
解决
修改root用户.bashrc文件
切换root用户编译
编译nxp官方uboot
命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
可设置脚本或在makefile中设置环境变量
踩在官方的肩膀上移植
基于视频教程,有些与教程不一样,更多的就是改名字,除了驱动部分。
添加开发板默认配置文件
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
Uboot.imx头部信息,时钟什么的,就是改这个文件。
修改为:
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_alientek_
emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
修改依赖文件名字。
添加开发板对应的头文件
mx6ull_alientek_emmc.h文件其他先不修改。
添加开发板对应的板级文件夹
修改makefile
修改imximage.cfg
修改Kconfig
修改MAINTAINERS
修改 U-Boot 图形界面配置文件
这个很关键,不然改了相当于没改。
编译测试
出现mx6ull_alientek_emmc.o,代表编译了改板级支持包。
mx6ull_alientek_emmc.h文件也被多次调用。
大功告成。
LCD 驱动修改
引脚:
// /* Reset the LCD */
// gpio_direction_output(IMX_GPIO_NR(5, 9) , 0);
// udelay(500);
// gpio_direction_output(IMX_GPIO_NR(5, 9) , 1);
主要修改这:
没有修改环境变量
解决
也可以设置环境变量,最优解还是改文件。
修改网络驱动
mx6ull采用内部mac+外部phy方式,因为是芯片不支持一套流,正点原子换芯片了,外部phy采用的是ksz8081,所以这里网络修改是大头。
修改mx6ull_alientek_emmc.h
注意注释问题。
修改mx6ull_alientek_emmc.c
添加引脚定义
删除 uboot 中 74LV595 的驱动代码
宏定义
#define IOX_SDI IMX_GPIO_NR(5, 10)
#define IOX_STCP IMX_GPIO_NR(5, 7)
#define IOX_SHCP IMX_GPIO_NR(5, 11)
#define IOX_OE IMX_GPIO_NR(5, 8)
数组
static iomux_v3_cfg_t const iox_pads[]
函数
static void iox74lv_init(void)
void iox74lv_set(int index)
语句
imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
iox74lv_init();
添加语句
修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link
setenv ipaddr 192.168.1.55
//开发板 IP 地址
setenv ethaddr b8:ae:1d:01:00:00
//开发板网卡 MAC 地址
setenv gatewayip 192.168.1.1
//开发板默认网关
setenv netmask 255.255.255.0
//开发板子网掩码
setenv serverip 192.168.1.250
//服务器地址,也就是 Ubuntu 地址
saveenv
//保存环境变量
测试enet2
测试enet1
修改头文件中的宏定义即科修改使用网口。
修改板子名称
uboot启动linux内核测试
emmc启动
切换到emmc
mmc dev 1
查看emmc是否有镜像
mmc 1的一个分区1;
这里不切换也是可以的
把mmc1分区1的zimage下载到ddr的ox80800000地址。
启动内核
bootz 80800000 - 83000000
启动成功,说明支持emmc启动
网络启动
查看是否能通信
从tftp下载
勾八网络
没有下载zImage加载到ddr是启动不了的
网络太垃圾,用tftp加载设备树,用emmc加载内核,启动成功。
bootcmd 和 bootargs 环境变量
mx6ull_alientek_emmc.h文件中有定义,就比如lcd屏幕那里的id
可以修改这,也可以启动uboot再设置环境变量。
bootcmd
uboot倒计时完,用来启动 Linux 内核的,比如读取 EMMC 或 者 从tftp 中的 Linux 内核镜像文件和设备树文件到 DRAM 中,然后启动 Linux 内核。
格式
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb; bootz 80800000 - 83000000;'
其实和我们手动从emmc启动是一样的,当时使用起来你不可能叫别人手动启动吧,使用再uboot倒计时后就是执行的这个命令。
测试
bootargs
bootargs 保存着 uboot 传递给 Linux 内核的参数。
格式
setenv bootargs console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw
console
- console 用来设置 linux 终端(或者叫控制台),也就是通过什么设备来和 Linux 进行交互,是串口还是 LCD 屏幕?如果是串口的话应该是串口几等等。
- 这里设置 console 为 ttymxc0,因为 linux启动以后 I.MX6ULL 的串口 1 在 linux 下的设备文件就是/dev/ttymxc0,ttymxc0 后面有个“,115200”,这是设置串口的波特率,console=ttymxc0,115200 综合起来就是设置 ttymxc0(也就是串口 1)作为 Linux 的终端,并且串口波特率设置为 115200。
root
- root 用来设置根文件系统的位置,root=/dev/mmcblk1p2 用于指明根文件系统存放在mmcblk1 设备的分区 2 中。
- EMMC 版本的核心板启动 linux 以后会存在/dev/mmcblk0、/dev/mmcblk1、/dev/mmcblk0p1、/dev/mmcblk0p2、/dev/mmcblk1p1 和/dev/mmcblk1p2 这样的文件,
- 其中/dev/mmcblkx(x=0~n)表示 mmc 设备,而/dev/mmcblkxpy(x=0n,y=1n)表示mmc 设备x 的分区 y。
- 在 I.MX6U-ALPHA 开发板中/dev/mmcblk1 表示 EMMC,而/dev/mmcblk1p2 表示EMMC 的分区 2。
- root 后面有“rootwait rw”,rootwait 表示等待 mmc 设备初始化完成以后再挂载,否则的话mmc 设备还没初始化完成就挂载根文件系统会出错的。
- rw 表示根文件系统是可以读写的,不加rw 的话可能无法在根文件系统中进行写操作,只能进行读操作。
rootfstype
- 此选项一般配置 root 一起使用,rootfstype 用于指定根文件系统类型,如果根文件系统为ext 格式的话此选项无所谓。
- 如果根文件系统是 yaffs、jffs 或 ubifs 的话就需要设置此选项,指定根文件系统的类型。
测试
注意格式,这个空格什么的都有影响,写错一点可能就无法启动内核。
bootargs console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw
从网络更新sd卡和emmc的uboot
更新到sd卡
424960/512=830,一共烧写 742(0x33E)个块。
=> mmc dev 0 0
switch to partitions #0, OK
mmc0 is current device
=> mmc write 80800000 2 33E
MMC write: dev # 0, block # 2, count 830 ... 830 blocks written: OK
未更新前
U-Boot 2016.03 (Mar 29 2022 - 20:14:59 -0700)
更新后
U-Boot 2016.03 (Mar 30 2022 - 12:52:51 +0800)
更新到emmc
mmc dev 1 0 //切换到 EMMC 分区 0 tftp 80800000 u-boot.imx //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 32E //烧写 u-boot.imx 到 EMMC 中
mmc partconf 1 1 0 0 //分区配置,EMMC 需要这一步!
**千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!**