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

歷史上的今天

今天是:2024年10月11日(星期五)

正在發生

2018年10月11日 | 自己寫bootloader之OK6410

發布者:legend9 來源: eefocus關鍵字:bootloader  OK6410 手機看文章 掃描二維碼
隨時隨地手機看文章

start.S源碼:

.globl _start

_start:

// 硬件相關的設置 

    // Peri port setup 

    ldr r0, =0x70000000

    orr r0, r0, #0x13

    mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)

    

// 關看門狗 

// 往WTCON(0x7E004000)寫0 

    ldr r0, =0x7E004000

    mov r1, #0

    str r1, [r0]

    

    // 設置棧 

    ldr sp, =8*1024

    // 設置時鐘 

    bl clock_init

    bl ddr_init

    bl init_uart

    

// 清BSS 

// 把BSS段對應的內存清零 

clean_bss:

    ldr r0, =bss_start

    ldr r1, =bss_end

    mov r3, #0

    cmp r0, r1

    b copy_kernel

clean_loop:

    str r3, [r0], #4

    cmp r0, r1    

    bne clean_loop        

copy_kernel:

    mov r0, #0x200000

    ldr r1, =(0x50008000 - 64)

    mov r2, #0x500000

    bl copykernel2ddr    

    cmp r0, #0

    bne halt

    bl set_params

    mov r0, #0

    ldr r1, =1626

    ldr r2, =0x50000100

    ldr pc, =0x50008000

        

halt:

    b halt    

=====================================================================

clock.S源碼:

.globl clock_init

