U-BOOTはフレンドリーアームmini 2440に移植


U-BOOTはフレンドリーアームmini 2440に移植
開発環境:ubuntu 10.10
コンパイラ:フレンドリーなアームmini 2440ディスクにarm-linux-gcc 4.4を持参する.3
一.denx公式サイトでソースコードをダウンロードします.私が使っているバージョンはu-boot-2010.03です.二.ホストコンパイル環境はフレンドリーなアームに提供するarm-linux-gccである.参照プレートはsmdk 2410です.三.第1段階の移行プロセスの開始
1.まずコンパイル環境をテストします.arm-linux-gccは、すでにPATH環境変数を加えているので、lib_armディレクトリの下のconfig.mkはCRPSS_を定義したCOMPILEはarm-linux-で、ホームディレクトリの下のMakefileにはこのファイルが含まれているので、クロスコンパイルツールはすでに確定しています.これ以上直す必要はない.
$cd  u-boot-mini2440
$make smdk2410_config
$make
コンパイルに合格しました.コンパイル環境に問題がないことを示します.
2.mini 2440構成およびファイルの作成
(1)最上位ディレクトリMakefileに入り、次のものを見つけます.
smdk2410_config :       unconfig
     @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
コピーして、次のように変更します.
mini2440_config :       unconfig
     @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0
注意:@の前にtabキーがあります.そうしないと、構成をコンパイル中にエラーが発生します.
このコマンドは実際には最上位ディレクトリの下のmkconfigを実行し、後ろはパラメータです.
(2)/board/samsungに入り、smdk 2410ディレクトリをmini 2440にコピーします.これは私たちの開発ボードのディレクトリです.mini 2440ディレクトリに入り、smdk 2410.cをmini 2440.cに変更します.Makefileを変更します:
COBJS   := mini2440.o flash.o

(3)/include/configsに入り、smdk 2410.hをmini 2440.hにコピーします.これは私たちのプロファイルです.
これで私たちの開発ボードのファイルはすべてありますが、内容はsmdk 2410開発ボードです.
コンパイルテスト
make clean
make mini2440_config
make
コンパイルは、説明によって問題ありません.
3. start.Sの修正(1)
@       bl      coloured_LED_init
@       bl      red_LED_on
このmini 2440はカラーランプがないので、コメントしてください.
# if defined(CONFIG_S3C2440)
        ldr     r1, =0x3fff
        ldr     r0, =INTSUBMSK
        str     r1, [r0]
# endif
サブ割り込み2440は15個あるので変更します.
# if defined(CONFIG_S3C2440)
#define MPLLCON 0x4c000004
#define UPLLCON 0x4c000008
        /* FCLK:HCLK:PCLK = 1:2:4 */
        /* default FCLK is 405 MHz ! */
        ldr     r0, =CLKDIVN
        mov     r1, #5
        str     r1, [r0]
        ldr r0, =MPLLCON
        ldr r1, =(0x7f<<12)|(0x02<<4)|(0x01)
        str r1, [r0]
        ldr r0, =UPLLCON
        ldr r1, =(0x38<<12)|(0x02<<4)|(0x02)
        str r1, [r0]
# else
        /* FCLK:HCLK:PCLK = 1:2:4 */
        /* default FCLK is 120 MHz ! */
        ldr     r0, =CLKDIVN
        mov     r1, #3
        str     r1, [r0]
#endif  /* CONFIG_S3C2440 */
以上がS 3 C 24440クロック初期化のコードであり、2410と2440クロック初期化の差が大きいことがわかる.
4.クロックを初期化すると、すぐにcpu内部が初期化されます.この関数cpu_init_critは変更する必要はありませんが、中で呼び出されたlowlevel_Init関数は、メモリを初期化するコードなので、開発ボードごとにメモリが異なるのでlowlevel_を変更する必要があります.init.Sは/board/samsung/mini 2440ディレクトリにあります.
 #define Trp                     0x2     /* 2clk */
 #define REFCNT                  1012   

5.検査コードの位置及び起動方式を判断するコードを追加する
/*********** CHECK_CODE_POSITION ************/
        adr     r0, _start              /* r0 <- current position of code   */
        ldr     r1, _TEXT_BASE          /* test if we run from flash or RAM */
        cmp     r0, r1                  /* don't reloc during debug         */
        beq     stack_setup
/***************** CHECK_CODE_POSITION ****/
/***************** CHECK_BOOT_FLASH *******/
#define rBWSCON 0x48000000
        mov     r0, #rBWSCON 
        ldr     r0, [r0]
        bic     r0, r0, #0xfffffff5  /* BWSCON[2:1] is controled by OM[1:0] */
        cmp     r0, #0    /* when OM[1:0] is 00,BSWCON[2:1]=00, nand flash boot */


        bne     relocate             /* norflash boot */
