新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Uboot對非Linux kernel的引導

        Uboot對非Linux kernel的引導

        作者: 時間:2016-09-12 來源:網絡 收藏

        實現了uboot對非linux kernel的引導。雖然有一個IH_TYPE_STANDALONE,但是沒有實現。nnd。只能自己想辦法。實現詳細見下面。

        本文引用地址:http://www.104case.com/article/201609/305147.htm

        1、兩個命令

        set bootcmd tftp 84000000 uImage;bootm 84000000

        set bootdelay 1

        2、非linux kernel的引導實現方法:

        一共三個函數: jump,selectboot 和 system_boot

        把jump放在需要跳轉的地方,參數就是要跳轉的地址。然后返回,重啟系統。select放在main的開頭。通過判斷ram的特定地址的特定信息實現跳轉。

        system_boot實現系統的重新啟動

        #define FDMA_SRAM_TOP_ADDRESS 0xB9229800

        #define MAGIC_NUM 0x71097100

        #define DEAD_PATTERN 0xBAD0BADF

        #define ST40_CPG_REGS_BASE 0xFFC00000#define

        ST40_CPG_WTCNT (ST40_CPG_REGS_BASE + 0x08)

        #define ST40_CPG_WTCSR (ST40_CPG_REGS_BASE + 0x0C)

        #define ST40_CPG_WTCSR2 (ST40_CPG_REGS_BASE + 0x1C)

        void Jump(unsigned int address)

        {

        STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*1, MAGIC_NUM);

        STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*2, address);

        STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*3, ~address);

        STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*4, ~MAGIC_NUM);

        STSYS_WriteRegDev16LE(ST40_CPG_WTCNT, 0x5AF0); /*Watchdog counter*/

        STSYS_WriteRegDev16LE(ST40_CPG_WTCSR, 0xA547); /*Watchdog control*/

        STSYS_WriteRegDev16LE(ST40_CPG_WTCSR2, 0xAA00); /*Watchdog control2*/

        STSYS_WriteRegDev16LE(ST40_CPG_WTCSR, 0xA5C7); /*Start watchdog counter*/ for(;;);

        }

        void SelectBoot(void)

        {

        unsigned int MagicNum = 0;

        unsigned int NotMagicNum = 0;

        unsigned int JumpAddress = 0;

        unsigned int NotJumpAddress = 0; void (*entry)(void);

        /* entry=0xa0100000;

        entry();*/ //if((STSYS_ReadRegDev16LE(ST40_CPG_WTCSR2) 0xFF) != 0x0)

        {

        MagicNum = STSYS_ReadRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*1);

        JumpAddress = STSYS_ReadRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*2);

        NotJumpAddress = STSYS_ReadRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*3);

        NotMagicNum = STSYS_ReadRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*4);

        if((MagicNum == MAGIC_NUM)

        (MagicNum == (~NotMagicNum))

        (JumpAddress == (~NotJumpAddress)))

        {

        entry = (void (*)(void))JumpAddress;

        STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*1, DEAD_PATTERN);

        STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*2, DEAD_PATTERN);

        STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*3, DEAD_PATTERN);

        STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*4, DEAD_PATTERN);

        #if 0/*Setup For watchdog in case jump failed.*/

        STSYS_WriteRegDev16LE(ST40_CPG_WTCNT, 0x5AF0);

        STSYS_WriteRegDev16LE(ST40_CPG_WTCSR, 0xA543);

        STSYS_WriteRegDev16LE(ST40_CPG_WTCSR2, 0xAA01);

        STSYS_WriteRegDev16LE(ST40_CPG_WTCSR, 0xA5C7);

        #endif entry(); while(1);

        }

        }

        }void system_reboot(void)

        {

        ulong sr;

        asm (stc sr, %0:=r (sr));

        sr  = (1 28); /* set block bit */

        asm (ldc %0, sr: :r (sr));

        asm volatile (trapa #0);

        }



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 长汀县| 东方市| 大竹县| 洛扎县| 个旧市| 大宁县| 新丰县| 吉林市| 衡南县| 石阡县| 昌平区| 呼玛县| 扶余县| 宜都市| 连城县| 上杭县| 长春市| 津南区| 黎平县| 综艺| 理塘县| 恩平市| 平度市| 娱乐| 射洪县| 六安市| 安国市| 南乐县| 鄂尔多斯市| 东港市| 丹棱县| 五台县| 伊川县| 平昌县| 静海县| 芮城县| 通河县| 明溪县| 金华市| 内乡县| 南漳县|