娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

uboot在s3c2440上的移植(4)

發(fā)布者:SereneSoul55最新更新時間:2024-08-29 來源: cnblogs關(guān)鍵字:uboot  s3c2440  移植 手機看文章 掃描二維碼
隨時隨地手機看文章

一、移植環(huán)境

  • 主  機:VMWare--Fedora 9

  • 開發(fā)板:Mini2440--64MB Nand,Kernel:2.6.30.4

  • 編譯器:arm-linux-gcc-4.3.2.tgz

  • u-boot:u-boot-2009.08.tar.bz2

二、移植步驟

在這一篇中,我們首先讓開發(fā)板對CS8900或者DM9000X網(wǎng)卡的支持,然后再分析實現(xiàn)u-boot怎樣來引導Linux內(nèi)核啟動。因為測試u-boot引導內(nèi)核我們要用到網(wǎng)絡(luò)下載功能。

7)u-boot對CS8900或者DM9000X網(wǎng)卡的支持。
u-boot-2009.08版本已經(jīng)對CS8900和DM9000X網(wǎng)卡有比較完善的代碼支持(代碼在drivers/net/目錄下),而且在S3C24XX系列中默認對CS8900網(wǎng)卡進行配置使用。只是在個別地方要根據(jù)開發(fā)板的具體網(wǎng)卡片選進行設(shè)置,就可以對S3C24XX系列中CS8900網(wǎng)卡的支持使用。代碼如下:

 

現(xiàn)在修改對我們開發(fā)板上DM9000X網(wǎng)卡的支持。
首先,我們看看drivers/net/目錄下有關(guān)DM9000的代碼,發(fā)現(xiàn)dm9000x.h中對CONFIG_DRIVER_DM9000宏的依賴,dm9000x.c中對CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依賴,所以我們修改代碼如下:

#gedit include/configs/my2440.h

/* * Hardware drivers */  屏蔽掉u-boot默認對CS8900網(wǎng)卡的支持
//#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
//#define CS8900_BASE          0x19000300
//#define CS8900_BUS16         1 /* the Linux driver does accesses as shorts */

 

//添加u-boot對DM9000X網(wǎng)卡的支持

#define CONFIG_DRIVER_DM9000    1  
#define CONFIG_NET_MULTI        1
#define CONFIG_DM9000_NO_SROM   1
#define CONFIG_DM9000_BASE      0x20000300  //網(wǎng)卡片選地址
#define DM9000_IO               CONFIG_DM9000_BASE
#define DM9000_DATA             (CONFIG_DM9000_BASE + 4)   //網(wǎng)卡數(shù)據(jù)地址

//#define CONFIG_DM9000_USE_16BIT 1

注意:
u-boot-2009.08 可以自動檢測DM9000網(wǎng)卡的位數(shù),根據(jù)開發(fā)板原理圖可知網(wǎng)卡的數(shù)據(jù)位為16位,并且網(wǎng)卡位于CPU的BANK4上,所以只需在 board/samsung/my2440/lowlevel_init.S中設(shè)置 #define B4_BWSCON (DW16) 即可,不需要此處的 #define CONFIG_DM9000_USE_16BIT 1

 

//給u-boot加上ping命令,用來測試網(wǎng)絡(luò)通不通

#define CONFIG_CMD_PING 

 

//恢復被注釋掉的網(wǎng)卡MAC地址和修改你合適的開發(fā)板IP地址

#define CONFIG_ETHADDR   08:00:3e:26:0a:5b  //開發(fā)板MAC地址
#define CONFIG_NETMASK   255.255.255.0
#define CONFIG_IPADDR    192.168.1.105      //開發(fā)板IP地址

#define CONFIG_SERVERIP  192.168.1.103      //Linux主機IP地址

添加板載DM9000網(wǎng)卡初始化代碼,如下:

#gedit board/samsung/my2440/my2440.c

#include
#include

 

#ifdef CONFIG_DRIVER_DM9000
int board_eth_init(bd_t *bis)
{
    return dm9000_initialize(bis);
}
#endif

 

修改MD9000網(wǎng)卡驅(qū)動代碼,如下:

#gedit drivers/net/dm9000x.c

