3.1 添加文件
当前版本的 uboot 中肯定是已经没有 S3C24x0 这种老芯片了,我们需要找一份稍为 old 一点的 u-boot 将 s3c24x0 有关的文件都添加进来。
文件或目录 | 作用 |
./arch/arm/cpu/arm920t/s3c24x0 | s3c24x0 芯片相关的启动代码 |
./arch/arm/include/asm/arch-s3c24x0 | s3c24x0 系列寄存器等定义 |
./board/samsung/smdk2410 | 开发板的初始化文件,之后会以这个文件为模板修改为 2440 |
./configs/smdk2410_defconfig | 开发板配置文件,之后会进行修改,生成 2440的默认配置文件 |
./drivers/gpio/s3c2440_gpio.c | 2440 的 gpio 驱动文件 |
./drivers/i2c/s3c24x0_i2c.c ./drivers/i2c/s3c24x0_i2c.h |
i2c 的驱动文件,暂时不需要移植过去,当前u-boot 中存在,不过代码有差异 |
./drivers/mmc/s3c_sdi.c | S3C24xx SD/MMC 驱动 |
./drivers/mtd/nand/s3c2410_nand.c | s3c2410 的 nand 驱动,移植到 ./drivers/mtd/nand/raw 目录下 |
./drivers/rtc/s3c24x0_rtc.c | rtc 驱动,已经有了 |
./drivers/serial/serial_s3c24x0.c | 串口驱动,先移植进来 |
./drivers/usb/gadget/s3c_udc_otg.c ./drivers/usb/gadget/s3c_udc_phy.c ./drivers/usb/gadget/s3c_udc_xfer_dma.c ./drivers/usb/host/ohci-s3c24xx.c ./drivers/usb/host/ohci-s3c24xx.h |
USB 驱动,先移植进来 |
./include/configs/smdk2410.h |
板载配置文件 |
当前所添加的文件就是这些。下面进行开发板的添加。
3.2 添加开发板
3.2.1 修改板载文件
cd board/samsung/
mv smdk2410 jz2440
cd jz2440
mv smdk2410.c jz2440.c
board/samsung/jz2440.c 修改
在 arch/arm/include/asm/mach-types.h 中给我们定义了一个s3c2440 和 SMDK2440 的宏,这两个宏是板子的 ID,用这个两个宏都可以
将 MACH_TYPE_SMDK2410 改为 MACH_TYPE_JZ2440,同时在此文件中定义一个宏 MACH_TYPE_JZ2440。
3.2.2 添加板载编译配置
修改 board/samsung 下的 Makefile 和 Kconfig:
修改完此处后,需要在 arch/arm/Kconfig 中导入这个块板:
修改完后,执行一下 make smdk2410_defconfig,然后执行 make menuconfig 查看是否可以找到板子,并修改相关配置:
- Architecture select:架构选择,选择为 ARM architecture,即 ARM 架构
- ARM architecture:arm 架构相关特性选择
- Support for ARM SMC Calling Convention:关掉
- ARM Generic Timer support:通用定时器支持,支持 armv8 和 armv7 以上,2440 不支持,关掉
- ARM64 system support AArch32 execution state:此项关掉,我们不支持 64 位,所以不需要。
- Target select:目标选择,选择我们的开发板,暂时没有我们的板子选择,可以查看 samsung 的板子都在哪里定义,然后添加进去。
- Use PSCI for reset and shutdown:armv8 架构支持,不需要,关掉。关掉这个后,可以对 Support for ARM SMC Calling Convention 选项进行操作,同样关掉。
- General setup:通用选择
- Automatically append version information to the version string:在版本字符串后,自动追加版本信息,不需要,关掉
- delay in seconds before automatically booting:设置为 5
- Command line interface:命令行接口设置
- Shell prompt:改为 s3c24x0 ==>
暂时先配置这些,当前的问题是找不到板子,继续修改 arch/arm/Kconfig,在目标集合中添加配置:
在执行 make menuconfig:
修改根目录下的 Makefile,添加交叉编译工具链:
./include/configs/smdk2410.h 修改,这是特定板载配置文件,非 make menuconfig 中的通用配置
mv smdk2410.h jz2440.h
修改 jz2440.h 文件,将带有 2410 字样的修改为 2440.
3.2.3 修改芯片设置
./arch/arm/cpu/arm920t/Makefile
3.2.4 make menuconfig 裁剪
当前编译肯定有不少错误,所以先在 menuconfig 中做下裁剪,删除掉不需要的内容:
- General setup:
- Configure standard U-Boot features:此特性是专家级用户使用的,关掉
- 64bit physical address support:64位的物理地址,2440 最大也支持 32位,关掉
- Boot images:
- Enable arch_fixup_memory_banks() call:在操作系统启动之前启用FDT内存映射同步。此功能可用于引导具有不同内存设置的操作系统,其中部分内存位置应用于不同的用途。暂时不需要,关掉。
- Command line interface:
- Boot commands:关掉下面几项
- Support booting NetBSD (non-EFI) loader images
- Support booting Plan9 OS images
- Support booting RTEMS OS images
- Support booting VxWorks OS images
- Flattened Device Tree utility commands
- imxtract
- Compression commands :压缩命令,都关掉
- Device access commands:dm - Access to driver model information 这个关掉
- Shell scripting commands:shell 脚本命令,暂时不需要,关掉
- Network commands:先关掉,移植网络的时候再开启
- Boot commands:关掉下面几项
- Device Tree Control:设备树,里面都不开启,暂时不用
- Networking support:网络支持,暂时不用,关掉
- Device Drivers:
- Generic Driver Options:
- Enable Driver Model:使能 DM 驱动模型,关掉
- Enable Firmware driver support:固件驱动支持,用不上,先关掉
- MMC Host controller Support:不需要,关掉
- Generic Driver Options:
- Library routines:
- Compression Support:压缩支持,都关掉
- Enable the FDT library:使能 FDT 库,设备树相关,关闭掉
3.2.5 jz2440.c 裁剪
USB 的先注释掉
RTC 关掉:
命令行配置先关闭:
压缩方式:
文件系统:
3.3 编译测试修改
3.3.1 invalid for SYS_TEXT_BASE
SYS_TEXT_BASE(链接基地址)没有配置。既然存在于 .config 中,那么就可以通过 make menuconfig 进行配置。
Boot images-->Text Base:设置为 0x00000000
同时注释掉 include/configs/jz2440.h 中的 CONFIG_SYS_TEXT_BASE
3.3.2 时钟获取函数没有
这三个函数被定义在 arch/arm/cpu/arm920t/s3c24x0/speed.c 中,但是当前工程版本中未包含这几个函数,而且搜索发现这几个函数在很多地方都有用,我们将这几个函数定义在 include/common.h 中,以前的版本也是在这里定义的。
3.3.3 重复配置定义
多是一些配置宏重复定义,主要是 include/configs/jz2440.h 与 .config 中的定义有重复,注释掉 jz2440.h 中的重复定义,保留 .config 中的定义。同时 .config 中是否开启配置如下:
- CONFIG_BOOTP_BOOTPATH:从 BOOTP/DHCP 服务器上请求并存储 “rootpath”,关掉。
- CONFIG_BOOTP_GATEWAY:从 BOOTP/DHCP 服务器上请求并存储 “gatawayip”,关掉
- CONFIG_BOOTP_HOSTNAME:从 BOOTP/DHCP 服务器上请求并存储 “hostname”,该名称可以用本地域名限定,也可以不限定,关掉
- CONFIG_CMD_ELF:从内存启动 ELF/vxWorks 映像,配置保留开启
- CONFIG_CMDLINE_EDITING:为交互式命令行输入操作启用编辑和历史记录功能,很显然要用
- CONFIG_SYS_LONGHELP:在需要包含长帮助消息时定义。内存不足时不要设置此选项。保留
- CONFIG_DISPLAY_CPUINFO:当U-Boot启动时,显示有关U-Boot正在运行的CPU的信息。调用函数print_cpuinfo()来执行此操作。保留
- CONFIG_LZMA:压缩和解压缩方式,不需要,关掉此项需要先关掉 CONFIG_CMD_LZMADEC(Command line interface-->Compression commands-->lzmadec),在关掉 CONFIG_LZMA(Library routines-->Compression Support-->Enable LZMA decompression support)
- CONFIG_NR_DRAM_BANKS:内存数量,General setup->Number of DRAM banks,设置为1,我们只有一个 SDRAM
- CONFIG_ENV_SIZE:环境变量存储区的大小,Environment->Environment Size 设置 0x10000
3.3.4 串口问题
serial_s3c24x0.c 文件是移植进来的,还未做适配。
修改 drivers/serial/Makefile
修改 drivers/serial/Kconfig,文件的最后加上:
make menuconfig:
- Serial drivers
- Default baudrate:波特率,设置为 115200
- Specify the port number used for console:指定串口为终端
- UART used for console:为终端的串口号,设置为 1
- s3c24x0 serial:驱动,选中
删除掉 jz2440.h 中串口的设置
编译后出问题:
查看代码后发现是 CONFIG_SERIAL1 没有了,代码依赖这个,而配置的 UART user for console 是 CONFIG_CONS_INDEX,所以要修改下 serial_s3c24x0.c 代码:
3.3.5 未定义的函数
3.3.5.1 get_timer_masked
上面这个问题,其实都报的是一个问题,就是函数未申明,在 include/common.h 中申明此函数。
3.3.5.2 hang()
头文件未包含,包含一下 hang.h 即可。
3.3.5.3 MACH_TYPE_SMDK2440
在 jz2440.c 中,包含头文件 asm/mach-types.h
3.3.5.4 cache 函数未定义
函数存在于 arch/arm/lib/cache-cp15.c 中,很显然是定义了但是未申明,这个文件同样包含 include/common.h 文件,可以将申明放在这里。
修改 include/common.h 文件:
其他相似的 cache 错误如下:
链接出错,可能是没有编译文件:如下
CONFIG_SYS_ARM_CACHE_CP15 没有配置,.config 中如下:
ARM architecture-->CP15 based cache enabling support 打开。
3.3.5.5 flash_info_t 找不到
需要包含头文件 flash.h。
3.3.5.6 <asm/ppc.h> 的包含
这个问题是因为我们开了宏 CONFIG_CMD_REGINFO 而出来的,关掉这个配置即可。
.config 中无此配置宏,这个宏在 jz2440.h 中配置,注释掉。
3.3.5.7 ubi 的问题
当前不打算开启 ubi,所以需要关掉相关配置宏。
CONFIG_CMD_UBI 和 CONFIG_CMD_UBIFS 在 jz2440.c 中被配置,注释掉。
3.3.5.8 flash 的问题
cfi 不知道是否支持,先在 jz2440.h 屏蔽掉此项编译 CONFIG_FLASH_CFI_DRIVER
在jz2440.h 中屏蔽掉 CONFIG_ENV_IS_IN_FLASH
3.3.6 BOARDDIR
板子的路径错误了。搜索可以知道对应的是 CONFIG_BOARDDIR 这个配置宏,在看看 BOARDDIR 是如何取的:
对应 VENDOR 和 BOARD 这两个参数,上面添加 3.3.2 中对 board/samsung 下的 Kconfig 要修改,因为板子放在 samsung 目录下。