本文主要描述在EVB335X-II以Device Tree的方式移植新TIAM335X系列最新的linux-3.14.43版本内核以及移植Debian文件系统的过程及遇到的一些问题。整个Device Tree牵涉面比较广,即增加了新的用于描述设备硬件信息的文本格式(即.dts文件),又增加
了编译这一文本的工具,同时Bootloader也需要支持将编译后的Device Tree传递给Linux
内核。以下是修改步骤:
一、修改uboot,支持Device Tree
EVB335X-II在linux-3.2版本内核移植的时候已经有uboot,因此只需在该uboot上增加Device Tree支持即可,以下是修改步骤:
1、修改include/configs/com335x.件,增加支持DT的宏定义:
/* Flattened Device Tree */
#define CONFIG_OF_LIBFDT
2、修改uboot启动参数,增加dtb文件的加载和启动(由于目前只是移植EMMC版本的EVB335X-II,因此只需修改EMMC的启动参数即可,大概在405行),修改如下:
#elif defined(CONFIG_EMMC_BOOT)
#define CONFIG_BOOTCOMMAND \
"run mmcboot;"
#define CONFIG_EXTRA_ENV_SETTINGS \
"lcdtype=AUO_AT070TN94\0" \
"console=ttyO0,115200n8\0" \
"mmcroot=/dev/mmcblk0p2 rw\0" \
"mmcrootfstype=ext4 rootwait\0" \
"mmcargs=setenv bootargs console=${console} noinitrd root=${mmcroot} rootfstype=${mmcrootfstype} lcdtype=${lcdtype} consoleblank=0\0" \
"mmcdev=" MMCDEV "\0" \
"loadaddr=0x81000000\0" \
"dtbfile=evb335x-ii-emmc.dtb\0" \
"\0" \
"bootpart=" BOOTPART "\0" \
"loadbootenv=load mmc ${mmcdev} ${loadaddr} ${bootenv}\0" \
"importbootenv=echo Importing environment from mmc ...; " \
"env import -t $loadaddr ${filesize}\0" \
"loadaddr-dtb=0x82000000\0" \
"loadimage=load mmc ${bootpart} ${loadaddr} uImage\0" \
"loaddtb=load mmc ${bootpart} ${loadaddr-dtb} ${dtbfile}\0" \
"mmcboot=mmc dev ${mmcdev}; " \
"if mmc rescan; then " \
"echo SD/MMC found on device ${mmcdev};" \
"if run loadbootenv; then " \
"echo Loaded environment from ${bootenv};" \
"run importbootenv;" \
"fi;" \
"run mmcargs;" \
"if run loadimage; then " \
"run loaddtb;" \
"bootm ${loadaddr} - ${loadaddr-dtb};" \
"fi;" \
"fi; \0"
#endif
以上,红为修改部分。修改完成后,重新编译即可。
二、移植内核
下载内核源码,进入TI:
software-dl.ti/sitara_linux/esd/processor-sdk/PROCESSOR-SDK-LINUX-AM335
X/latest/index_FDS.html
下载am335x-evm-sdk-src-01.00.00.文件,解压该文件后,在当前目录下生成
board-support目录,进入内核源码目录
board-support/linux-3.14.43+gitAUTOINC+875c69b2c3-g875c69b,进行以下步骤:
1、内核配置和编译
先调入TI给AM335X_EVM提供的config文件tisdk_am335x-evm_defconfig(该配置文
件与COM335X核心板最合适,也可使用omap2plus_defconfig,但需改动的配置较多),这
样很多配置就可以使用它的,然后在此基础上增加或裁减配置。
#make ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/bin/arm-li
nux-gnueabihf- tisdk_am335x-evm_defconfig
进入menuconfig,进行配置修改:
#make ARCH=arm menuconfig
内核配置注意事项:
a、首先要修改的是串口,tisdk_am335x-evm_defconfig里的console串口(即调试串口)为
8250的扩展串口,但EVB335X-II没有该扩展串口,因此需要取消该项配置,其console串
口为CPU自带串口,配置选项为OMAP serial port:
Device Drivers --->
Character devices --->
Serial drivers --->
< > 8250/16550 and compatible serial support
.........
<*> OMAP serial port support
[*] Console on OMAP serial port
如果不做修改,系统启动后会出现can't open /dev/ttyO0: No such file or directory的提示,
无法使用调试串口。
b、修改USB配置,原配置里的USB不能使用,修改配置如下:
Device Drivers --->
[*] USB support --->
[*] OTG support
.............
<*> Inventra Highspeed Dual Role Controller (TI, ADI, ...)
MUSB Mode Selection (Dual Role mode) --->
<*> Platform Glue Layer (TI DSPS platforms) --->
MUSB DMA mode (TI CPPI 4.1 (AM335x)) --->
需要注意的是,Platform Glue Layer必须选为TI DSPS platforms,否则USB无法使用。
c、修改声卡配置,原配置为模块,现将其配置进内核:
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> SoC Audio for Texas Instruments chips using eDMA
(AM33XX/43XX)
-*- Multichannel Audio Serial Port (McASP) support
<*> SoC Audio for the AM33XX chip based boards
-*- SoC Audio for the Texas Instruments OMAP chips
CODEC drivers --->
-*- Texas Instruments TLV320AIC31xx CODECs
-*- Texas Instruments TLV320AIC3x CODECs
其它功能的具体配置这里不一一表述,具体参考evb335x-ii-demo_config。
编译内核:
#make ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/bin/arm-li
nux-gnueabihf- LOADADDR=0x80008000 uImage
注意:加上LOADADDR参数,否则会出以下错误:
multiple (or no) load addresses:
This is incompatible with uImages
Specify LOADADDR on the commandline to build an uImage
2、dts文件的制作和编译
dts文件存放位置为arch/arm/boot/dts/目录。由于evb335x-ii的设计与evm335x接近,
因此可以通过修改am335x-evm.dts文件来制作适合evb335x-ii的dts文件。具体修改请参考
arch/arm/boot/dts/evb335x-ii-emmc.dts文件。
编译dts文件:
#make ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/bin/arm-li
nux-gnueabihf-evb335x-ii-emmc.dtb
编译完成后,在arch/arm/boot/dts/目录下生成evb335x-ii-emmc.dtb文件。
dts文件制作注意事项:
a、mpu电压选择,com335x核心板的mpu电压由tps65217的vdcdc2通道提供,因此,在
dts文件/节点下,修改cpus节点为:
cpus {
cpu@0 {
cpu0-supply = <&dcdc2_reg>; /* mpu supply 1.1V */
};
};
b、memory节点编写说明:
memory {
device_type = "memory";
reg = <0x80000000 0x20000000>; /* 512 MB */
};
其中,reg的第一个参数0x80000000为SDRAM起始地址,在uboot中定义:#define CONFIG_SYS_SDRAM_BASE 0x80000000(在uboot源码的include/configs/com335x.件中);reg的第二个参数为SDRAM大小(单位是bit),512M为0x20000000,若使用的SDRAM为256M,则该数值应为0x10000000。
c、关于引脚定义pinmux的编写说明
以user led引脚定义为例,在EVB335X-II中,用户灯使用gpio3_16脚,则其引脚定义为:
user_leds_s0: user_leds_s0 {
pinctrl-single,pins = <
0x198 (PIN_OUTPUT | MUX_MODE7) /* mcasp0_axr0.gpio3_16 */ >;
};
AM335x的IO口可以分配不同的外设功能,设置引脚的pinmux功能,在AM335x中被称为Control Module,它的起始地址为0x44E10000。
从0x44E10000开始偏移0x800的地址,是各种各样的conf寄存器,具体请参考AM335X 的TRM.pdf章节9.3.1 CONTROL_MODULE Registers的Table 9-7. CONTROL_MODULE REGISTERS说明。
以上面的user_leds_s0为例,0x198表示地址为0x44E10998的conf寄存器,它的名称为conf_mcasp0_axr0,使用的是gpio功能,因此为MUX_MODE7(功能模式的选择请参考AM335X的datasheet);不需要上拉或者下拉电阻,因此设置为PIN_OUTPUT。PIN_OUTPUT 定义在include/dt-bindings/pinctrl/am33xx.h中,如果要选择上拉,则为PIN_OUTPUT_PULLUP;如果要选择下拉,则为PIN_OUTPUT_PULLDOWN。
3、其它注意事项
1、看门狗芯片isl88013驱动移植
evb335x-ii使用了isl88013作为外部看门狗,但linux内核中没有该芯片的驱动支持,因此要手动将其驱动文件添加到内核源码中,驱动文件由本公司提供,光盘中的内核源码已包含(两个文件,分别是驱动文件drivers/watchdog/isl88013.c和头文件include/linux/wdt_isl88013.h),直接从里面复制出来即可。下是移植步骤:
a、将isl88013.c和wdt_isl88013.h分别复制到上述相应目录下;
b、打开drivers/watchdog/Kconfig文件,添加以下内容:
config ISL88013_WATCHDOG
bool "ISL88013 watchdog"
default n
help
ISL88013 watchdog which has one FEED pin.""
c、打开drivers/watchdog/Makefile文件,在末尾添加以下内容:
obj-$(CONFIG_ISL88013_WATCHDOG) += isl88013.o
d、在menuconfig中,去掉OMAP Watchdog(CPU内部看门狗)的支持,添加isl88013支持:
Device Drivers --->
[*] Watchdog Timer Support --->
[*] ISL88013 watchdog
< > OMAP Watchdog
e、打开evb335x-ii-emmc.dts文件,在/节点下增加isl88013的相应信息:
watchdog: watchdog {
pinctrl-names = "default";
pinctrl-0 = <&wdt_pins>;
compatible = "wdt,isl88013";
gpios = <&gpio3 15 GPIO_ACTIVE_LOW>;
};
在&am33xx_pinmux{}中增加isl88013的引脚定义:
wdt_pins:wdt_pins {
pinctrl-single,pins = <
0x194 (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* mcasp0_fsx.gpio3_15 */
>;
};
f、配置和dts文件修改完成后,重新编译内核和dts文件即可。
linux系统地址三、关于根文件系统
1、使buildroot制作的根文件系统
可以使用公司在evb335x上制作的根文件系统,但系统启动后出现一下问题:
[root@EVB335X user-led:red]# [ 62.406535] remoteproc0: failed to load am335x-pm-firmware.elf
[ 62.412919] remoteproc0: powering up wkup_m3
[ 62.433013] wkup_m3 44d00000.wkup_m3: rproc_boot failed
该问题的具体原因和解决办法尚未到,但不影响系统使用。另外,如果使用TI官方提供的开发套件下的根文件系统,则该问题不会出现。
2、移植Debian文件系统:
从网址:www.armhf/boards/beaglebone-black/#wheezy
下载debian-wheezy-7.5-rootfs-3.14.4.文件。下载完成后,用xz -d命令解压即可得到debian-wheezy-7.5-rootfs-3.14.4.1-bone-armhf.tar.文件,将该文件按照EMMC烧录说明烧写到EMMC即可。如果要使用BBB提供的Debian系统,请参考
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论