#if 0  //屏蔽掉dm9000_init函數(shù)中的這一部分,不然使用網(wǎng)卡的時候會報“could not establish link”的錯誤
    i = 0;
    while (!(phy_read(1) & 0x20)) {    /* autonegation complete bit */
        udelay(1000);
        i++;
        if (i == 10000) {
            printf('could not establish link ');
            return 0;
        }
    }
#endif


然后重新編譯u-boot,下載到Nand中從Nand啟動,查看啟動信息和環(huán)境變量并使用ping命令測試網(wǎng)卡,操作如下:

 

 

 

 

 

可以看到,啟動信息里面顯示了Net:dm9000,printenv查看的環(huán)境變量也和include/configs/my2440.h中設(shè)置的一致。但是現(xiàn)在有個問題就是ping不能通過。

 

經(jīng)過一段時間在網(wǎng)上搜索,原來有很多人都碰到了這種情況。出現(xiàn)問題的地方可能是DM9000網(wǎng)卡驅(qū)動中關(guān)閉網(wǎng)卡的地方,如是就試著修改代碼如下:

結(jié)果,只是第一次ping不通,以后都是可以ping通的(據(jù)網(wǎng)友們說這是正常的),如下圖:

 

好了,現(xiàn)在只剩下一個問題了,就是使用tftp進行下載。關(guān)于tftp服務(wù)器在Linux中的安裝和配置,這里我就不講了,在網(wǎng)上搜一下很多的。然而,在tftp下載時又遇到了問題,總是出現(xiàn)傳送不完整又重新傳送的現(xiàn)象,不斷的循環(huán),如下圖:

 

困惑好久的tftp問題現(xiàn)在終于搞定啦,心情真是爽啊!!首先分析上面圖中的現(xiàn)象,在下載過程中斷斷續(xù)續(xù)就說明是可以下載的,只是由于某種原因使網(wǎng)絡(luò)出現(xiàn)超時從而重新下載,那我想出現(xiàn)這種情況的可能性有兩種:1、u-boot中對網(wǎng)絡(luò)的延時設(shè)置;2、就是我的物理網(wǎng)絡(luò)結(jié)構(gòu)。首先針對第一種,我修改了net/net.c中對網(wǎng)絡(luò)延時的設(shè)置,結(jié)果還是不行。接著就試試第二種情況,因為之前我的網(wǎng)絡(luò)是通過路由器來管理的,主機和開發(fā)板也是通過路由器來連接的,所以現(xiàn)在我就改用一條交叉網(wǎng)線直接把主機和開發(fā)板連接起來,一試,果然可以啦,哈哈哈哈....。至此,網(wǎng)絡(luò)部分的移植總算完成了。

 

 

8)實現(xiàn)u-boot引導Linux內(nèi)核啟動。

 

在前面幾節(jié)中,我們講了u-boot對Nor Flash和Nand Flash的啟動支持,那現(xiàn)在我們就再來探討一下u-boot怎樣來引導Linux內(nèi)核的啟動。

 

①、機器碼的確定

通常,在u-boot和kernel中都會有一個機器碼(即:MACH_TYPE),只有這兩個機器碼一致時才能引導內(nèi)核,否則就會出現(xiàn)如下mach的錯誤信息:

 

首先,確定u-boot中的MACH_TYPE。在u-boot的include/asm-arm/mach-types.h文件中針對不同的CPU定義了非常多的MACH_TYPE,可以找到下面這個定義:

 

②、準備能被u-boot直接引導的內(nèi)核uImage

通常,kernel的啟動需要u-boot提供一些參數(shù)信息,比如ramdisk在RAM中的地址。經(jīng)過編譯后的u-boot在根目錄下的tools目錄中,會有個叫做mkimage的工具,他可以給zImage添加一個header,也就是說使得通常我們編譯的內(nèi)核zImage添加一個數(shù)據(jù)頭信息部分,我們把添加頭后的image通常叫uImage,uImage是可以被u-boot直接引導的內(nèi)核鏡像。

 

mkimage工具的使用介紹如下:

使用: 中括號括起來的是可選的

mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image

