u-boot移植ノート


u-bootバージョン:u-boot-2012.04.01
PCマシンシステム:ubuntu 12.04.5
開発ボード:TQ 2404
1.単板目次の新規作成
board/samsung/ディレクトリに入り、cp-rf smdk 2410 smdk 2440を実行
include/configsディレクトリに入り、cp smdk 2410を実行する.h smdk2440.h
修正するcfgファイル、2440の単板情報を追加
make smdk 2440_の実行コンフィギュレーション
makeをコンパイルする
2.分析ソース
start.Sファイルで分析を開始します.
フェーズ1:
start_code -> cpu_init_crit -> call_board_init_f -> board_init_f(board_init_fはarch/arm/libディレクトリの下)
1.システムクロックを修正し、MPLLの設定をstart.Sでboardをキャンセルinit_f -> init_sequence[] -> board_early_init_fでのMPLLの初期化
2.シリアルポートのボーレートをboard_で表示init_f -> init_sequence[] -> serial_init -> serial_init_dev(UART_NR) -> _serial_setbrg -> 
               get_PCLK -> get_HCLK->では、「CONFIG_S 3 C 2440」は定義されていません
include/configs/smdk 2440.hでは、「CONFIG_S 3 C 440」を定義する
3.コンパイル時にエラーを発見し、どのファイルでエラーが発生したかを探し出し、そのファイルに対応するMakefileに対応するマクロを探し出し、smdk 2440に行く.h対応するマクロを注釈する
include/configs/smdk 2440.hで、とりあえずCONFIGを外してCMD_NAND,コンパイル時のnandに関するエラーを回避できる
4.nand_をサポートFlash起動
start.Sにnand_を追加Flashの初期化、nand_init_ll
include/configs/smdk 2440.hで、CONFIG_をSYS_TEXT_BASEを0 x 33 f 80000に変更し、プログラムのリンクアドレスを強制指定する
copy_の実行code_to_sdram、コードをsdramに再配置
実行clear_bss,清BSSセグメント,(BSSセグメントは初期値が0のグローバル変数の格納アドレスである)
最後にldr pc,=call_を実行するboard_init_f,直接sdramにジャンプしてコードを実行する
5.board_init_f内の再配置関数relocate_code(addr_sp,id,addr)はstart.Sの中で再配置が行われています
6.board_init_f奥のaddr-=gd->mon_len; addr &= ~(4096 - 1);しゃへい
変更:addr=CONFIG_SYS_TEXT_BASE;
7.start.Sの中の元の再配置と清bssセグメントのこの2つの部分のコードは取り除きます
フェーズ2:
第2段階の開始コードarch/arm/lib/board.cのvoid board_init_r(gd_t*id,ulong dest_addr)関数
まだstart.Sファイルには、
1.boardで直接init_f(ボードレベル初期化関数)以下、第2段階にジャンプ
2.board_init_r関数は、2つのパラメータが必要です.
idはboardからinit_fの中で取得してboard_に直接譲りますinit_f関数はidを返し、include/commonを変更する.hのboard_init_f,
元のboardをinit_f「unsigned int board_init_f(ulong);
 dest_addrはu-bootのリンクアドレスで、直接_に指定されています.TEXT_BASE
3.修正/board/samsung/smdk 2440/里的Makefile,把init.cプロジェクトに追加コンパイル
COBJSを
:= smdk2410.o 
変更後:
COBJS
:= smdk2410.o init.o
4.リンクスクリプトを修正しstart.S,init.c,lowlevel_init.Sなどのファイルは、コードの一番前に置く
リンクスクリプトはarch/arm/cpu/u-boot.lds
つかむ
.text :
{
    __image_copy_start = .;
    CPUDIR/start.o (.text)
    *(.text)
}
が次のように変更されました.
.text :
{
    __image_copy_start = .;
    CPUDIR/start.o (.text)
    /board/samsung/smdk2440/libsmdk2440.o (.text)
    *(.text)
}