clock_init:

    

    // 1.設置LOCK_TIME 

    ldr r0, =0x7E00F000  // APLL_LOCK 

    ldr r1, =0x0000FFFF

    str r1, [r0]

    

    str r1, [r0, #4]            // MPLL_LOCK 

    str r1, [r0, #8]            // EPLL_LOCK     

    

#define OTHERS        0x7e00f900

    @ set async mode     // 當CPU時鐘 != HCLK時,要設為異步模式 

    ldr r0, =OTHERS

    ldr r1, [r0]

    bic r1, #0xc0            

    str r1, [r0]

loop1:                            // 等待,直到CPU進入異步模式 

    ldr r0, =OTHERS

    ldr r1, [r0]

    and r1, #0xf00                    

    cmp r1, #0

    bne loop1        

    // SYNC667 

    // MISC_CON[19] = 0 

#define ARM_RATIO    0     // ARMCLK = DOUTAPLL / (ARM_RATIO + 1)    

#define HCLKX2_RATIO 1   // HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) 

#define HCLK_RATIO   1     // HCLK = HCLKX2 / (HCLK_RATIO + 1)       

#define PCLK_RATIO   3     // PCLK   = HCLKX2 / (PCLK_RATIO + 1)     

#define MPLL_RATIO   0    // DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)     

    ldr r0, =0x7E00F020        // CLK_DIV0 

    ldr r1, =(ARM_RATIO) | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12)

    str r1, [r0]

    

    // 2.配置時鐘 

    // 2.1 配置APLL 

    // 2.1.1 設置APLL

    // 2.1.2 MUXAPLL

    // 2.1.3 SYNC667

    // 2.1.4 DIVAPLL

#define APLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))

    ldr r0, =0x7E00F00C

    ldr r1, =APLL_CON_VAL

    str r1, [r0]        // APLL_CON, FOUTAPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz  

    

    // 2.2 配置MPLL 

    // 2.2.1 設置MPLL

    // 2.2.2 MUXMPLL

    // 2.2.3 SYNCMUX

    // 2.2.4 SYNC667

    // 2.2.5 HCLKX2_RATIO

    // 2.2.6 PCLK_RATIO

#define MPLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))

    ldr r0, =0x7E00F010

    ldr r1, =MPLL_CON_VAL

    str r1, [r0]        // MPLL_CON, FOUTMPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz  

    

    // 3.選擇PLL的輸出作為時鐘源 

    ldr r0, =0x7E00F01C

    ldr r1, =0x03

    str r1, [r0]

    

    mov pc, lr

=====================================================================

sdram.c源碼:

#include "common.h"

#define MEMCCMD        0x7e001004

#define P1REFRESH         0x7e001010

#define P1CASLAT           0x7e001014

#define MEM_SYS_CFG    0x7e00f120

#define P1MEMCFG         0x7e00100c

#define P1T_DQSS           0x7e001018

#define P1T_MRD            0x7e00101c

#define P1T_RAS              0x7e001020

#define P1T_RC                0x7e001024

#define P1T_RCD              0x7e001028

#define P1T_RFC               0x7e00102c

#define P1T_RP                 0x7e001030

#define P1T_RRD              0x7e001034

#define P1T_WR                0x7e001038

#define P1T_WTR              0x7e00103c

#define P1T_XP                 0x7e001040

#define P1T_XSR               0x7e001044

#define P1T_ESR               0x7e001048

#define P1MEMCFG2       0X7e00104c

#define P1_chip_0_cfg      0x7e001200

#define P1MEMSTAT       0x7e001000

#define P1MEMCCMD     0x7e001004

#define P1DIRECTCMD    0x7e001008

#define HCLK    133000000

#define nstoclk(ns)    (ns/( 1000000000/HCLK)+1)

int ddr_init( void )

{

    // tell dramc to configure                

    set_val( MEMCCMD, 0x4 );

    // set refresh period    

    set_val( P1REFRESH, nstoclk(7800) );

    // set timing para        

    set_val( P1CASLAT, ( 3 << 1 ) );  

    set_val( P1T_DQSS, 0x1 );    // 0.75 - 1.25

    set_val( P1T_MRD, 0x2 );

    set_val( P1T_RAS, nstoclk(45) );

    set_val( P1T_RC, nstoclk(68) );        

    u32 trcd = nstoclk( 23 );

    set_val( P1T_RCD, trcd | (( trcd - 3 ) << 3 ) );

    u32 trfc = nstoclk( 80 );

    set_val( P1T_RFC, trfc | ( ( trfc-3 ) << 5 ) );   

    u32 trp = nstoclk( 23 );

    set_val( P1T_RP, trp | ( ( trp - 3 ) << 3 ) ); 

    set_val( P1T_RRD, nstoclk(15) );

    set_val( P1T_WR, nstoclk(15) );

    set_val( P1T_WTR, 0x7 );

    set_val( P1T_XP, 0x2 );

    set_val( P1T_XSR, nstoclk(120) );

    set_val( P1T_ESR, nstoclk(120) );

    

    // set mem cfg 

    set_nbit( P1MEMCFG, 0, 3, 0x2 );  // 10 column address 

    // set_nbit: 把從第bit位開始的一共len位消零,然后把這幾位設為val 

    

    set_nbit( P1MEMCFG, 3, 3, 0x3 );   // 14 row address 

    set_zero( P1MEMCFG, 6 );              // A10/AP 

    set_nbit( P1MEMCFG, 15, 3, 0x2 ); // Burst 4 

    

    set_nbit( P1MEMCFG2, 0, 4, 0x5 );

    set_2bit( P1MEMCFG2, 6, 0x1 );     // 32 bit 

    set_nbit( P1MEMCFG2, 8, 3, 0x3 ); // Mobile DDR SDRAM 

    set_2bit( P1MEMCFG2, 11, 0x1 );

    set_one( P1_chip_0_cfg, 16 );          // Bank-Row-Column organization 

    // memory init

    set_val( P1DIRECTCMD, 0xc0000 );  // NOP

    set_val( P1DIRECTCMD, 0x000 );      // precharge

    set_val( P1DIRECTCMD, 0x40000 );  // auto refresh

    set_val( P1DIRECTCMD, 0x40000 );  // auto refresh

    set_val( P1DIRECTCMD, 0xa0000 );  // EMRS

    set_val( P1DIRECTCMD, 0x80032 );  // MRS

    set_val( MEM_SYS_CFG, 0x0 );

    // set dramc to "go" status    

    set_val( P1MEMCCMD, 0x000 );

    // wait ready

    while( !(( read_val( P1MEMSTAT ) & 0x3 ) == 0x1));

    return 0;

}

=====================================================================

nand.c源碼:

#define MEM_SYS_CFG     (*((volatile unsigned long *)0x7E00F120))

#define NFCONF                (*((volatile unsigned long *)0x70200000))

#define NFCONT                (*((volatile unsigned long *)0x70200004))

#define NFCMMD              (*((volatile unsigned long *)0x70200008))

#define NFADDR               (*((volatile unsigned long *)0x7020000C))

#define NFDATA               (*((volatile unsigned char *)0x70200010))

#define NFSTAT                (*((volatile unsigned long *)0x70200028))

void nand_select(void)

{

    NFCONT &= ~(1<<1);

}

void nand_deselect(void)

{

    NFCONT |= (1<<1);

}

void nand_cmd(unsigned char cmd)

{

    NFCMMD = cmd;

}

void nand_addr(unsigned char addr)

{

    NFADDR = addr;

}

unsigned char nand_get_data(void)

{

    return NFDATA;

}

void nand_send_data(unsigned char data)

{

    NFDATA = data;

}

void wait_ready(void)

{

    while ((NFSTAT & 0x1) == 0);

}

void nand_reset(void)

{

    // 選中 

    nand_select();

    

    // 發出0xff命令 

    nand_cmd(0xff);

    // 等待就緒 

    wait_ready();

    

    // 取消選中 

    nand_deselect();

}

void nand_init(void)

{

#if 1

#define TACLS        7

#define TWRPH0    7

#define TWRPH1    7

    NFCONF &= ~((7<<4) | (7<<8) | (7<<12) | (1<<30));

    NFCONF |= ((TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4));

    // 使能nand flash controller 

    NFCONT |= 1;

    NFCONT &= ~(1<<16);

    

    nand_reset();

#else

    // 讓xm0csn2用作nand flash cs0 片選引腳 

    MEM_SYS_CFG &= ~(1<<1);

    // 設置時間參數 

#define TACLS     0

#define TWRPH0    1

#define TWRPH1    0

    NFCONF &= ~((1<<30) | (7<<12) | (7<<8) | (7<<4));

    NFCONF |= ((TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4));

    // 使能nand flash controller 

    NFCONT |= 1;

    NFCONT &= ~(1<<16); // 森止soft lock 

    nand_reset();

#endif

}

void nand_send_addr(unsigned int addr)

{

#if 0    

    unsigned int page = addr / 2048;

    // 這兩個地址表示從頁內哪里開始 

    nand_addr(addr & 0xff);

    nand_addr((addr >> 8) & 0xff);

    // 下面三個地址表示哪一頁 

    nand_addr(page & 0xff);

    nand_addr((page >> 8) & 0xff);

    nand_addr((page >> 16) & 0xff);

#elif 0

    nand_addr(addr & 0xff);              // a0~a7 

    nand_addr((addr >> 8) & 0x7);   // 程序的角度: a8~a10 

    nand_addr((addr >> 11) & 0xff); // 程序的角度: a11~a18 

    nand_addr((addr >> 19) & 0xff); // 程序的角度: a19~a26 

    nand_addr((addr >> 27) & 0xff); // 程序的角度: a27~    

#elif 1

    nand_addr(addr & 0xff);               // a0~a7 

    nand_addr((addr >> 8) & 0x7);    // 程序的角度: a8~a11 

    nand_addr((addr >> 12) & 0xff);  // 程序的角度: a12~a19 

    nand_addr((addr >> 20) & 0xff);  // 程序的角度: a20~a27 

    nand_addr((addr >> 28) & 0x01); // 程序的角度: a28~

#endif

}

int nand_read(unsigned int nand_start, unsigned int ddr_start, unsigned int len)

{

    unsigned int addr = nand_start;

    int i = nand_start % 4096;

    int count = 0;

    unsigned char *dest = (unsigned char *)ddr_start;

    

    // 選中芯片 

    nand_select();

    while (count < len)

    {

        // 發出命令0x00 

        nand_cmd(0x00);

        // 發出地址 

        nand_send_addr(addr);

        // 發出命令0x30 

        nand_cmd(0x30);

        // 等待就緒 

        wait_ready();

        // 讀數據 

        for (; i < 4096 && count < len; i++)

        {

            dest[count++] = nand_get_data();

            addr++;            

        }

        i = 0;        

    }

    // 取消片選 

    nand_deselect();

    return 0;

}

int nand_erase_block(unsigned long addr)

{

    int page = addr / 4096;

    

    nand_select();

    nand_cmd(0x60);

    

    nand_addr(page & 0xff);

    nand_addr((page >> 8) & 0xff);

    nand_addr((page >> 16) & 0xff);

    nand_cmd(0xd0);

    wait_ready();

    nand_deselect();

    return 0;

}

int nand_write(unsigned int nand_start, unsigned char * buf, unsigned int len)

{

    unsigned long count = 0;

    unsigned long addr  = nand_start;

    int i = nand_start % 4096;

    

    nand_select();

    while (count < len)

    {

        nand_cmd(0x80);

        nand_send_addr(addr);

        for (; i < 4096 && count < len; i++)

        {

            nand_send_data(buf[count++]);

            addr++;

        }

        nand_cmd(0x10);

        wait_ready();

        i = 0;        

    }

    nand_deselect();

    return 0;

}

int copykernel2ddr(unsigned int nand_start, unsigned int ddr_start, unsigned int len)

{

    int ret;

    

    // 初始化nand flash controller 

    nand_init();

    

    // 讀nand flash 

    ret = nand_read(nand_start, ddr_start, len);

    

    return ret;

}

=====================================================================

params.c源碼:

#include "setup.h"

static struct tag *params;

static void setup_start_tag (void)

{

    params = (struct tag *)0x50000100;

    params->hdr.tag = ATAG_CORE;

    params->hdr.size = tag_size (tag_core);

    params->u.core.flags = 0;

    params->u.core.pagesize = 0;

    params->u.core.rootdev = 0;

    params = tag_next (params);

}

static void setup_memory_tags (void)

{

    params->hdr.tag = ATAG_MEM;

    params->hdr.size = tag_size (tag_mem32);

    params->u.mem.start = 0x50000000;

    params->u.mem.size = 256*1024*1024;

    params = tag_next (params);

}

char * strcpy(char * dest,const char *src)

{

    char *tmp = dest;

    

    while ((*dest++ = *src++) != '\0')

    // nothing ;

    return tmp;

}

int strlen(const char * s)

{

    const char *sc;

    

    for (sc = s; *sc != '\0'; ++sc)

    // nothing ;

    

    return sc - s;

}

static void setup_commandline_tag (void)

{

    char *commandline = "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200";

    params->hdr.tag = ATAG_CMDLINE;

    params->hdr.size = (sizeof (struct tag_header) + strlen (commandline) + 1 + 3) >> 2;

    strcpy (params->u.cmdline.cmdline, commandline);

    params = tag_next (params);

}

static void setup_end_tag (void)

{

    params->hdr.tag = ATAG_NONE;

    params->hdr.size = 0;

}

void set_params(void)

{

    setup_start_tag();

    setup_memory_tags();

    setup_commandline_tag();

    setup_end_tag();

}

=====================================================================

uart.c源碼:


#include "s3c6410_regs.h"

//#define ENABLE_FIFO

void init_uart(void)

{

    GPACON &= ~0xff;

    GPACON |= 0x22;

    

    // ULCON0 

    ULCON0 = 0x3;                 // 數據位:8, 無較驗, 停止位: 1, 8n1 

    UCON0  = 0x5 | (1<<9);   // 使能UART發送、接收, tx interrupt request type = level 

#ifdef ENABLE_FIFO

    UFCON0 = 0x07 | (1<<6); // FIFO enable, tx fifo trigger level = 16 bytes     

#else

    UFCON0 = 0x00;               // FIFO disable 

#endif

    UMCON0 = 0;

    

    // 波特率 

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

    // bps = 57600

    // DIV_VAL = (66500000 / (115200 x 16 ) ) - 1 

    //         = 35.08

    UBRDIV0   = 35;

    // x/16 = 0.08

    // x = 1

     

    UDIVSLOT0 = 0x1;

}

unsigned char getc(void)

{

#ifdef ENABLE_FIFO

    while ((UFSTAT0 & (1<<6)) == 0 && (UFSTAT0 & 0x3f) == 0);

#else    

    while ((UTRSTAT0 & (1<<0)) == 0);

#endif

    return URXH0;

}

=====================================================================

自己寫bootloader啟動內核,QT文件系統:

測試:把內核源碼放到ubuntu先解壓:

tar xzf linux-3.0.1-2012-09-23.tar.gz

cd linux-3.0.1-2012-09-23/

make uImage

會在arch/arm/boot/目錄下生成uImage文件

開發板設為SD卡啟動,從SD卡啟動后按空格鍵運行SD卡里的u-boot來燒寫文件:

tftp 52000000 boot.bin

nand erase 0 200000

nand write 52000000 0 200000

tftp uImage 52000000

nand erase 200000 500000

nand write 52000000 200000 500000

斷電把開發板設為nand flash啟動,上電等uboot從nand flash中拷貝內核到DDR中再跳到DDR中運行即可看到內核啟動信息,要提前用SD卡把QT文件系統燒寫到nand flash中,內核才能掛載文件系統成功。


關鍵字:bootloader  OK6410 引用地址:自己寫bootloader之OK6410

上一篇:OK6410啟動自動掛載nfs文件系統
下一篇:OK6410裸機之LCD調色板

推薦閱讀

? ?在今年7月份谷歌由于違反反壟斷法,被歐盟處以43億歐元(約合人民幣335億元)重罰,這也創出全球反壟斷罰金的新紀錄。而就在這天價罰款前不久,歐盟也以搜索壟斷處罰了谷歌27億美元。據了解,除了罰款之外歐盟還要求谷歌對Android進行修改,同時禁止制造商銷售搭載競爭對手基于Android開源代碼編寫的操作系統的移動設備。對此,谷歌CEO Sundar Picha...
一、串行通信的通信方式1.同步通信:帶時鐘同步信號傳輸,有一根線是同步時鐘。例如SPI(全雙功)、IIC(半雙工)通信接口2.異步通信:不帶時鐘同步信號,必須約定好波特率。例如UART(全雙功)二、STM32的串口通信接口UART:通用異步收發器。USART:通用同步異步收發器。STM32F10x系列包含3個USART和2個UART。都是TTL電平交叉相連即可與PC機可以使用USB-T...
有些消費者日常覺得手機流量跑得很快,為了防止手機“偷跑”流量,中國電信特地發文揭秘手機流量“偷跑”的四大原因。1、后臺推送消息消耗流量:推送功能的實現必須建立在網絡連接的基礎上,才能檢測軟件更新以及消息提醒。因此你即使沒有主動上網,在網絡連接的情況下也會在后臺工作,必然會產生一定的流量。2、惡意軟件消耗流量:一旦用戶不慎將帶病毒的...
據IT之家網友反饋,Redmi K40 現已推送 MIUI 12.5.14 穩定版更新。  除優化和修復鎖屏、狀態欄、通知欄等方面的問題外,在 MIUI 12.5.14 穩定版中,Redmi K40 支持了內存擴展功能。  內存擴展功能開啟后,系統將提供額外的 3GB 運行內存。該功能會占用部分存儲空間,用戶需在存儲空間充裕時使用。▲ 圖自IT之家網友 @旅行的太...

史海拾趣

問答坊 | AI 解惑

問一個關于繼電器的問題

G6K-2F這樣的雙刀雙擲繼電器,它吸合的時候是雙刀一起吸合的嗎? 了解的麻煩告訴一下,謝謝。;P …

查看全部問答∨

求EVC開發周立功ARM10的串口通訊問題

我需要用周立功ARM10開發平臺操作伺服電動機,目前采用串口控制電動機方式,現在通過串口發出去的東西,不能控制電動機。程序已經發出去,請高手幫忙,需要微軟EVC環境。太感謝了,老總和客戶催催催,我頭都大了,搞不定,請求幫助,請高手幫忙解決 ...…

查看全部問答∨

calculated branching是什么意思?

初學MSP430,讀數據手冊過程中遇到一個問題,calculated branching是什么意思?翻譯是計算分支,難道對switch  case的優化?請知情者解答下!謝謝啊!…

查看全部問答∨

尋:zigbee圖片文件無線傳輸方案。

功能描述:把一個SD卡中的照片文件遠程傳到另一點的zigbee接收器中(也放SD卡作為存儲介質)。要求具有斷點續傳功能,比如一張圖片文件傳輸過程中意外中斷,要自動重新傳輸該圖片。要求傳輸距離2000米(視距)。 找相應的開發公司來做這個項目,合 ...…

查看全部問答∨

為什么我畫PCB的時候 一出來有些芯片就是綠色的呢 真是奇了怪了

有些芯片是我用向導生成的  而且FPGA芯片有的引腳是綠色的 有的是紅色的 有的電阻發綠有的發紅  真是不知怎么搞得很詭異   到底是哪些設計規則影響了他  求高手賜教…

查看全部問答∨

2012年北京國際通信展看什么?

     2012年中國國際信息通信展覽會于9月18日至23日在北京舉行。這屆通信展主題為\"智變中的ICT產業:開創應用和服務新時代\",著力展示新一代移動通信、下一代互聯網、三網融合、物聯網、云計算、集成電路、高端軟件、新型顯 ...…

查看全部問答∨

Hercules DIY By ddllxxrr 周報告匯總

我的報警器最關鍵的除了CPU自然是傳感器和執行部分了。 傳感器我選MQ-5 一、概述    QM-N5型氣敏元件是以金屬氧化物SnO2為主體材料的N型半導體氣敏元件,當元件接觸還原性氣體時,其電導率隨氣體濃度的增加而迅速升高。二、特點&nbs ...…

查看全部問答∨

我就不說瑞薩單片機有四個PWM。。。。

本帖最后由 paulhyde 于 2014-9-15 03:09 編輯 而且硬件I2C。。。。。而且有倆UART。。。。而且有乘法器。。。運算還可以。。。。    …

查看全部問答∨

半導體、IC生產線上的靜電危害

     ①靜電庫侖力的危害:靜電庫侖力作用下吸附的粉塵、污物,可能帶給元器件,從而增大泄露或造成短路,使性能受損,成品率大大下降。如粉塵粒徑>100微米,鋁線寬度約100微米,薄膜厚度在50微米以下時,最易使產品報廢,這種情形多發 ...…

查看全部問答∨

貌似CCSv6的串口控制臺爆BUG了.

官方例程都毫無顯示,波特率各種參數都是對的,不知道大家是不是這樣的呢.[串口工具在Windows - Show View - Other - Terminal - Terminal] …

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 贞丰县| 陇南市| 灵台县| 定结县| 黄冈市| 正宁县| 兴海县| 收藏| 长泰县| 紫金县| 武隆县| 嘉黎县| 固原市| 天津市| 青神县| 望谟县| 台前县| 新野县| 洛宁县| 宿州市| 福鼎市| 盐城市| 阜新市| 阿巴嘎旗| 武安市| 攀枝花市| 青神县| 东乡县| 嵊泗县| 左权县| 秦安县| 和平县| 洪洞县| 阿坝县| 临沂市| 东乌珠穆沁旗| 香港| 高邑县| 永仁县| 龙岩市| 仁布县|