選項:
-A:set architecture to 'arch'       //用于指定CPU類型,比如ARM
-O:set operating system to 'os'     //用于指定操作系統(tǒng),比如Linux
-T:set image type to 'type'         //用于指定image類型,比如Kernel
-C:set compression type 'comp'      //指定壓縮類型
-a:set load address to 'addr' (hex) //指定image的載入地址
-e:set entry point to 'ep' (hex)    //內(nèi)核的入口地址,一般為image的載入地址+0x40(信息頭的大小)
-n:set image name to 'name'         //image在頭結(jié)構(gòu)中的命名
-d:use image data from 'datafile'   //無頭信息的image文件名
-x:set XIP (execute in place)       //設(shè)置執(zhí)行位置

 

先將u-boot下的tools中的mkimage復制到主機的/usr/local/bin目錄下,這樣就可以在主機的任何目錄下使用該工具了。現(xiàn)在我們進入kernel生成目錄(一般是arch/arm/boot目錄),然后執(zhí)行如下命令,就會在該目錄下生成一個uImage.img的鏡像文件,把他復制到tftp目錄下,這就是我們所說的uImage。

mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage.img

 

③、Nand Flash的分區(qū)。我們查看內(nèi)核在arch/arm/plat-s3c24xx/common-smdk.c中的分區(qū)情況如下:

         起始地址      結(jié)束地址

uboot : 0x00000000    0x00030000 
param : 0x00030000    0x00040000 //注意這個環(huán)境變量的地址范圍要與上一節(jié)補充內(nèi)容中配置的CONFIG_ENV_OFFSET一致
kernel: 0x00050000    0x00200000 
root  : 0x00250000    0x03dac000

 

 

④、設(shè)置修改u-boot的啟動參數(shù),在u-boot命令行下輸入:

//設(shè)置啟動參數(shù),意思是將nand中0x50000-0x00200000(和kernel分區(qū)一致)的內(nèi)容讀到內(nèi)存0x31000000中,然后用bootm命令來執(zhí)行

set bootcmd 'nand read 0x31000000 0x50000 0x00200000;bootm 0x31000000'

saveenv  //保存設(shè)置

 

⑤、把uImage.img用tftp下載到內(nèi)存中,然后再固化到Nand Flash中,操作和執(zhí)行圖如下:

tftp 0x30000000 uImage.img  //將uImage.img下載到內(nèi)存0x30000000處

nand erase 0x50000 0x200000 //擦除nand的0x50000-0x200000的內(nèi)容

nand write 0x30000000 0x50000 0x200000 //將內(nèi)存0x30000000處的內(nèi)容寫入到nand的0x50000處

 

 

最后,我們重新啟動開發(fā)板,可以看到,內(nèi)核被u-boot成功引導起來了,如圖:

 

 

#define MACH_TYPE_SMDK2440 1008  //針對2440的MACH_TYPE碼的值定義為1008

 

那么我們就修改u-boot的MACH_TYPE代碼引用部分,確定u-boot的MACH_TYPE。如下:

#gedit board/samsung/my2440/my2440.c   //修改board_init函數(shù)

/* arch number of SMDK2410-Board */
//gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
改為:
gd->bd->bi_arch_number = MACH_TYPE_SMDK2440;

 

其次,確定kernel中的MACH_TYPE。在kernel的arch/arm/tools/mach-types文件中也針對不同的CPU定義了非常多的MACH_TYPE,也可以找到下面這個定義:

smdk2440  MACH_SMDK2440   SMDK2440   1008

 

那么我們就修改kernel的MACH_TYPE代碼引用部分,確定kernel的MACH_TYPE。如下:

#gedit arch/arm/mach-s3c2440/mach-smdk2440.c   //修改文件最后面

//MACHINE_START(S3C2440, 'SMDK2440')
改為:
MACHINE_START(SMDK2440, 'SMDK2440')

 

#gedit arch/arm/kernel/head.S  //在ENTRY(stext)下添加如下代碼(紅色部分)

ENTRY(stext)

    mov    r0, #0
    mov    r1, #0x3f0   //上面的MACH_TYPE值1008換成十六進制就是0x3f0
    ldr    r2, =0x30000100
 
    msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE

    .......

 

