亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        嵌入式平臺S3C6410的UBoot分析與移植*

        2017-11-24 11:54:35,
        關(guān)鍵詞:嵌入式指令設置

        ,

        (1.西南交通大學 信息科學與技術(shù)學院,成都 611756;2.西南交通大學 交通與運輸學院)

        ldrpc, _start_armboot

        _start_armboot:

        .word start_armboot

        董君,倪少權(quán)2

        (1.西南交通大學 信息科學與技術(shù)學院,成都 611756;2.西南交通大學 交通與運輸學院)

        詳細分析基于S3C6410的嵌入式平臺的U-Boot源代碼和啟動過程。在此基礎上成功移植了U-Boot軟件,實現(xiàn)了S3C6410處理器時鐘初始化、串口通信、內(nèi)存初始化、MMU初始化、NAND Flash初始化。通過移植NAND Flash驅(qū)動,實現(xiàn)讀寫NAND Flash和從NAND Flash啟動的功能,使得整個系統(tǒng)能夠正常運行。

        U-Boot;分析;移植;NAND Flash驅(qū)動

        引 言

        U-Boot全稱 Universal BootLoader,是遵循GPL條款的開放源碼項目。U-Boot在嵌入式設備中起著初始化硬件、引導系統(tǒng)、為操作系統(tǒng)做準備的作用,因此分析與移植U-Boot有著重要的意義。

        首先找到board/samsung/smdk6410/的u-boot.lds(連接器腳本),連接器腳本的作用主要是配置U-Boot程序的布局,由其中的.text部分可知,第一部分代碼從cpu/s3c64xx/start.S開始執(zhí)行。因此分析start.S是U-Boot分析的第一階段。

        (1)建立異常向量表

        由于ARM處理器有7種異常,分別是:復位、未定義指令、軟中斷、指令預取終止、數(shù)據(jù)終止、外部中斷請求、快速中斷請求,所以有7個異常向量。

        (2)設置處理器工作模式

        設置ARM的運行模式為32位管理模式。

        (3)CPU初始化

        首先沖洗指令/數(shù)據(jù)緩存、關(guān)閉MMU和cache、設置外設基地址。接著通過bl lowlevel_init指令跳轉(zhuǎn)到標號 lowlevel_init處執(zhí)行,其位于boardsamsungsmdk6410下。

        (4)點亮LED/關(guān)閉看門狗/關(guān)閉中斷

        點亮LED能夠檢驗之前的步驟是否正確,關(guān)閉看門狗/中斷能夠讓系統(tǒng)不受外界的影響正常啟動。S3C6410中斷控制器有64個中斷源,其中有VIC0和VIC1兩個中斷矢量控制器。

        (5)S3C6410時鐘初始化

        S3C6410系統(tǒng)控制器主要包含系統(tǒng)時鐘控制單元和系統(tǒng)電源管理單元,其中時鐘控制單元主要包括APLL、 MPLL、 EPLL三個鎖相環(huán)。

        APLL主要供給S3C6410核心ARM1176使用,最大能達到667 MHz,一般為533 MHz。MPLL主要給系統(tǒng)時鐘使用,主要用在AXI、AHB和 APB總線,在AXI/AHB上時鐘最大能達133 MHz,在APB上能達到66 MHz。EPLL主要給外圍的設備提供時鐘。三星提供了可供選擇的時鐘配置參數(shù):APLL=533 MHz,MPLL=266 MHz,HCLKX2=266 MHz,HCLK=133 MHz,PCLK=66 MHz。

        S3C6410時鐘配置步驟如下:

        ① 首先配置APLL_CON/MPLL_CON寄存器,根據(jù)三星提供的配置參數(shù),當FIN=12 MHz,輸出為533 MHz時,MDIV=266,PDIV=3, SDIV=1。

        ② 設置分頻系數(shù),S3C6410主要有三個控制器存器CLK_DIV0、CLK_DIV1、CLK_DIV2。APLL 和MPLL 輸出的頻率由CLK_DIV0中的ARM_RATIO、MPLL_RATIO決定。HCLKX2、HCLK、PCLK頻率分別由CLK_DIV0中的HCLKX2_RATIO、HCLK_RATIO、PCLK_RATIO決定。參考值:ARM_RATIO =0,MPLL_RATIO=1,HCLKX2_RATIO=1,HCLK_RATIO=1,PCLK_RATIO=3。

        (6)串口初始化

        S3C6410串口控制器主要是UART(通用異步接收發(fā)送器)。S3C6410的UART提供了4路獨立的異步串行I/O端口,每個UART主要包含控制單元、波特率發(fā)生器、發(fā)送器、接收器。波特率需要的時鐘源可以是PCLK, EXT_UCLK0 或者EXT_UCLK1。

        S3C6410寄存器主要包括:ULCONn(線控制寄存器),控制數(shù)據(jù)傳輸格式,主要包含一個起始位、5~8個數(shù)據(jù)位、1個奇偶校驗位和1~2個停止位;UCONn(UART控制寄存器),選擇產(chǎn)生UART波特率的時鐘,控制數(shù)據(jù)傳輸/接收方式(中斷/輪詢)等;UFCONn(UART FIFO控制器寄存器),選擇是否啟用FIFO(主要是用來存儲發(fā)送/接收的數(shù)據(jù));UTRSTATn(UART 發(fā)送/接收寄存器),第0位和第1位分別表示接收和發(fā)送數(shù)據(jù)的緩沖的狀態(tài);UTXHn/URXHn,8位發(fā)送/接收數(shù)據(jù)寄存器;UBRDIVn,波特率配置器存器。

        波特率計算公式:

        DIV_VAL=(PCLK /(bps×16 ))-1

        DIV_VAL=(EXT_UCLKn/(bps×16))-1(n=0/1)

        UBRDIVn=DIV_VAL的整數(shù)部分

        UDIVSLOTn= DIV_VAL的小數(shù)部分×16

        (7)NANDFlash初始化

        NAND Flash時序初始化,主要配置寄存器NFCONF中的TACLS=7、TWRPH0=7、WRPH1=7。使能NAND Flash,主要寄存器NFCONT中的MODE=1、Reg_nCE0=0。

        (8)內(nèi)存初始化

        內(nèi)存初始化主要是配置其中的寄存器,主要包括P1REFRESH、P1CASLAT、P1T_DQSS、P1T_MRD、P1T_RAS、P1T_RC、P1T_RCD等一系列寄存器,對應的U-Boot源碼在cpu_init.S文件中。

        (9)U-Boot將代碼從NANDFlash拷貝到內(nèi)存中

        本次移植使用的開發(fā)板CPU是S3C6410, 其steppingstone(0xc00 0000~0xc00 1fff)。

        ldr r0, =0xff00 0fff

        bic r1, pc, r0

        ldr r2, _TEXT_BASE

        bic r2, r2, r0

        cmp r1, r2

        mov r0, #0x1000

        bl copy_from_nand

        當前的PC值是在0xc00 0000~0xc00 1fff之間,執(zhí)行bic r1, pc, r0 將PC高8位和低12位清零,得到0x0~0x1000(這是在steppingstone中運行r1的值)。_TEXT_BASE = 0xc7e0 0000 ,執(zhí)行bic r2, r2, r0后 r2的范圍為0xe0 0000~0xef f000),因為開啟了MMU。經(jīng)過比較后執(zhí)行bl copy_from_nand 指令(主要是拷貝4 KB大小的數(shù)據(jù)到內(nèi)存中0x57e0 0000)。

        (10)開啟MMU

        首先建立映射表(從虛擬地址到物理地址的映射,主要是段映射)。由lowlevel_init.S(mmu_table)可知:第一段主要是用來調(diào)試,可讀(0~0xa000 0000)(2560 MB);第二段保留(0xa000 0000~0xc000 0000)-->(512 MB);第三段是主要用來映射的(128 MB)-->將虛擬基地址0xc000 0000 映射到物理基地址0x5000 0000;第三段沒法訪問(896 MB)。

        然后設置TTB寄存器,將建立的映射表的基地址寫入到TTB寄存器中:mcrp15, 0, r1, c2, c0, 0。

        接著使能MMU:mcrp15, 0, r0, c1, c0, 0。

        (11)設置棧

        因為開啟了MMU,所以棧的大小為:ldrsp=(CFG_UBOOT_BASE + CFG_UBOOT_SIZE - 0xc),其中CFG_UBOOT_BASE=0xc7e0 0000、CFG_UBOOT_SIZE=2 MB。

        (12)清除BSS段

        主要是為后面的數(shù)據(jù)使用。

        (13)跳轉(zhuǎn)到start_armboot

        ldrpc, _start_armboot

        _start_armboot:

        .word start_armboot

        當執(zhí)行了上面的指令后,PC執(zhí)行絕對跳轉(zhuǎn)到內(nèi)存中,PC的值應該是0xc7e0 0000 之后的某個值(開啟了MMU)。

        關(guān)于bl指令和ldr指令:bl指令是相對跳轉(zhuǎn)指令,只是相對當前PC的值跳轉(zhuǎn),跳轉(zhuǎn)大小編譯器編譯時就已確定。ldr指令是絕對跳轉(zhuǎn)指令,PC的值會變成賦給的值。這也是這里用ldr的原因。

        (1)設置結(jié)構(gòu)體gd_t和bd_t

        gd_t主要用來存儲全局數(shù)據(jù)區(qū)的數(shù)據(jù)。bd_t主要用來存放板級相關(guān)的全局數(shù)據(jù)。U-Boot啟動內(nèi)核時要給內(nèi)核傳遞參數(shù),需要用gd_t和bd_t中的數(shù)據(jù)來設置標記列表。

        (2)執(zhí)行init_sequence數(shù)組中的函數(shù)

        通過調(diào)用在init_sequence指針數(shù)組中的函數(shù)指針,從而執(zhí)行相應的函數(shù),接下來分析主要的函數(shù)。

        ? board_init( )

        主要配置開發(fā)板的信息,初始化網(wǎng)卡,設置GPIO寄存器,設置U-Boot機器碼和內(nèi)核啟動參數(shù)地址。

        ? interrupt_init( )

        該函數(shù)主要是配置定時器,為系統(tǒng)運行提供相應的時間。

        ? env_init( )

        初始化gd_t中環(huán)境變量,這里是系統(tǒng)默認的環(huán)境變量default_environment[0]。

        ? init_baudrate( )

        初始化波特率,即gd->baudrate = 115200。

        ? dram_init( )

        填充gd_t的內(nèi)存信息,start = 0x5000 0000; size = 256M

        ? flash_init( )

        初始化Flash的起始地址、bank數(shù)目,主要是放在flash_info[ ]中。

        ? nand_init( )

        取得Nandflash的信息,放在nand_chip和nand_dev_desc結(jié)構(gòu)體中。

        ? env_relocate()

        將環(huán)境變量地址重新定位,將新的地址賦值給gd->env_addr(主要涉及到數(shù)據(jù)的搬移Nandflash->Dram)。

        ? 填充gd_t中bd的IP地址/MAC地址

        gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");

        gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0。

        ? devices_init()

        初始化設備列表,作者這里為空。

        ○k jumptable_init()

        初始化跳轉(zhuǎn)表,填充gd_t中的jt指針數(shù)組里面的元素(函數(shù)),后面可以快速執(zhí)行里面的函數(shù)。

        ○l console_init_r( )

        初始化控制臺,初始化標準輸入、輸出、和錯誤設備。

        使能中斷。

        填充硬件MAC地址。

        進入main_loop循環(huán),執(zhí)行第三階段的代碼(實際上是兩階段),在mian_loop循環(huán)中主要執(zhí)行的主要代碼是:

        s = GETenv ("bootcmd");

        if (bootdelay >= 0 && s && !abortboot (bootdelay)) {

        run_command (s, 0); }

        首先獲取bootcmd環(huán)境變量,然后調(diào)用run_command( )函數(shù)來執(zhí)行相應的命令。bootm命令執(zhí)行的路線:bootm->do_bootm()->do_bootm_Linux()->theKernel( )。最后通過調(diào)用theKernel函數(shù)從而執(zhí)行Linux內(nèi)核代碼,U-Boot引導功能完成,將控制權(quán)交給內(nèi)核。

        3 移植NAND Flash驅(qū)動

        NAND Flash是嵌入式設備中最常用的存儲設備。通常將移植好的U-Boot燒寫到NAND Flash中,直接從NAND Flash里面啟動U-Boot。

        首先要配置NAND Flash的控制時序位和使能位(之前),通過CONFIG_NAND來控制。然后在Nand_ids.c文件中找到結(jié)構(gòu)體nand_flash_ids,添加相應的NAND Flash設備信息——{“NAND 1GiB 3,3V 8-bit”,0xD3, 0, 1024, 0, LP_OPTIONS},其已經(jīng)在U-Boot中存在。最后重新編譯U-Boot,然后燒寫到NAND Flash中,從NAND Flash啟動開發(fā)板,U-Boot順利啟動,啟動頁面如圖1所示。

        圖1 U-Boot順利啟動后顯示情況

        結(jié) 語

        [1] 田澤.嵌入式系統(tǒng)開發(fā)與應用[M].北京:北京航空航天大學出版社,2005.

        [2] 鄭靈翔.嵌入式Linux系統(tǒng)設計[M].北京:北京航空航天大學出版社,2008.

        [3] 范展源,劉韜.深度實踐嵌入式Linux系統(tǒng)移植[M].北京:機械工業(yè)出版社,2015.

        [4] 韋東山.嵌入式Linux應用開發(fā)完全手冊[M].北京:人民郵電出版社,2008.

        [5] 何景波,孫運強,姚愛琴.U-Boot在嵌入式系統(tǒng)上的移植分析與實現(xiàn)[J].機械工程與自動化,2009(4).

        [6] 黃薦渠,秦東興,趙曦,等.U-Boot的啟動及移植分析[J].微計算機信息,2008(11).

        [7] 楊帆,顧亞平,彭翔,等.一種小型嵌入式Linux Boot Loader的設計與實現(xiàn)[J].計算機應用與軟件,2008(1):225-226.

        [8] Sumsuang Electronics.S3C6410x User’s Manual,2008.

        [9] Sumsuang Electronics.K9F2G08UXA Datasheet,2007.

        董君(碩士研究生),主要研究方向為交通運輸信息技術(shù);倪少權(quán)(博士),主要研究方向為計算機編制列車運行圖、交通運輸信息技術(shù)、鐵路行車組織、物流信息技術(shù)。

        AnalysisandPortingofU-BootinEmbeddedPlatformS3C6410

        DongJun1,NiShaoquan2

        (1.School of Information Science and Technology,Southwest Jiaotong University,Chengdu 611756,China;2.School of Transportation and Logistics,Southwest Jiaotong University)

        In the paper,the U-Boot source code and start process based on S3C6410 embedded platform are analyzed.On the basis, the U-Boot software is successfully ported and S3C6410 processor clock initialization,serial communication,memory initialization,MMU initialization and NAND Flash initialization are realized.Through the porting of NAND Flash driver,the read and write NAND Flash and start from NAND Flash are realized. So that the whole system can operate normally.

        U-Boot;analysis;porting;NAND Flash driver

        國家自然基金項目(61403317,61273242,60776826);中國鐵路總公司科技研究計劃項目(2016X006-D);四川省科技計劃項目(2017ZR0149,2017RZ0007);中央高?;究蒲袠I(yè)務費專項資金資助(2682017ZDPY04,2682017CX022)。

        TP368.1

        A

        2017-08-15)

        猜你喜歡
        嵌入式指令設置
        聽我指令:大催眠術(shù)
        中隊崗位該如何設置
        少先隊活動(2021年4期)2021-07-23 01:46:22
        ARINC661顯控指令快速驗證方法
        LED照明產(chǎn)品歐盟ErP指令要求解讀
        電子測試(2018年18期)2018-11-14 02:30:34
        搭建基于Qt的嵌入式開發(fā)平臺
        嵌入式軟PLC在電鍍生產(chǎn)流程控制系統(tǒng)中的應用
        本刊欄目設置說明
        中俄臨床醫(yī)學專業(yè)課程設置的比較與思考
        Altera加入嵌入式視覺聯(lián)盟
        倍福 CX8091嵌入式控制器
        自動化博覽(2014年4期)2014-02-28 22:31:15
        内射中出无码护士在线| 24小时免费在线观看av| 国产a∨天天免费观看美女| 男女性高爱潮免费网站| 无码日韩AⅤ一区二区三区| 男男互吃大丁视频网站| 大香蕉av一区二区三区| 丰满岳乱妇一区二区三区| 狠狠久久久久综合网| 粉嫩av一区二区在线观看| 日本乱码一区二区三区在线观看| 天天摸夜夜摸夜夜狠狠摸| 精品无码一区二区三区爱欲九九| 亚洲无码毛片免费视频在线观看| 日韩一区二区三区熟女| 亚洲日韩久久综合中文字幕| 狠狠爱无码一区二区三区| 亚洲最新中文字幕一区| av中国av一区二区三区av| 欧美人妻少妇精品久久黑人| 老熟妇仑乱一区二区视頻| 亚洲中文字幕熟女五十| 国语对白福利在线观看| 亚洲av无码一区二区三区观看| 亚洲AV秘 无码二区在线| 人妻少妇中文字幕av| 夫妻免费无码v看片| 久久人人爽人人爽人人片av麻烦 | 免费观看的av毛片的网站| 成人无码h真人在线网站| 人妻少妇激情久久综合| 久久精品国产99久久久| 99久久久无码国产精品试看| 亚洲高清中文字幕精品不卡| 天堂免费av在线播放| 免费人成视频x8x8入口| 2022Av天堂在线无码| 天堂精品人妻一卡二卡| 亚洲av香蕉一区区二区三区| 亚洲肥老太bbw中国熟女| 激情五月天俺也去综合网|