u-boot へのボード情報の追加
blog
2019-4-3 18:39 JST

u-boot へのボード情報の追加

boards.cfg に追加する。追加したのち、vi で py のスクリプトで整形する。

# Status, Arch, CPU:SPLCPU, SoC, Vendor, Board name, Target, Options, Maintainers
Active  arm         armv7          mx6         sinby      mx6q-sinby    mx6q-sinby 
mx6q-sinby:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg,MX6Q 
                                                     Ryos Suzuki
:%!tools/reformat.py -i -d '-' -s 8

実際のボード固有の情報は board/sinby/mx6q-sinby となる。(上記のボード情報の Vendor と Board name がすなわちディレクトリ名となる)幾つかの関数を mx6q-sinby.c として用意する。

int dram_init(void)
int board_mmc_getcd(struct mmc *mmc)
int board_mmc_init(bd_t *bis)
int board_phy_config(struct phy_device *phydev)
int board_video_skip(void)
int overwrite_console(void)
int board_eth_init(bd_t *bis)
int board_early_init_f(void)
int board_init(void)
int board_late_init(void)
int checkboard(void)

configs の設定

必要な情報は include/confgs/mx6q-sinby.h に書く。また、複数ボードに共通な情報は mx6q-common-sinby.h などをつくって共通化する。

#ifndef __MX6Q_SINBY_CONFIG_H
#define __MX6Q_SINBY_CONFIG_H

#include <asm/arch/imx-regs.h>
#include <asm/imx-common/gpio.h>

#define CONFIG_MACH_TYPE        5000
#define CONFIG_MXC_UART_BASE    UART1_BASE
#define CONFIG_CONSOLE_DEV              "ttymxc0"
#define CONFIG_MMCROOT                  "/dev/mmcblk1p2"
#define CONFIG_DEFAULT_FDT_FILE "imx6q-sinby.dtb"
#define CONFIG_VIDEO_MODE "video=mxcfb0:dev=ldb,LDB-WSVGA,if=RGB24 ldb=sin0"
#define PHYS_SDRAM_SIZE         (1u * 1024 * 1024 * 1024)

#define CONFIG_STANDALONE_LOAD_ADDR 0x10008000

#include "mx6-sinby-common.h"

#define CONFIG_SYS_FSL_USDHC_NUM        2
#if defined(CONFIG_ENV_IS_IN_MMC)
#define CONFIG_SYS_MMC_ENV_DEV          1       /* SDHC3 */
#endif

/* Framebuffer */
#define CONFIG_VIDEO
#define CONFIG_VIDEO_IPUV3
#define CONFIG_CFB_CONSOLE
#define CONFIG_VGA_AS_SINGLE_DEVICE
#define CONFIG_SYS_CONSOLE_IS_IN_ENV
#define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
#define CONFIG_VIDEO_BMP_RLE8
#define CONFIG_SPLASH_SCREEN
#define CONFIG_SPLASH_SCREEN_ALIGN
#define CONFIG_BMP_16BPP
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_IPUV3_CLK 260000000

#endif

ここでは共通ファイルの中で設定したが、次のCONFIG_EXTRA_ENV_SETTINGS やCONFIG_BOOTCOMMAND が調整項目として重要になるでしょう。特に、Linux を立ち上げるのに必要な rootfs や console などの設定をここで詳細に書くことが出来ます。

#define CONFIG_EXTRA_ENV_SETTINGS 
        "script=boot.scr0" 
        "uimage=uImage0" 
        "uboot=u-boot.imx0" 
        "fdt_file=" CONFIG_DEFAULT_FDT_FILE "0" 
        "fdt_addr=0x180000000" 
        "boot_fdt=try0" 
        "ip_dyn=yes0" 
        "console=" CONFIG_CONSOLE_DEV "0" 
        "fdt_high=0xffffffff0"   
        "initrd_high=0xffffffff0" 
        "mmcdev=10" 
        "mmcpart=10" 
        "mmcroot=" CONFIG_MMCROOT " rootwait rw0" 
        "update_sd_firmware=" 
                "if test ${ip_dyn} = yes; then " 
                        "setenv get_cmd dhcp; " 
                "else " 
                        "setenv get_cmd tftp; " 
                "fi; " 
<中略>
#define CONFIG_BOOTCOMMAND 
        "mmc dev ${mmcdev};" 
        "if mmc rescan; then " 
                "if run loadbootscript; then " 
                "run bootscript; " 
                "else " 
                        "if run loaduimage; then " 
                                "run mmcboot; " 
                        "else run netboot; " 
                        "fi; " 
                "fi; " 
        "else run netboot; fi"

u-boot の MX6 の特殊事情

MX6 では次に掲げる get_cpu_rev(/arch/arm/cpu/armv7/mx6/soc.c) で type を決定しています。u-boot ではご丁寧にハードウェアから情報を取ってきた後に、MXC_CPU_MX6DL (Dual Processor) ならSCU からプロセッサー数を取ってきてプロセッサー数が1なら、わざわざ MXC_CPU_MX6SOLO なるものを入れています。この定義は 0x62 なのですが、MXC_CPU_MX6DL の 0x61 がFreescale の使用として決められている値に対し、勝手に u-boot が設定している"それらしい"値になっています。Linux でも似たような判定はしているのですが、そのような勝手な拡張はしていません。ちょっと、混乱するところなので注意が必要です。

u32 get_cpu_rev(void)
{
        struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
        u32 reg = readl(&anatop->digprog_sololite);
        u32 type = ((reg >> 16) & 0xff);

        if (type != MXC_CPU_MX6SL) {
                reg = readl(&anatop->digprog);
                type = ((reg >> 16) & 0xff);
                if (type == MXC_CPU_MX6DL) {
                        struct scu_regs *scu = (struct scu_regs *)SCU_BASE_ADDR;
                        u32 cfg = readl(&scu->config) & 3;

                        if (!cfg)
                                type = MXC_CPU_MX6SOLO;
                }
        }
        reg &= 0xff;            /* mx6 silicon revision */
        return (type << 12) | (reg + 0x10);
}
#define MXC_CPU_MX51            0x51
#define MXC_CPU_MX53            0x53
#define MXC_CPU_MX6SL           0x60
#define MXC_CPU_MX6DL           0x61
#define MXC_CPU_MX6SOLO         0x62
#define MXC_CPU_MX6Q            0x63