分別重新編譯u-boot和kernel。u-boot下載后,記得要saveenv;kernel用tftp下載到內(nèi)存后使用go命令來測試引導內(nèi)核,結(jié)果可以引導了,如下:

#gedit drivers/net/dm9000x.c  //屏蔽掉dm9000_halt函數(shù)中的內(nèi)容

/*
  Stop the interface.
  The interface is stopped when it is brought.
*/
static void dm9000_halt(struct eth_device *netdev)
{
    //DM9000_DBG('%sn', __func__);

    ///* RESET devie */
    //phy_write(0, 0x8000);    /* PHY RESET */
    //DM9000_iow(DM9000_GPR, 0x01);    /* Power-Down PHY */
    //DM9000_iow(DM9000_IMR, 0x80);    /* Disable all interrupt */
    //DM9000_iow(DM9000_RCR, 0x00);    /* Disable RX */
}

 

 

#gedit include/configs/my2440.h

 

/*
 * Hardware drivers
 */
#define CONFIG_DRIVER_CS8900  1        /* we have a CS8900 on-board */
#define CS8900_BASE           0x19000300 //注意:對不同的開發(fā)板就是要修改這個片選地址參數(shù),這個參數(shù)值就看開發(fā)板上網(wǎng)卡的片選引腳是接到ARM芯片存儲控制器的哪個Bank上
#define CS8900_BUS16          1        /* the Linux driver does accesses as shorts */


關(guān)鍵字:uboot  s3c2440  移植 引用地址:uboot在s3c2440上的移植(4)

上一篇:uboot在s3c2440上的移植(1)
下一篇:uboot在s3c2440上的移植(6)

推薦閱讀最新更新時間:2025-03-25 22:37