libsmdk2440.o/board/samsung/smdk 2440/ディレクトリ下のファイルコンパイルされたライブラリ
5.arch/arm/configを修正する.mkファイル、「-pie」オプションを削除し、LDFLAGS_u-boot+=-pieがpieをブロックするオプションとは、プログラムがリンクをコンパイルするときに、いくつかのアドレス情報(例えば「*(rel*)、*(dynsym*」)をu-bootにコンパイルすることである.bin、これによりu-bootがコンパイルしたファイルは4 k/******よりはるかに大きくnandflash*****/6をサポートします.include/configs/smdk 2440を変更する.h,CONFIG_をCMD_NANDはnandflashがdrivers/mtd/nand/s 3 c 2410_をサポートするように再定義した.nand.c drivers/mtd/nand/s 3 c 2440_にコピーnand.c drivers/mtd/nand/Makefileを修正し、s 3 c 2440_をコンパイルするnand.c,MakefileにCOBJS-$(CONFIG_NAND_S 3 C 2440)+=s 3 c 2440_を追加nand.o smdk 2440.hでnandflash構成について、#define CONFIG_を追加NAND_S3C2440 #define CONFIG_SYS_S3C2440_NAND_HWECC分析board.cファイルのnand_Init()関数、解析nand_init_chip(i)関数解析board_nand_Init(nand)関数、分析nand_scan(mtd,maxchips)関数board_nand_Init(nand)関数は下位操作関数の初期化nand_を行ったscan(mtd,maxchips)関数はboard_に使用されます.nand_Init(nand)関数登録の最下位操作関数nand_scan_ident nand_set_defaults nand_command()/この関数を解析し、この関数は最終的にchip->cmd_を呼び出します.ctrl(mtd, readcmd, ctrl) chip->cmd_ctrl(mtd,readcmd,ctrl)という関数はboard_nand_Initにはs 3 c 2440と登録されていますhwcontrolはs 3 c 2440_hwcontrol()関数データ/コマンドの読み書き操作を完了する/**************DM 9000 NIC**************/smdk 2440でサポートする.hファイルでは、cs 8900の関連部分をマスクし、以下に変更します.
#if 0
#define CONFIG_CS8900		/* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE	0x19000300
#define CONFIG_CS8900_BUS16	/* the Linux driver does accesses as shorts */
#else
#define CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE              0x20000000
#define DM9000_IO                       CONFIG_DM9000_BASE
#define DM9000_DATA                     (CONFIG_DM9000_BASE + 4)
#endif

DM9000_DATAとはDM 9000 NICのCMDピンのことで、原理図にはLADDR 2が接続されており、DM 9000に送るコマンドかデータDM 9000_かを区別するために使用されている.IOとはDM 9000に送るデータ値のことです
boardでcファイル、分析関数
board_init_r
eth_initialize
board_eth_Init//この関数でDM 9000を初期化
smdk 2440でhファイルにipアドレスとNICに関する構成を追加します.以下のようにします.
#define CONFIG_NETMASK   255.255.255.0
#define CONFIG_IPADDR    192.168.1.59
#define CONFIG_SERVERIP  192.168.1.61
#define CONFIG_ETHADDR      00:0c:29:4d:e4:f4

/*****裁断u-boot*************/
common/env_common.cでdefault_Environment配列は環境変数です
smdk 2440を修正する.hファイル、usb、fs、rtc、dateなどの不要な構成項目を削除する
u-bootを設定し、saveコマンドをサポートして環境変数を保存します.
u-bootでsaveコマンドを実行してnandflashに環境変数を保存するとcommon/env_が実行されますnand.cのsaveenv(void)関数は、
commonディレクトリを見るとCOBJS-$(CONFIG_ENV_IS_IN_NAND)+=env_nand.o
envをコンパイルすることを示します.nand.c、smdk 2440である必要がある.hファイルにCONFIGを定義するENV_IS_IN_NAND
smdk 2440でhファイルに以下の内容を追加します.
#define CONFIG_ENV_OFFSET       0x40000   /*  nandflash  */
#define CONFIG_ENV_SIZE         0x20000   /*   */
#define CONFIG_ENV_RANGE        CONFIG_ENV_SIZE   /*   */

u-bootを設定し、mtdpartsコマンドをサポートするパーティションを追加します.
u-bootコードでmtdpartsを検索すると、cmd_をコンパイルする必要があることがわかりました.mtdparts.c,commonディレクトリの下のMakefileを表示する
smdk 2440で必要です.h内定義CONFIG_CMD_MTDPARTS 
次の内容を追加します.
#define CONFIG_CMD_MTDPARTS     /*  mtdparts  */
#define CONFIG_MTD_DEVICE
#define MTDIDS_DEFAULT   "nand0=tq2440-0"  /*   */
#define MTDPARTS_DEFAULT   "mtdparts=tq2440-0:256k(u-boot),"\
      "128k(params),"\
      "2m(kernel),"\
      "-(rootfs)"\
      
      
cmd_mtdparts.cファイルにはmtdpartsがあります.Init(void)関数は、パーティションを初期化するために使用されます.
boardでcファイルで、初期化が完了したらmain_に入りますloopの前に、mtdparts defaultコマンドを実行してパーティションを有効にする必要があります.
u-bootを再コンパイルして書き込み、u-bootコマンドラインでmtdpartsを実行すると、パーティション情報が表示されます.
nand eraseを実行する.part kernel、kernelパーティションを消去できます
nand write 300000 kernelを実行し、sdram 300000位置の内容をkernelパーティションに書き込む
/*****yaffs 2焼書き及びパッチ作成をサポート****************/
smdk 2440を修正する.h,追加
#define CONFIG_CMD_NAND_YAFFS/*wenjs modifyサポートyaffsファイルシステム書き込み*/
実行yaffsファイルシステムを焼くと、焼き書きが速く、コードを探して発見されます.
commonディレクトリの下、cmd_nand.cファイルdo_nand関数、説明.yaffs 2の焼き書き、
nand_write_skip_bad(nand, off, &rwsize,(u_char *)addr, WITH_YAFFS_OOB);
この関数では、yaffsファイルシステムの書き込みについて、コードがあります.
if (flags & WITH_YAFFS_OOB) {
    int page, pages;
    size_t pagesize = nand->writesize;
    size_t pagesize_oob = pagesize + nand->oobsize;
    struct mtd_oob_ops ops;

    ops.len = pagesize;
    ops.ooblen = nand->oobsize;
    ops.mode = MTD_OOB_AUTO;
    ops.ooboffs = 0;

    pages = write_size / pagesize_oob;
    for (page = 0; page < pages; page++) {
        WATCHDOG_RESET();

        ops.datbuf = p_buffer;
        ops.oobbuf = ops.datbuf + pagesize;

        rval = nand->write_oob(nand, offset, &ops);
        if (!rval)
          break;

        offset += pagesize;
        p_buffer += pagesize_oob;
    }
}

変更後:
if (flags & WITH_YAFFS_OOB) {
    int page, pages;
    size_t pagesize = nand->writesize;
    size_t pagesize_oob = pagesize + nand->oobsize;
    struct mtd_oob_ops ops;

    ops.len = pagesize;
    ops.ooblen = nand->oobsize;
    ops.mode = MTD_OOB_RAW;    // OOB 
    ops.ooboffs = 0;

    pages = write_size / pagesize_oob;
    for (page = 0; page < pages; page++) {
        WATCHDOG_RESET();
        ops.datbuf = p_buffer;
        ops.oobbuf = ops.datbuf + pagesize;
        rval = nand->write_oob(nand, offset, &ops);
        if (rval)  // ,  !  , 0 
           break;

        offset += pagesize;
        p_buffer += pagesize_oob;
    }
}

パッチファイルの生成:
まずmake distcleanを実行し、コンパイルされたファイルをクリアします.
実行mv u-boot-2012.04.01 u-boot-2012.04.01_OK u-bootの名前を変更
次にtar xvfj u-boot-2012.04.01を実行する.tar.bz2 -C ./元のu-bootを解凍する
実行diff-urN u-boot-2012.04.01 u-boot-2012.04.01_ok > u-boot-2012.04.01_ok.patch
パラメータu--出力フォーマットを指定します.
r--再帰的にファイルを生成する
N--ファイルが空の場合は空のままにします.
変更されていないu-bootにパッチを適用します.
元のu-bootに入り、cd u-boot-2012.04.01を実行します.
パッチ適用patch-p 1<../u-boot-2012.04.01_ok.patch
パラメータ-p 1は、第1レベルディレクトリを無視することを示す
/*****u-boot移植完了*****/