/*****************CHECK_BOOT_FLASH*************************/

現在のコード位置とTEXT_を比較することにより、起動コードの位置を確認します.BASE同士が同一か否かで判断する起動方式はBWSCON[2:1]をチェックすることで判断され、具体的な実現はstart.Sの分析
6.Nandflash起動コードの追加
#define LENGTH_UBOOT 0x60000
#define NAND_CTL_BASE 0x4E000000
#ifdef CONFIG_S3C2440
/* Offset */
#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFCMD 0x08
#define oNFSTAT 0x20
	@ reset NAND
	mov	r1, #NAND_CTL_BASE
	ldr	r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
	str	r2, [r1, #oNFCONF]
	ldr	r2, [r1, #oNFCONF]
	ldr	r2, =( (1<<4)|(0<<1)|(1<<0) )	@ Active low CE Control 
	str	r2, [r1, #oNFCONT]
	ldr	r2, [r1, #oNFCONT]
	ldr	r2, =(0x6)	@ RnB Clear
	str	r2, [r1, #oNFSTAT]
	ldr	r2, [r1, #oNFSTAT]
	mov	r2, #0xff	@ RESET command
	strb	r2, [r1, #oNFCMD]
	mov	r3, #0	@ wait
nand1: 
	add	r3, r3, #0x1
	cmp	r3, #0xa
	blt	nand1
nand2:
	ldr	r2, [r1, #oNFSTAT]	@ wait ready
	tst	r2, #0x4
	beq	nand2
	ldr	r2, [r1, #oNFCONT]
	orr	r2, r2, #0x2	@ Flash Memory Chip Disable
	str	r2, [r1, #oNFCONT]
	@ get read to call C functions (for nand_read())
	ldr	sp, DW_STACK_START	@ setup stack pointer
	mov	fp, #0	@ no previous frame, so fp=0
	@ copy U-Boot to RAM
	ldr	r0, =TEXT_BASE
	mov	r1, #0x0
	mov	r2, #LENGTH_UBOOT
	bl	nand_read_ll
	tst	r0, #0x0
	beq	ok_nand_read
bad_nand_read:
loop2:
	b	loop2	@ infinite loop
ok_nand_read:
	@ verify
	mov	r0, #0
	ldr	r1, =TEXT_BASE
	mov	r2, #0x400	@ 4 bytes * 1024 = 4K-bytes
go_next:
	ldr	r3, [r0], #4
	ldr	r4, [r1], #4
	teq	r3, r4
	bne	notmatch
	subs	r2, r2, #4
	beq	stack_setup
	bne	go_next
notmatch:
loop3:
	b	loop3	@ infinite loop
#endif

nand_read_llこの関数はnand_read.cの中の、このファイルはボードレベルのディレクトリに、このファイルを/board/samsung/mini 2440に追加する必要があります.そしてMakefileを修正してコードをコンパイルする
COBJS   := mini2440.o flash.o nand_read.o

この第1段階のコード修正が完了しました.コンパイルに合格するかどうかをテストするため、コードにCONFIG_があります.S 3 C 2440の構成は、mini 2440を変更する.h.
7コンパイルエラー:
(1).DWの検出STACK_STARTは定義されていませんが、これはC言語の初期話スタックに入るときに使われるもので、定義が付いています.
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x10000
        .align  2
DW_STACK_START: .word   STACK_BASE+STACK_SIZE-4
(2)include/asm/arch/s 3 c 24 x 0_発見cpu.hエラー、CONFIGが定義されていますS 3 C 2410はs 3 c 2410を含む.h、CONFIGを定義しているからです.S 3 C 440はヘッダファイルを含むので、s 3 c 2410を変更する.hはs 3 c 2440にコピーする.h.
(3)s 3 c 2440が発見された.h CONFIGが定義されていませんS 3 C 440、CONFIG_についてS 3 C 2410の前処理オプションはすべてCONFIG_に変更された.S3C2410||CONFIG_S 3 C 2440、これによりコードがコンパイルされる.
8 ledランプ表示プログラムを追加します.
#  if defined(CONFIG_MINI2440_LED)
#define rGPBCON 0x56000010
#define rGPBDATA 0x56000014
#define rGPBUP 0x56000018
        ldr r0, =rGPBCON
        ldr r1, =(0x01<<10)|(0x01<<12)|(0x01<<14)|(0x01<<16)
        str r1, [r0]
        ldr r0, =rGPBUP
        ldr r1, =0x7fff
        str r1, [r0]
        ldr r0, =rGPBDATA
        ldr r1, =(0x1<<5)|(0x0<<6)|(0x1<<7)|(0x0<<8)
        str r1, [r0]
#endif

9 u-bootを変更します.ldsのリンク順はlowlevel_init.S,nand_read.cはいずれも前の4 Kコードで、
                cpu/arm920t/start.o     (.text)
                board/samsung/mini2440/lowlevel_init.o
                board/samsung/mini2440/nand_read.o
構成mini 2440.h,CONFIG_を追加するMINI2440_LEDマクロ定義、再コンパイル、ボードにダウンロードし、LEDランプが点灯した場合、1番目と3番目が点灯し、他は消灯します.説明プログラムの第1段階が正しく実行された.kermit(シリアルポート端末)に文字化けしが発生し、シリアルポート駆動がまだ移植されていないことを示し、正常な現象である.
四.第2段階移植プロセスの開始
1.シリアルポート初期化の変更
シリアルポート実装は基本的に何も変更する必要はありません.シリアルポート初期化関数はserialです.init、/drivers/serial/serial_s3c24x0.cでは、シリアルポートがボートレートを初期化するためget_が必要PCLK()という関数ですが、この関数は/cpu/arm 920 t/speedです.cでは2410と2440の実装が異なるので,この関数を修正する必要がある.修正が完了し、再コンパイルエラーが発生しました.CAMDIVNは定義していません.2410にはこのレジスタがありません.s 3 c 24 x 0です.hに定義を入れればいいです.その後、ボードにダウンロードすると、シリアルポートに正常な端末表示が表示されます.しかし、多くの命令は使えない.他のドライバなので移植はありません.
2.LCD端末移植
リファレンスコードのLCD駆動はVFD方式で実現されていますが、コードを分析するとプログラミング方式が不快な感じがします.LCD実現方式を見てみると、もっと自分のスタイルに近いです.だから思い切ってLCD方式に転向してLCD端末を実現する.
(1)まずmini 2440.hにマクロ定義を追加する
#define CONFIG_LCD
#define LCD_VIDEO_ADDR	0x33d00000
(2)2440レジスタ追加
2410と2440のレジスタは同じなので、CONFIGを増やすだけです.S 3 C 2440でいいです.
(3)下地LCD駆動コードlcd.cを追加する
lcd.c/board/samsung/mini 2440にコピーし、下位駆動であることを示します.このファイルは参照コードに基づいて修正されたものです.
#include <common.h>
#include <netdev.h>
#include <asm/arch/s3c24x0_cpu.h>
#include <video_fb.h>
#include <lcd.h>
#include <asm/io.h>

#if defined(CONFIG_CMD_NAND)
#include <linux/mtd/nand.h>
#endif

DECLARE_GLOBAL_DATA_PTR;

#define MVAL		(0)
#define MVAL_USED 	(0)		//0=each frame   1=rate by MVAL
#define INVVDEN		(1)		//0=normal       1=inverted
#define BSWP		(0)		//Byte swap control
#define HWSWP		(1)		//Half word swap control


//TFT 240320
#define LCD_XSIZE_TFT_240320 	(240)	
#define LCD_YSIZE_TFT_240320 	(320)
#define LCD_MEM_SIZE		240*320*16

//TFT240320
#define HOZVAL_TFT_240320	(LCD_XSIZE_TFT_240320-1)
#define LINEVAL_TFT_240320	(LCD_YSIZE_TFT_240320-1)

//Timing parameter for NEC3.5"
#define VBPD_240320		(3)		
#define VFPD_240320		(10)
#define VSPW_240320		(1)

#define HBPD_240320		(5)
#define HFPD_240320		(2)
#define HSPW_240320_NEC		(36)  //Adjust the horizontal displacement of the screen :[email protected]
#define HSPW_240320_TD		(23)  //64MB nand mini2440 is 36 ,128MB is 23
				      //+ : -->    - : <--
#define CLKVAL_TFT_240320	(3) 	
//FCLK=101.25MHz,HCLK=50.625MHz,VCLK=6.33MHz

#ifdef CONFIG_LCD 

vidinfo_t panel_info = {
	LCD_XSIZE_TFT_240320, 
	LCD_YSIZE_TFT_240320,
	LCD_BPP
};
int lcd_line_length;
int lcd_color_fg;
int lcd_color_bg;

void *lcd_base;				/* Start of framebuffer memory	*/
void *lcd_console_address;		/* Start of console buffer	*/

short console_col;
short console_row;
void lcd_ctrl_init (void *lcd_base)
{
	struct s3c24x0_lcd * const lcd	 = s3c24x0_get_base_lcd(); 
	struct s3c2410_nand * const nand = s3c2410_get_base_nand();

        /*  select LCM type by env variable */ 
	 
	/* Configuration for GTA01 LCM on QT2410 */ 
	lcd->LCDCON1 = 0x00000378; /* CLKVAL=4, BPPMODE=16bpp, TFT, ENVID=0 */ 
	lcd->LCDCON2 = (VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320); 
	lcd->LCDCON3 = (HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320); 

	if ( (nand->NFCONF) & 0x08 )	{ 
	lcd->LCDCON4 = (MVAL<<8)|(HSPW_240320_TD);
	}
	else	{
	  lcd->LCDCON4 = (MVAL<<8)|(HSPW_240320_NEC);
	}
	
	lcd->LCDCON5 = 0x00000f09; 
	lcd->LPCSEL  = 0x00000000; 
	printf("Video: ");
	printf ("TongBao 240*320 LCD 16bit 565 mode
"); /* Init LCD base address */ writel((((ulong)lcd_base) >> 1), &lcd->LCDSADDR1); writel((((readl(&lcd->LCDSADDR1))&0x1fffff) + (LCD_XSIZE_TFT_240320+0) * LCD_YSIZE_TFT_240320), &lcd->LCDSADDR2); writel((LCD_XSIZE_TFT_240320 & 0x7ff), &lcd->LCDSADDR3); /* Clear video memory */ memset((void *)lcd_base, 0, LCD_MEM_SIZE); /* Enable Display */ writel((readl(&lcd->LCDCON1) | 0x01), & lcd->LCDCON1); /* ENVID = 1 */ } void lcd_enable (void) { }

具体的な実装はu-boot lcd分析(4)を参照して色ビット数を定義する
なぜならcのデフォルトの色は8ビットで、統宝は16ビットです.だからmini 440.hで定義
#define LCD_BPP                 LCD_COLOR16
(5)再コンパイル
make clean
make mini2440_config
make
は端末プロンプトがLCDに表示されますが、字は白く、背景は黒いです.
mini 2440でhで定義#define CONFIG_SYS_WHITE_ON_BLACK       1 
反白します.これでかっこいいですね.デフォルトはLCD端末プロンプトであるため、これは登録装置の順序のため、/common/stdio.c stdio_init関数でdrv_lcd_Init()をserial_に配置stdio_Init()の後ろでいいです.そしてダウンロードを再コンパイルします.デフォルトのシリアルポート端末になり、setenv stdout lcdを入力することで切り替えることができます.
(6)logoを追加する.
mini 2440でh,CONFIG_の定義LCD_LOGO.再コンパイルするとdenxの起動ロゴが表示されますが、まだカッコ悪いと感じたら、自分のロゴを追加します.メソッドの変更、/tools/Makefile
ifeq ($(LOGO_BMP),)
LOGO_BMP= logos/ayst.bmp
endif
ayst.bmpは/tools/logosにコピーして、bmp画像に注意するのは要求があって、幅は4の倍数ならば、まだ16ビットです.このようにしてこそ、正しく表示されます.
3.Nandflashドライブマイグレーション
(1)最下位ドライバコードの修正
変更/drivers/mtd/nand/s 3 c 2410_nand.c
(2)構成の追加
mini 2440でhにNandflashの構成を追加
#define	CONFIG_CMD_NAND	1
/*--------------------------------------------------------------------------------------------
 * NAND flash settings
 */
#if defined(CONFIG_CMD_NAND)
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_NAND_BASE 0x4E000000 
#define CONFIG_SYS_MAX_NAND_DEVICE      1       
#define SECTORSIZE 512
#define SECTORSIZE_2K 2048
#define NAND_SECTOR_SIZE SECTORSIZE
#define NAND_SECTOR_SIZE_2K SECTORSIZE_2K
#define NAND_BLOCK_MASK 511
#define NAND_BLOCK_MASK_2K 2047
#define NAND_MAX_CHIPS 1
#define CONFIG_MTD_NAND_VERIFY_WRITE 
#define CONFIG_SYS_64BIT_VSPRINTF               /* needed for nand_util.c */
#endif  /* CONFIG_CMD_NAND */
(3)  2440 nandflash   
 /include/asm-arm/arch-s3c24x0/s3c24x0.h  
#if defined (CONFIG_S3C2440)
/* NAND FLASH (see S3C2440 manual chapter 6) */
struct s3c2410_nand {
        u32     NFCONF;
        u32     NFCONT;
        u32     NFCMD;
        u32     NFADDR;
        u32     NFDATA;
        u32     NFMECCD0;
        u32     NFMECCD1;
        u32     NFSECCD;
        u32     NFSTAT;
        u32     NFESTAT0;
        u32     NFESTAT1;
        u32     NFMECC0;
        u32     NFMECC1;
        u32     NFSECC;
        u32     NFSBLK;
        u32     NFEBLK;
};
#endif

4.ネットワーク駆動の移植
(1)NIC初期化コードの修正
mini 2440でcに追加
#ifdef CONFIG_DRIVER_DM9000
        rc = dm9000_initialize(bis);
#endif

(2)構成の追加
mini 244でhに追加
#define  CONFIG_CMD_PING	1
#define CONFIG_NET_MULTI                1
#define CONFIG_NET_RETRY_COUNT          20
#define CONFIG_DRIVER_DM9000            1
#define CONFIG_DM9000_BASE              0x20000300
#define DM9000_IO                       CONFIG_DM9000_BASE
#define DM9000_DATA                     (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT         1
#define CONFIG_DM9000_NO_SROM           1
#undef CONFIG_DM9000_DEBUG

(3)dm 9000 x.cの修正
364行
if (i == 1000) {
	printf("could not establish link
"); return 0; break; }

(4)nfsコードの修正
33行
#define NFS_TIMEOUT (10*2000UL)

5デフォルト環境変数の変更
/*-----------------------------------------------------------------------------------------------------
 *Environment variables setting
 */
#define CONFIG_BOOTDELAY        5
#define CONFIG_BOOTARGS         "noinitrd root=/dev/nfs rw nfsroot=192.168.1.111:/home/sun/study/nfsshare/rootfs_qtopia_qt4 ip=192.168.1.230:192.168.1.1::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M"
#define CONFIG_ETHADDR          08:08:11:18:12:27
#define CONFIG_NETMASK          255.255.255.0
#define CONFIG_IPADDR           192.168.1.230
#define CONFIG_SERVERIP         192.168.1.111
#define CONFIG_GATEWAYIP        192.168.1.1
#define CONFIG_OVERWRITE_ETHADDR_ONCE
#define CONFIG_BOOTCOMMAND      "tftp 0x30008000 zImage;bootm"
#if defined(CONFIG_CMD_KGDB)
#define CONFIG_KGDB_BAUDRATE    115200          /* speed to run kgdb serial port */
/* what's this ? it's not used anywhere */
#define CONFIG_KGDB_SER_INDEX   1               /* which serial port to use */
#endif
/* timeout values are in ticks */
#define CONFIG_SYS_FLASH_ERASE_TOUT	(5*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
#define CONFIG_SYS_FLASH_WRITE_TOUT	(5*CONFIG_SYS_HZ) /* Timeout for Flash Write */
#define	CONFIG_ENV_IS_IN_NAND	1
#define CONFIG_ENV_OFFSET		0x40000	/* Total Size of Environment Sector */
#define CONFIG_ENV_SIZE 0x20000              /*size of environment */

これはストレージメディア、デフォルトのFlash、ここでNandFlashです.
/*-----------------------------------------------------------------------------------------------------
 * linux kernel tags
 * This is important for starting kernel
 */
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
#define CONFIG_CMDLINE_TAG


#define CONFIG_SYS_HUSH_PARSER
#define CONFIG_SYS_PROMPT_HUSH_PS2   "> "
#define CONFIG_CMDLINE_EDITING
#define CONFIG_AUTO_COMPLETE
このタグリスト構成はカーネルの起動に非常に重要であり、カーネルがなければ起動しない.
五.まとめ
今回の移植はtekkamaninjaのフレンドリーな腕mini 2440への移植コードを参照します.多くの場所でコードがそのまま運ばれています.時間がないため、いくつかのコードの実現についてまだよく分かりません.しかしu-bootの基本的なソフトウェアアーキテクチャについては一定の理解がある.独自の点は、起動方式やlcd駆動の移植を判断することです.前者はヌードマシンプログラムの起動コードを参考に書いたもので、後者は完全に自分のコードに対する理解に従って移植されたものです.やはり成功した.u-bootソフトウェアの階層構造が印象的でした.そしてMakefileの構造も私に啓発されました.この最初の接触のオープンソースプロジェクト.これからもよく使います.
移植のソースコードは私のcsdnダウンロード資源の中でダウンロードしますhttp://download.csdn.net/detail/YAOZHENGUO2006/3585685