2.移植uboot-添加2440單板,并實現(xiàn)NOR、NAND啟動
1.首先在uboot里新建單板2440 1.1將2410的單板文件夾拷貝成2440: cd board/samsung/ cp smdk2410 smdk2440 -rf //拷貝文件夾, 然后將smdk2440下的smdk2410.c改為smdk2440.c,以及修改更改好的Makefile 1.2 將2410的頭文件拷貝成2440: cd ../../include/configs/ cp smdk2410.h smdk2440.h 2.新建后,還需要修改boards.cfg,使uboot支持2440單板: 仿照 smdk2410 arm arm920t
[單片機]
2.<font color='red'>移植</font><font color='red'>uboot</font>-添加2440單板,并實現(xiàn)NOR、NAND啟動
06-S3C2440學習之移植2012u-boot到S3C2440(移植過程一)新建單板+修改時鐘+SDRAM+UART
移植u-boot-2012.04之建新單板_時鐘_SDRAM_UART (1)新建單板目錄,以及配置頭文件 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2012.04.01 cd board/samsung/ cp smdk2410 smdk2440 –rf cd ../.. cd /include/configs/ cp smdk2410.h smdk2440.h (2) 修改 boards.cfg: 仿照 smdk2410 arm arm920t - samsung s3c24x0 添加: smdk244
[單片機]
06-S3C2440學習之<font color='red'>移植</font>2012u-boot到<font color='red'>S3C2440</font>(<font color='red'>移植</font>過程一)新建單板+修改時鐘+SDRAM+UART
S3C2440 Linux驅(qū)動移植——LED heartbeat
開發(fā)板:TQ2440 內(nèi)核:Linux 2.6.32 PC OS:Ubuntu 11.04 本文將對LED驅(qū)動的移植進行說明,本文的LED用于實現(xiàn)heartbeat,也就是系統(tǒng)啟動以后,led會想人類的心臟一樣,按固定頻率進行閃爍。 除非系統(tǒng)死機,否則LED是不會停止閃爍的。 1. 配置內(nèi)核,如下圖 2. 修改代碼 TQ2440開發(fā)板提供了4個LED可供用戶控制,本文用其中一個LED實現(xiàn)heartbeat功能。 該LED和GPB5號管腳相連。 打開文件arch/arm/plat-s3c24xx/common-smdk.c 將smdk_pdata_led4修改為 static struct s3c24xx_l
[單片機]
<font color='red'>S3C2440</font> Linux驅(qū)動<font color='red'>移植</font>——LED heartbeat
uboot啟動Linux內(nèi)核時undefined instruction錯誤
錯誤描述 U-Boot 1.1.6 (Oct 18 2011 - 15:23:51) for FriendlyARM MINI6410 CPU: S3C6410@532MHz Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) Board: MINI6410 DRAM: 256 MB Flash: 0 kB NAND: 256 MB In: serial Out: serial Err: serial MAC: 08:90:90:90:90:90 Hit any key to stop autob
[單片機]
記錄Ok6410 sd 啟動uboot
1\參考資料https://github.com/SeanXP/ARM-Tiny6410/tree/master/no-os/sd-no-os/u-boot 2\參考資料https://blog.csdn.net/xinxin_2011/article/details/85228961 3編譯sd ram128版本的uboot make ARCH=arm CROSS_COMPILE=$(編譯器路徑)/arm-linux- forlinx_sd_ram128_config make ARCH=arm CROSS_COMPILE=$(編譯器路徑)/arm-linux- all -j8 4操作編譯出來的u-boot.bin cat
[單片機]
記錄Ok6410 sd 啟動<font color='red'>uboot</font>
S3C6410-uboot詳細解讀之smdk6410.h
/* * (C) Copyright 2002 * Sysgo Real-Time Solutions, GmbH * Marius Groeger * Gary Jennejohn * David Mueller * * Configuation settings for the SAMSUNG SMDK6400(mDirac-III) board. * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribut
[單片機]
s3c2440啟動代碼學習筆記
啟動代碼: 設(shè)置中斷向量,順序為 RESET UDEF SWI PREFETCHUDEF DATAABT NOP      //保留地址 IRQ FIQ 共七個中斷向量 機器上電后從0x00000000地址執(zhí)行指令,到RESET處初始化系統(tǒng) 1.關(guān)閉Watchdog,否則cpu會不斷重啟 2. 如果需要使用C函數(shù)需要設(shè)置sp   注意每個工作模式都有自己的sp,需要設(shè)置,另外上電時內(nèi)存空間只有SteppingStone的4k內(nèi)部ram,sp不能超過4k   ATPCS規(guī)定棧為FD,sp指針必須指向棧頂元素,啟動代碼在跳轉(zhuǎn)到絕對地址運行之前必須使用相對跳轉(zhuǎn)指令 3.初始化SDRAM 4.設(shè)置cpu運行速度 5.復制運行代
[單片機]
s3c2440裸機-異常中斷(三. swi軟中斷)
#swi(軟中斷) 我們知道arm有7中工作模式,除了usr模式,其他6種都是特權(quán)模式。我們知道usr模式無法修改CPSR直接進入其他特權(quán)模式,但linux應(yīng)用程序一般運行在usr模式,既然usr模式權(quán)限非常低,是無法直接訪問硬件寄存器的,那么它是如何訪問硬件的呢? linux應(yīng)用程序是通過系統(tǒng)調(diào)用,從而進入內(nèi)核態(tài),運行驅(qū)動程序來訪問的硬件,那么系統(tǒng)調(diào)用又是如何實現(xiàn)的呢,就是通過軟中斷swi指令來進入svc模式,進入到svc模式后當然就能訪問硬件啦。 所以我們的應(yīng)用程序在usr模式想訪問硬件,必須切換模式,怎么切換? 有以下兩種方式: 1.發(fā)生異常或中斷(被動的) 2.swi + 某個值(主動的) 現(xiàn)在介紹如何進入軟中斷s
[單片機]
<font color='red'>s3c2440</font>裸機-異常中斷(三. swi軟中斷)
小廣播
設(shè)計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 十堰市| 时尚| 同江市| 阿坝| 托里县| 平顺县| 汕尾市| 伊金霍洛旗| 遂川县| 安徽省| 阜康市| 北碚区| 万年县| 隆子县| 盖州市| 阳新县| 双峰县| 博野县| 会东县| 遂川县| 皋兰县| 仙桃市| 晋中市| 醴陵市| 互助| 临澧县| 荃湾区| 抚顺县| 浦县| 祁连县| 新河县| 安福县| 丽水市| 商水县| 金川县| 城步| 辉南县| 卫辉市| 天柱县| 庄浪县| 曲沃县|