跟着原子哥的IMX6ULL驱动开发指南一步步移植u-boot,最后编译报错了。
经过一番查找/修改后总算是编译通过了(小有成就感)。
首先按照手册一步步走,中间任何一步都是和驱动开发指南一致的。当然了,我并没有直接拷贝手册上的,而是一个个字符敲出来的,并且没有敲错。
u-boot编译报错如下:
cmd/nvedit.c:56:3: 错误: #error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|SPI_FLASH|NVRAM|MMC|FAT|REMOTE|UBI|SATA} or CONFIG_ENV_IS_NOWHERE
# error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|\
^
scripts/Makefile.build:280: recipe for target 'cmd/nvedit.o' failed
make[1]: *** [cmd/nvedit.o] Error 1
Makefile:1199: recipe for target 'cmd' failed
make: *** [cmd] Error 2
经排查,定位到错误在mx6ull_alientek_emmc.h文件中
按照手册上的来(手册上852页,244行到255行之间有一个省略号,个人理解这个省略号是表示删除相应的部分),也就是说下面几行代码是被删掉了的
#ifdef CONFIG_SYS_BOOT_QSPI
#define CONFIG_FSL_QSPI
#define CONFIG_ENV_IS_IN_SPI_FLASH
#elif defined CONFIG_SYS_BOOT_NAND
#define CONFIG_SYS_USE_NAND
#define CONFIG_ENV_IS_IN_NAND
#else
#define CONFIG_FSL_QSPI
#define CONFIG_ENV_IS_IN_MMC
#endif
而上面的报错就是因为上面几行代码被删除掉了而报错的。更确切的说是 CONFIG_ENV_IS_IN_MMC 宏没有被定义而导致的。
那为什么没有定义这个宏会报错呢?继续往下看。手册853页第295行代码,错误的关键就在这行代码。因为上面那个宏没有被定义,所以环境变量的偏移量就没有被定义,从而导致编译报错了。
修改如下:
#ifdef CONFIG_SYS_BOOT_QSPI
#define CONFIG_FSL_QSPI
#define CONFIG_ENV_IS_IN_SPI_FLASH
#elif defined CONFIG_SYS_BOOT_NAND
#define CONFIG_SYS_USE_NAND
#define CONFIG_ENV_IS_IN_NAND
#else
#define CONFIG_FSL_QSPI
#define CONFIG_ENV_IS_IN_MMC
#endif
这几行代码不要删掉,因为CONFIG_SYS_BOOT_QSPI没有被定义,所以就定义了CONFIG_FSL_QSPI、 CONFIG_ENV_IS_IN_MMC两个宏,其中 CONFIG_ENV_IS_IN_MMC是我们所需要的,而CONFIG_FSL_QSPI是我不需要的(我买的是IMX6ULL-MINI开发板,不知道你们需不需要)。所以要加上 #undef CONFIG_FSL_QSPI。注意这里千万不能使用 “//”单行注释,否则会报另一种错误,血的教训,哎。
接下来修改的地方,这里应该说可改可不改,我是迫于强迫症就改了,哈哈万恶的强迫症,浪费了我人生中珍贵的一两秒时间。
(注:下面是将 CONFIG_ENV_SIZE 这个宏挪到 #if defined(CONFIG_ENV_IS_IN_MMC) 下面去了)
#if defined(CONFIG_ENV_IS_IN_MMC)
#define CONFIG_ENV_SIZE SZ_8K /* icode:环境变量大小,设置为8KB */
#define CONFIG_ENV_OFFSET (12 * SZ_64K) /* icode:环境变量偏移地址(相对于存储器的首地址):12 × 64KB */
#elif defined(CONFIG_ENV_IS_IN_SPI_FLASH)
#define CONFIG_ENV_OFFSET (768 * 1024) /* icode:环境变量偏移地址(相对于存储器的首地址):768 × 1024 */
#define CONFIG_ENV_SECT_SIZE (64 * 1024) /* icode:重新设置环境变量大小为64KB */
#define CONFIG_ENV_SPI_BUS CONFIG_SF_DEFAULT_BUS
#define CONFIG_ENV_SPI_CS CONFIG_SF_DEFAULT_CS
#define CONFIG_ENV_SPI_MODE CONFIG_SF_DEFAULT_MODE
#define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED
#elif defined(CONFIG_ENV_IS_IN_NAND)
#undef CONFIG_ENV_SIZE
#define CONFIG_ENV_OFFSET (60 << 20) /* icode:环境变量偏移地址(相对于存储器的首地址):60 << 20 = 60MB */
#define CONFIG_ENV_SECT_SIZE (128 << 10)
#define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE /* icode:重新设置环境变量大小为128KB */
#endif
最后编译结果:
Image Type: Freescale IMX Boot Image
Image Ver: 2 (i.MX53/6/7 compatible)
Mode: DCD
Data Size: 409600 Bytes = 400.00 kB = 0.39 MB
Load Address: 877ff420
Entry Point: 87800000
一切正常,万事大吉,顺顺利利,可以继续努力搞Linux移植去了。(此处加一个狂笑)
最后补上一个自己的精简版的uboot移植流程:(偷偷抄袭原子哥的驱动开发指南的【偷笑】)
1、u-boot 1.1、u-boot移植 1.1.1、u-boot源码获取 从NXP官方网站获取NXP官方开发板的u-boot,然后加以修改,使其适配自己的开发板。 1.1.2、u-boot编译 ①、在u-boot顶层Makefile中添加下面两行语句 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- ②、编译命令 makemx6ull_14x14_evk_emmc_defconfig makeV=1 -j8 1.1.3、u-boot下载测试 ①、将u-boot烧写到SD卡的命令 ../download.mxdownloadu-boot.bin /dev/sdb ②、在putty工具中查看u-boot打印的信息 ③、 1.2、在u-boot中添加自己的开发板 1.2.1、创建config文件 在uboot/configs目录下创建自己的开发板的config文件,命名为:mx6ull_alientek_emmc_defconfig。将NXP官方开发板的配置文件内容拷贝过来。官方文件名为:mx6ull_14x14_evk_emmc_defconfig。文件拷贝之后需要稍作修改才能使用。 1.2.2、创建开发板应用头文件 在uboot/configs目录下创建开发板头文件,命名为:mx6ull_alientek_emmc.h。 然后将官方的头文件内容拷贝过来,官方的头文件名为:mx6ullevk.h。拷贝之后需要做些修改才能使用 1.2.3、创建开发板对应的板级文件夹 ①、复制官方资料uboot/board/freescale/mx6ullevk文件夹,并在该目录下粘贴为mx6ull_alientek_emmc文件夹。 ②、修改其中的mx6ullevk.c文件的名字为mx6ull_alientek_emmc.c ③、修改Makefile文件 ④、修改imximage.cfg文件 ⑤、修改Kconfig文件 ⑥、修改MAINTAINERS文件 1.2.4、修改u-boot图形界面配置文件 图形配置文件Kconfig位于:uboot/arch/arm/cpu/armv7/mx6/Kconfig 1.2.5、使用新添加的板子配置编译uboot 编译命令: makedistclean makemx6ull_alientek_emmc_defconfig makeV=1 -j8
|