一.编译
1.1 版本说明
- 操作系统:Ubuntu16.04 64 位版
- 交叉工具链:arm-poky-linux-gnueabi-gcc 5.3.0
- Bootloader 版本:u-boot-2016.03
- 内核版本:linux-4.1.15
- QT 版本:Qt 5.6.2
1.2 安装 SDK (包含交叉编译器)
- 将 shell 脚本拷贝到任意目录(例如用户目录:/home/{username}/work)下,在该目录下执行
neo@ubuntu:~/work$ sudo ./fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolc
hain-4.1.15-2.0.0.sh
[sudo] password for neo:
Freescale i.MX Release Distro SDK installer version 4.1.15-2.0.0
================================================================
Enter target directory for SDK (default: /opt/fsl-imx-x11/4.1.15-2.0.0):
You are about to install the SDK to "/opt/fsl-imx-x11/4.1.15-2.0.0". Proceed[Y/n]?
Extracting SDK..................
- 命令行提示:Enter target directory for SDK (default: /opt/fsl-imx-x11/4.1.15-2.0.0),默认设置安装地
址直接回车即可 - 命令行提示:You are about to install the SDK to “/opt/fsl-imx-x11/4.1.15-2.0.0”. Proceed[Y/n]?,输
入 Y 即可
1.3环境变量配置
- . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi(注意“.”后面有空格)
- 每次打开新的窗口都要重新配置,或者直接配置.brashrc文件
- arm-poky-linux-gnueabi-gcc -v:检查版本
1.4编译linux-4.1.15
- 解压‘linux-4.1.15.tar.bz2’到work目录下,tar xvf linux-4.1.15.tar.bz2
neo@ubuntu:~/work$ tar xvf linux-4.1.15.tar.bz2
- 进入源码树目录下
- 编译内核: source imx6ull_build.sh
arch/arm/configs/imx6ull_defconfig 为 配置文件路径
.tmp/image/zImage 为内核镜像路径。
.tmp/image/imx6ull-S-gpmi-800x480c7.dtb 为生成的 NAND 的 dtb 文件所在路径。
.tmp/image/imx6ull-S-emmc-800x480c7.dtb 为生成的 eMMC 的 dtb 文件所在路径。
.tmp/image/modules.tar.bz2 为生成的模块打包文件 - 单步编译内核方法(报错时比较好用,不用全部编译,节省时间)
neo@ubuntu:~/work/linux-4.1.15$ make distclean
neo@ubuntu:~/work/linux-4.1.15$ make imx6ull_defconfig
neo@ubuntu:~/work/linux-4.1.15$ make zImage
neo@ubuntu:~/work/linux-4.1.15$ make dtbs
neo@ubuntu:~/work/linux-4.1.15$ make modules
二.nand-sdburn 烧录
2.1 SD卡制作
- 将实现准备好的文件nand-sdburn放到work目录下,
ztj@ubuntu:~/work/nand-sdburn$ ls
6ullsdburn.sh sdrun target
ztj@ubuntu:~/work/nand-sdburn$
- 插入SD卡,启动脚本,选择挂载你的sd卡,
sudo ./6ullsdburn.sh
- 选择y,回车
- 出现红框部分,挂载成功
- 卡制作完成后可以看到 boot 分区包含 sdrun 和 target 两个目录。sdrun 文件夹内容用于引导系统烧
写,无需修改;target 目录内容会烧写到 flash 芯片。如果需要替换镜像文件,只需将 target 目录中的对
应文件替换掉,并保持同样的命名,之后再重新进行系统烧写。
2.2 烧录
- 打开超级终端,Hyper Terminal用于观察烧录过程
- 插入SD卡
- 将两个桥接件拔掉,按复位按钮,进行烧录
三.设备树增加节点(mcp2515)
- 根据电路图,mcp原来的引脚,是LCD功能模块的,现在要改成mcp2515相关引脚,所以需要注意注释掉原来lcd部分代码。
3.1 mcp2515电路图
mcp2515是独立的can控制器,imx6ull自带两个can接口,现在新增一个can接口,就要增加一个can控制器
3.2 imx6ull核心板相关GPIO引脚电路图
3.3 查硬件手册20页,相关功能引脚GPIO功能图
3.4修改dts
- 先查看一下,是否有mcp2515的驱动
neo@ubuntu:~$ cd drivers
neo@ubuntu: ~/drivers $ find -name "mcp25*"
./net/can/spi/mcp251x.c
-
在配置文件./net/can/Makefile中设置obj-$(CONFIG_CAN_MCP251X) += mcp251x.o(如果没有)
在配置文件 arch/arm/config/imx6ull_defconfig 中设置 CONFIG_CAN_MCP251X=y. -
将/arch/arm/boot/dts目录下的imx6ull-14x14-evk.dts,复制工作目录下,或者自己准备分dts文件,防止文件修改时损坏
-
进入/arch/arm/boot/dts目录,打开imx6ull.dtsi文件,在clocks中增加mcp251x的时钟
mcp251x_clock: mcp251x_clock{
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <8000000>;
};
- 回到work目录,修改刚才复制的dts文件
- 配置参考电压,在regulators{}里面,注意改成对应的引脚参数
reg_mcp_3v3: regulator@4 {
compatible = "regulator-fixed";
reg = <0>;
regulator-name = "can-3v3";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
gpios = <&gpio3 15 GPIO_ACTIVE_LOW>;
};
- 配置 PIN MUX:在iomuxc{}里面,注意先注释原来的lcd所占引脚,因为这几个引脚默认为lcd引脚,我们要把他配置成spi引脚
- 注释lcd部分引脚:
pinctrl_lcdif_dat: lcdifdatgrp {
fsl,pins = <
MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x79
MX6UL_PAD_LCD_DATA01__LCDIF_DATA01 0x79
MX6UL_PAD_LCD_DATA02__LCDIF_DATA02 0x79
MX6UL_PAD_LCD_DATA03__LCDIF_DATA03 0x79
MX6UL_PAD_LCD_DATA04__LCDIF_DATA04 0x79
MX6UL_PAD_LCD_DATA05__LCDIF_DATA05 0x79
MX6UL_PAD_LCD_DATA06__LCDIF_DATA06 0x79
MX6UL_PAD_LCD_DATA07__LCDIF_DATA07 0x79
MX6UL_PAD_LCD_DATA08__LCDIF_DATA08 0x79
MX6UL_PAD_LCD_DATA09__LCDIF_DATA09 0x79
/* MX6UL_PAD_LCD_DATA10__LCDIF_DATA10 0x79*/
MX6UL_PAD_LCD_DATA11__LCDIF_DATA11 0x79
MX6UL_PAD_LCD_DATA12__LCDIF_DATA12 0x79
MX6UL_PAD_LCD_DATA13__LCDIF_DATA13 0x79
MX6UL_PAD_LCD_DATA14__LCDIF_DATA14 0x79
MX6UL_PAD_LCD_DATA15__LCDIF_DATA15 0x79
MX6UL_PAD_LCD_DATA16__LCDIF_DATA16 0x79
MX6UL_PAD_LCD_DATA17__LCDIF_DATA17 0x79
MX6UL_PAD_LCD_DATA18__LCDIF_DATA18 0x79
/* MX6UL_PAD_LCD_DATA19__LCDIF_DATA19 0x79
MX6UL_PAD_LCD_DATA20__LCDIF_DATA20 0x79
MX6UL_PAD_LCD_DATA21__LCDIF_DATA21 0x79
MX6UL_PAD_LCD_DATA22__LCDIF_DATA22 0x79
MX6UL_PAD_LCD_DATA23__LCDIF_DATA23 0x79*/
>;
};
- 配置Pin Mux
pinctrl_ecspi1: spi1grp {
fsl,pins = <
MX6UL_PAD_LCD_DATA23__ECSPI1_MISO 0x100b1
MX6UL_PAD_LCD_DATA22__ECSPI1_MOSI 0x100b1
MX6UL_PAD_LCD_DATA20__ECSPI1_SCLK 0x100b1
>;
};
pinctrl_ecspi1_cs: ecspi1_csgrp {
fsl,pins = <
MX6UL_PAD_LCD_DATA21__GPIO3_IO26 0x80000000
>;
};
pinctrl_can: can {
fsl,pins = <
MX6UL_PAD_LCD_DATA19__GPIO3_IO24 0x100b1
>;
};
};
};
3.5 验证
- 步骤 1:按软件手册编译内核和设备树。注意查看编译完内核之后,是否在 drivers/spi/下生成
spi-imx.o,是否在 drivers/net/can/下生成 mcp251x.o,如果没生成,查看配置是否出错?生成*.o
文件说明已经编译进内核。 - 步骤 2 :替换烧写工具中的设备树和内核,重新烧写。开机选择刚替换的设备树。
- 步骤 3 :此 ecspi1 驱动加载成功之后,cat /sys/bus/spi/devices/spi1.0/modalias 会出现
spi:mcp2515。 - 步骤 4 :查看打印信息是否生成 can0 节点(ifconfig -a),或者直接进入设备目录查看
四.Nand 单步更新内核
- 更新 dtb 以及内核,logo,可以使用 nandwrite 命令,该命令也已经打包在文件系统中。使用时,要
将待烧写的 dtb、logo、 zImage 文件复制到文件系统的某个目录下(本文示例为/root),然后擦除掉对
应分区中的旧固件,再分别使用 nandwrite 命令将新的固件写到对应的分区中。
4.1 更新内核:
root@fl-imx6ull:~# flash_erase /dev/mtd4 0 0
Erasing 128 Kibyte @ 7e0000 -- 100 % complete
root@fl-imx6ull:~# nandwrite -p /dev/mtd4 /run/media/sda1/target/zImage
Writing data to block 0 at offset 0x0
Writing data to block 1 at offset 0x20000
Writing data to block 2 at offset 0x40000
…
4.2 更新 dtb:
root@fl-imx6ull:~# flash_erase /dev/mtd3 0 0
Erasing 128 Kibyte @ 2e0000 -- 100 % complete
root@fl-imx6ull:~# nandwrite -p /dev/mtd3
/run/media/sda1/target/imx6ull-S-gpmi-800x480cr7.dtb
Writing data to block 0 at offset 0x0
4.3 更新 logo:
root@fl-imx6ull:~# flash_erase /dev/mtd1 0 0
Erasing 128 Kibyte @ 1e0000 -- 100 % complete
root@fl-imx6ull:~# nandwrite -p /dev/mtd1 /run/media/sda1/target/logo.bmp
Writing data to block 0 at offset 0x0
Writing data to block 1 at offset 0x20000
Writing data to block 2 at offset 0x40000
五.can功能的验证
- 将板子的can1与can2的H和H相连,L和L相连
- ifconfig -a 可以查看所有can节点
4.1 设置can服务
root@fl-imx6ull:~# ifconfig can0 down
root@fl-imx6ull:~# ip link set can0 up type can bitrate 125000 triple-sampling on
flexcan 2090000.can can0: writing ctrl=0x0e312085
IPv6: ADDRCONF(NETDEV_CHANGE): can0: link becomes ready
root@fl-imx6ull:~# ifconfig can0 up
- 设置 can0 的 can 设备波特率为 125000
4.2 can接收数据
- 设置can1为接收状态
root@fl-imx6ull:~# root@fl-imx6ull:~# candump can1 &
[1] 755
- 使用上位机发送数据
- 开发板打印信息
root@fl-imx6ull:~# can1 001 [8] 00 01 02 03 04 05 06 07
4.3 使用can发送数据
- 设置can0为发送状态
root@fl-imx6ull:~# cansend can0 123#123456789123456789
- 使用上位机接收数据