日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uboot启动流程概述_uboot 分析之 启动流程

發(fā)布時間:2025/3/20 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uboot启动流程概述_uboot 分析之 启动流程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

uboot的啟動流程:

看一幅圖:

1.第一階段:start.s的內(nèi)容:

點擊(此處)折疊或打開

#include @該文件是第二步中mkconfig文件執(zhí)行時創(chuàng)建的。include/config.h

#include

#include @在include目錄下。

/*

*************************************************************************

*

* Jump vector table as in table 3.1 in [1]

*

*************************************************************************

*/

@這是一個異常跳轉(zhuǎn)表,

.globl _start

_start:

b start_code @start_code才是真正的啟動代碼

ldr pc, _undefined_instruction

ldr pc, _software_interrupt

ldr pc, _prefetch_abort

ldr pc, _data_abort

ldr pc, _not_used

ldr pc, _irq

ldr pc, _fiq

_undefined_instruction: .word undefined_instruction @在標號_undefined_instruction處存儲了一個變量,該變量也是一個標號地址

_software_interrupt: .word software_interrupt @執(zhí)行上面的ldr pc, _undefined_instruction;指令會將變量undefined_instruction的值裝入PC

_prefetch_abort: .word prefetch_abort @pc指向一個地址,CPU從該地址中取指執(zhí)行

_data_abort: .word data_abort

_not_used: .word not_used

_irq: .word irq

_fiq: .word fiq

.balignl 16,0xdeadbeef

/*

*************************************************************************

*

* Startup Code (called from the ARM reset exception vector)

*

* do important init only if we don't start from memory!

* relocate armboot to ram

* setup stack

* jump to second stage

*

*************************************************************************

*/

_TEXT_BASE:

.word TEXT_BASE @變量TEXT_BASE由連接腳本指定,

.globl _armboot_start

_armboot_start:

.word _start@_start是在起始代碼處定義的標號,當跳到_armboot_start后還是會跳轉(zhuǎn)到_start

/*

* These are defined in the board-specific linker script.

*/

.globl _bss_start

_bss_start:

.word __bss_start @這是board/mini2440/u-boot.lds腳本中的變量,

.globl _bss_end

_bss_end:

.word_end @這也是board/mini2440/u-boot.lds腳本中的變量,

#ifdef CONFIG_USE_IRQ @這個宏在include/configs/$(board_name).h中定義。可以取消

/* IRQ stack memory (calculated at run-time) */

.globl IRQ_STACK_START

IRQ_STACK_START:

.word 0x0badc0de

/* IRQ stack memory (calculated at run-time) */

.globl FIQ_STACK_START

FIQ_STACK_START:

.word 0x0badc0de

#endif

/*

* the actual start code

*/

start_code: @這是真正的啟動代碼

/*?set the cpu to SVC32 mode*/

mrs r0,cpsr

bic r0,r0,#0x1f

orr r0,r0,#0xd3

msr cpsr,r0

bl coloured_LED_init @這個函數(shù)在status_led.h中被提升了作用域,但是在哪里面實現(xiàn)??status_led.h文件

bl red_LED_on @同上

@下面這些宏開關(guān)也是在include/configs/$(board_name).h中定義??

#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF)

/*

* relocate exception table

*/

ldr r0, =_start

ldr r1, =0x0

mov r2, #16

copyex:

subs r2, r2, #1

ldr r3, [r0], #4

str r3, [r1], #4

bne copyex

#endif

@下面這些宏開關(guān)是在include/configs/$(board_name).h中定義

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)

/* turn off the watchdog */

# if defined(CONFIG_S3C2400)

# define pWTCON 0x15300000

# define INTMSK 0x14400008 /* Interupt-Controller base addresses */

# define CLKDIVN 0x14800014 /* clock divisor register */

#else

# define pWTCON 0x53000000

# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */

# define INTSUBMSK 0x4A00001C

# define CLKDIVN 0x4C000014 /* clock divisor register */

# endif

#define CLK_CTL_BASE 0x4c000000

#define MDIV_405 0x7f<<12

#define PSDIV_405 0x21

#define UPLL_MDIV_48 0x38<<12

#define UPLL_PSDIV_48 0x22

#define MDIV_200 0xa1<<12

#define PSDIV_200 0x31

ldr r0, =pWTCON

mov r1, #0x0

str r1, [r0]

/*

* mask all IRQs by setting all bits in the INTMR - default

*/

mov r1, #0xffffffff

ldr r0, =INTMSK

str r1, [r0]

# if defined(CONFIG_S3C2410)

ldr r1, =0x3ff

ldr r0, =INTSUBMSK

str r1, [r0]

# endif

/*add by gray*/

#if defined(CONFIG_S3C2440)

ldr r1, =0x7fff

ldr r0, =INTSUBMSK

str r1, [r0]

#endif

/*add by gray,這里是修改后的,其實可以在uboot啟動的第二階段start_armboot()函數(shù)里調(diào)用board_init()函數(shù)時重置CPU鐘

對于S3C2440,MPLL(clk)=(2 * m * Fin) / p * 2^s,

m = MDIV + 8, p = PDIV + 2, s =?SDIV.

這里MDIV =? 0x7f, PDIV = 0x2 ,SDIV = 0x1

*/

#if defined(CONFIG_S3C2440)

/*FCLK:HCLK:PCLK=1:2:4*/

ldr r0, =CLKDIVN

mov r1, #5

str r1,[r0]

mrc p15,0,r1,c1,c0,0 /*read ctrl reg*/

orr r1,r1,#0xc0000000 /*ASYN*/

mcr p15,0,r1,c1,c0,0 /*write ctrl reg*/

mov r1,#CLK_CTL_BASE

mov r2,#UPLL_MDIV_48

add r2, r2,#UPLL_PSDIV_48

str r2,[r1,#0x08] /*write UPLL first,48MHZ*/

mov r2,#MDIV_405

add r2,r2,#PSDIV_405 /*mpll_405MHZ*/

str r2,[r1,#0x04] /*MPLLCON*/

#else

/*F:H:P=1:2:4*/

ldr r0, =CLKDIVN

mov r1, #3

str r1,[r0]

mrc p15,0,r1,c1,c0,0 /*read ctrl reg*/

orr r1,r1,#0xc0000000

mcr p15,0,r1,c1,c0,0

mov r1,#CLK_CTL_BASE

mov r2,#MDIV_200

add r2,r2,#PSDIV_200 /*mpll_200MHZ*/

str r2,[r1,#0x04] /*MPLLCON*/

#endif

#endif /*CONFIG_S3C2400 || CONFIG_S3C2410 || CONFIG_S3C2440*/

/*

* we do sys-critical inits only at reboot,

* not when booting from ram!

*/

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

bl cpu_init_crit @如果沒有定義CONFIG_SKIP_LOWLEVEL_INIT,就進行嚴格的初始化,調(diào)用lowlevel_init函數(shù)

#endif

#ifndef CONFIG_AT91RM9200 @AT91RM9200評估板,基于ARM920T內(nèi)核

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

/* relocate U-Boot to RAM */

relocate:

adr r0, _start ?/* r0

ldr r1, _TEXT_BASE /* test if we run from flash or RAM */

cmp r0, r1 /* don't reloc during debug */

beq stack_setup ? /*如果_start與_TEXT_BASE相等,就直接跳去stack_setup進行棧的設(shè)置, 否則就要進行代碼的拷貝,把代碼拷貝到內(nèi)存中*/

ldr r2, _armboot_start

ldr r3, _bss_start @計算代碼段大小=_bss_start-_armboot_start

sub r2, r3, r2 /* r2

add r2, r0, r2 /* r2

@ r2 = _start的地址+代碼段大小

copy_loop:

ldmia r0!, {r3-r10} /* copy from source address [r0] */

stmia r1!, {r3-r10} /* copy to target address [r1] */

cmp r0, r2 /* until source end addreee [r2] */

ble copy_loop

#endif /* CONFIG_SKIP_RELOCATE_UBOOT */

#endif

/* Set up the stack,設(shè)置棧 */

stack_setup:

ldr r0, _TEXT_BASE /*upper 128 KiB: relocated uboot */

sub r0, r0, #CFG_MALLOC_LEN /* malloc area,這是堆區(qū) */

sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */

#ifdef CONFIG_USE_IRQ @如果定義了IRQ,就要為IRQ,FIQ分配中斷棧。

sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

#endif

sub sp, r0, #12 /* leave 3 words for abort-stack */

clear_bss: @清除bss段,_bss_start 和_bss_end就是u-boot.lds腳本傳入的變量

ldr r0, _bss_start /* find start of bss segment */

ldr r1, _bss_end /* stop here */

mov r2, #0x00000000 /* clear */

clbss_l:str r2, [r0] /* clear loop... */

add r0, r0, #4

cmp r0, r1

ble clbss_l

ldr pc, _start_armboot

_start_armboot: .word start_armboot @跳到start_armboot()函數(shù)執(zhí)行,進入uboot的第二階段

/*

*************************************************************************

*

* CPU_init_critical registers

*

* setup important registers

* setup memory timing

*

*************************************************************************

*/

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

cpu_init_crit: @進行嚴格的初始化,關(guān)閉I/D caches,MMU,

/*

* flush v4 I/D caches

*/

mov r0, #0

mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */

mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */

/*

* disable MMU stuff and caches

*/

mrc p15, 0, r0, c1, c0, 0

bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)

bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)

orr r0, r0, #0x00000002 @ set bit 2 (A) Align

orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache

mcr p15, 0, r0, c1, c0, 0

/*

* before relocating, we have to setup RAM timing

* because memory timing is board-dependend, you will

* find a lowlevel_init.S in your board directory.

*/

mov ip, lr

#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF)

#else

bl lowlevel_init @這個函數(shù)是重點。。在lowlevel_init.S中

#endif

mov lr, ip

mov pc, lr

#endif /* CONFIG_SKIP_LOWLEVEL_INIT */

lowlevel_init.S的內(nèi)容:

_TEXT_BASE:

.word TEXT_BASE

.globl lowlevel_init

lowlevel_init: @很明顯,是初始化SDRAM

/* memory control configuration */

/* make r0 relative the current location so that it */

/* reads SMRDATA out of FLASH rather than memory ! */

ldr r0, =SMRDATA

ldr r1, _TEXT_BASE

sub r0, r0, r1

ldr r1, =BWSCON /* Bus Width Status Controller */

add r2, r0, #13*4

0:

ldr r3, [r0], #4

str r3, [r1], #4

cmp r2, r0

bne 0b

/* everything is fine now */

mov pc, lr

.ltorg

2.進入uboot啟動的第二階段:start_armboot()

點擊(此處)折疊或打開

start_armboot()在board.c中,處于lib_arm/下,在進入lib_arm目錄下編譯LIBS目標時依賴board.o文件

void start_armboot (void)

{

init_fnc_t **init_fnc_ptr;

char *s;

#if !defined(CFG_NO_FLASH) || defined (CONFIG_VFD) || defined(CONFIG_LCD)

ulong size;

#endif

#if defined(CONFIG_VFD) || defined(CONFIG_LCD)

unsigned long addr;

#endif

//gd是個寄存器變量,ARM平臺對應(yīng)R8寄存器

/* Pointer is writable since we allocated a register for it

*_armboot_start是代碼的起始地址,鏈接腳本指定為0x33f80000,CFG_MALLOC_LEN=192k,

*所以gd的起始地址=0x33F50000

*/

gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));

/* compiler optimization barrier needed for GCC >= 3.4 */

__asm__ __volatile__("": : :"memory");

memset ((void*)gd, 0, sizeof (gd_t));//清空gd_t結(jié)構(gòu)體

gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));//bd_t結(jié)構(gòu)體

memset (gd->bd, 0, sizeof (bd_t));

gd->flags |= GD_FLG_RELOC;

monitor_flash_len = _bss_start - _armboot_start;//uboot代碼的長度

//對結(jié)構(gòu)體init_fnc_t *init_sequence[]數(shù)組中的函數(shù)指針挨個調(diào)用。

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {

if ((*init_fnc_ptr)() != 0) {

hang ();

}

}

/* 初始化flash*/

size = flash_init ();

。。。。。。

/* 初始化一個堆空間 */

mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);

nand_init(); /* go init the NAND */

/* 初始化環(huán)境變量,將環(huán)境參數(shù)讀入內(nèi)存指定位置 */

env_relocate ();

/* must do this after the framebuffer is allocated,串口初始化 */

serial_initialize();

/* IP Address */

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

/* MAC Address,省略 */

devices_init (); /* get the devices list going. */

jumptable_init (); /*跳轉(zhuǎn)表初始化 */

console_init_r (); /* fully init console as a device */

/* 使能異常中斷 */

enable_interrupts ();

/* Perform network card initialisation if necessary */

#ifdef CONFIG_DRIVER_CS8900

cs8900_get_enetaddr (gd->bd->bi_enetaddr);

#endif

/* main_loop() can return to retry autoboot, if so just run it again. */

for (;;) {

main_loop ();

}

/* NOTREACHED - no way out of command loop except booting */

}

init_fnc_t *init_sequence[] = {

cpu_init, /* 基本的處理器相關(guān)配置,初始化IRQ/FIQ模式的棧 -- cpu/arm920t/cpu.c */

board_init, /* 基本的板級相關(guān)配置,設(shè)置系統(tǒng)時鐘等 -- board/smdk2410/smdk2410.c */

interrupt_init, /* 初始化定時器處理 -- cpu/arm920t/s3c24x0/interrupt.c */

env_init, /* 初始化環(huán)境變量,檢查Flash上的環(huán)境參數(shù)是否有效 -- common/env_flash.c */

init_baudrate, /* 初始化波特率設(shè)置 -- lib_arm/board.c */

serial_init, /* 串口通訊設(shè)置 -- cpu/arm920t/s3c24x0/serial.c */

console_init_f, /* 控制臺初始化階段1 -- common/console.c */

display_banner, /* 打印u-boot信息 -- lib_arm/board.c */

dram_init, /* 配置可用的RAM,檢測系統(tǒng)內(nèi)存映射 -- board/smdk2410/smdk2410.c */

display_dram_config, /* 顯示RAM的配置大小 -- lib_arm/board.c */

NULL,

};

下面逐個分析初始化函數(shù):

1.int cpu_init (void)

{

/* setup up stacks if necessary */

#ifdef CONFIG_USE_IRQ

IRQ_STACK_START = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE - 4;

FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ;

#endif

return 0;

}

2.int board_init (void)//設(shè)置系統(tǒng)時鐘,配置引腳,使能緩存

{

S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

/* to reduce PLL lock time, adjust the LOCKTIME register */

clk_power->LOCKTIME = 0xFFFFFF;

/* configure MPLL */

clk_power->MPLLCON = ((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV);

......

/* configure UPLL */

clk_power->UPLLCON = ((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV);

......

/* set up the I/O ports */

gpio->GPACON = 0x007FFFFF;

gpio->GPBCON = 0x00044555;

gpio->GPBUP = 0x000007FF;

gpio->GPCCON = 0xAAAAAAAA;

gpio->GPCUP = 0x0000FFFF;

gpio->GPDCON = 0xAAAAAAAA;

gpio->GPDUP = 0x0000FFFF;

gpio->GPECON = 0xAAAAAAAA;

gpio->GPEUP = 0x0000FFFF;

gpio->GPFCON = 0x000055AA;

gpio->GPFUP = 0x000000FF;

gpio->GPGCON = 0xFF95FFBA;

gpio->GPGUP = 0x0000FFFF;

gpio->GPHCON = 0x002AFAAA;

gpio->GPHUP = 0x000007FF;

/* arch number of SMDK2410-Board */

gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

/* address of boot parameters */

gd->bd->bi_boot_params = 0x30000100;//為什么是這個地址

icache_enable();//下面這兩個函數(shù)都是設(shè)置協(xié)處理器的相關(guān)寄存器,使能緩存

dcache_enable();

}

3.int interrupt_init (void)//初始化2410的PWM timer 4,使其能自動裝載計數(shù)值,

//恒定的產(chǎn)生時間中斷信號,但是中斷被屏蔽了用不上。

{

S3C24X0_TIMERS * const timers = S3C24X0_GetBase_TIMERS();

/* use PWM Timer 4 because it has no output */

/* prescaler for Timer 4 is 16 */

timers->TCFG0 = 0x0f00;

if (timer_load_val == 0)

{

/*

* for 10 ms clock period @ PCLK with 4 bit divider = 1/2

* (default) and prescaler = 16. Should be 10390

* @33.25MHz and 15625 @ 50 MHz

*/

timer_load_val = get_PCLK()/(2 * 16 * 100);

}

/* load value for 10 ms timeout */

lastdec = timers->TCNTB4 = timer_load_val;

/* auto load, manual update of Timer 4 */

timers->TCON = (timers->TCON & ~0x0700000) | 0x600000;

/* auto load, start Timer 4 */

timers->TCON = (timers->TCON & ~0x0700000) | 0x500000;

timestamp = 0;

return (0);

}

4.int env_init(void)

{

int crc1_ok = 0, crc2_ok = 0;

uchar flag1 = flash_addr->flags;

uchar flag2 = flash_addr_new->flags;

ulong addr_default = (ulong)&default_environment[0];

ulong addr1 = (ulong)&(flash_addr->data);

ulong addr2 = (ulong)&(flash_addr_new->data);

crc1_ok = (crc32(0, flash_addr->data, ENV_SIZE) == flash_addr->crc);

crc2_ok = (crc32(0, flash_addr_new->data, ENV_SIZE) == flash_addr_new->crc);

if (crc1_ok && ! crc2_ok) {

gd->env_addr = addr1;

gd->env_valid = 1;

} else if (! crc1_ok && crc2_ok) {

gd->env_addr = addr2;

gd->env_valid = 1;

} else if (! crc1_ok && ! crc2_ok) {

gd->env_addr = addr_default;

gd->env_valid = 0;

} else if (flag1 == ACTIVE_FLAG && flag2 == OBSOLETE_FLAG) {

gd->env_addr = addr1;

gd->env_valid = 1;

} else if (flag1 == OBSOLETE_FLAG && flag2 == ACTIVE_FLAG) {

gd->env_addr = addr2;

gd->env_valid = 1;

} else if (flag1 == flag2) {

gd->env_addr = addr1;

gd->env_valid = 2;

} else if (flag1 == 0xFF) {

gd->env_addr = addr1;

gd->env_valid = 2;

} else if (flag2 == 0xFF) {

gd->env_addr = addr2;

gd->env_valid = 2;

}

return (0);

}

PS:

uboot的重要的數(shù)據(jù)結(jié)構(gòu)

1)gd  全局數(shù)據(jù)變量指針,它保存了u-boot運行需要的全局數(shù)據(jù),類型定義:

typedef struct global_data {

bd_t? *bd;????? //board data pointor板子數(shù)據(jù)指針

unsigned long flags;  ?//指示標志,如設(shè)備已經(jīng)初始化標志等。

unsigned long baudrate; //串口波特率

unsigned long have_console; /* 串口初始化標志*/

unsigned long reloc_off;?? /* 重定位偏移,就是實際定向的位置與編譯連接時指定的位置之差,一般為0 */

unsigned long env_addr; /* 環(huán)境參數(shù)地址*/

unsigned long env_valid; /* 環(huán)境參數(shù)CRC檢驗有效標志 */

unsigned long fb_base; /* base address of frame buffer */

#ifdef CONFIG_VFD

unsigned char vfd_type; /* display type */

#endif

void? **jt;? /* 跳轉(zhuǎn)表,1.1.6中用來函數(shù)調(diào)用地址登記 */

} gd_t;

2)bd 板子數(shù)據(jù)指針。板子很多重要的參數(shù)。 類型定義如下:

typedef struct bd_info {

int?? bi_baudrate;???? /* 串口波特率 */

unsigned long bi_ip_addr;?? /* IP 地址 */

unsigned char bi_enetaddr[6]; /* MAC地址*/

struct environment_s??????? *bi_env;

ulong???????? bi_arch_number; /* unique id for this board */

ulong???????? bi_boot_params; /* 啟動參數(shù) */

struct??? ???/* RAM 配置 */

{

ulong start;

ulong size;

}bi_dram[CONFIG_NR_DRAM_BANKS];

} bd_t;

3)環(huán)境變量指針 env_t *env_ptr = (env_t *)(&environment[0]);(common/env_flash.c)

env_ptr指向環(huán)境參數(shù)區(qū),系統(tǒng)啟動時默認的環(huán)境參數(shù)environment[],定義在common/environment.c中。

參數(shù)解釋:

bootdelay 定義執(zhí)行自動啟動的等候秒數(shù)

baudrate 定義串口控制臺的波特率

netmask 定義以太網(wǎng)接口的掩碼

ethaddr 定義以太網(wǎng)接口的MAC地址

bootfile 定義缺省的下載文件

bootargs 定義傳遞給Linux內(nèi)核的命令行參數(shù)

bootcmd 定義自動啟動時執(zhí)行的幾條命令

serverip 定義tftp服務(wù)器端的IP地址

ipaddr 定義本地的IP地址

stdin 定義標準輸入設(shè)備,一般是串口

stdout 定義標準輸出設(shè)備,一般是串口

stderr 定義標準出錯信息輸出設(shè)備,一般是串口

4)設(shè)備相關(guān):

標準IO設(shè)備數(shù)組?evice_t *stdio_devices[] = { NULL, NULL, NULL };

設(shè)備列表    list_t??? devlist = 0;

device_t的定義:include\devices.h中:

typedef struct {

int flags;???       /* Device flags: input/output/system */

int ext;?????      /* Supported extensions?? */

char name[16];??      /* Device name??? */

/* GENERAL functions */

int (*start) (void);?    /* To start the device?? */

int (*stop) (void);?     /* To stop the device?? */

/* 輸出函數(shù) */

void (*putc) (const char c); /* To put a char?? */

void (*puts) (const char *s); /* To put a string (accelerator) */

/* 輸入函數(shù) */

int (*tstc) (void);?     /* To test if a char is ready... */

int (*getc) (void);?     /* To get that char?? */

/* Other functions */

void *priv;??        /* Private extensions?? */

} device_t;

u-boot把可以用為控制臺輸入輸出的設(shè)備添加到設(shè)備列表devlist,并把當前用作標準IO的設(shè)備指針加入stdio_devices數(shù)組中。

在調(diào)用標準IO函數(shù)如printf()時將調(diào)用stdio_devices數(shù)組對應(yīng)設(shè)備的IO函數(shù)如putc()。

5)命令相關(guān)的數(shù)據(jù)結(jié)構(gòu),后面介紹。

6)與具體設(shè)備有關(guān)的數(shù)據(jù)結(jié)構(gòu),

如flash_info_t flash_info[CFG_MAX_FLASH_BANKS];記錄nor flash的信息。

nand_info_t nand_info[CFG_MAX_NAND_DEVICE]; nand flash塊設(shè)備信息

5.static int init_baudrate (void)

{

char tmp[64];?/* long enough for environment variables */

int i = getenv_r ("baudrate", tmp, sizeof (tmp));//環(huán)境變量存于tmp緩沖中

gd->bd->bi_baudrate = gd->baudrate = (i > 0)

? (int) simple_strtoul (tmp, NULL, 10)

: CONFIG_BAUDRATE;

return (0);

}

6.int serial_init()實際調(diào)用下面這個函數(shù),在移植時這個函數(shù)是第一個要修改的,因為要用到串口輸出信息

static int serial_init_dev(const int dev_index)

{

S3C24X0_UART * const uart = S3C24X0_GetBase_UART(dev_index);

/* FIFO enable, Tx/Rx FIFO clear */

uart->UFCON = 0x07;?//這里使用的是串口0.

uart->UMCON = 0x0;

/* Normal,No parity,1 stop,8 bit */

uart->ULCON = 0x3;

/*

* tx=level,rx=edge,disable timeout int.,enable rx error int.,

* normal,interrupt or polling

*/

uart->UCON = 0x245;

#ifdef CONFIG_HWFLOW

uart->UMCON = 0x1; /* RTS up */

#endif

/* FIXME: This is sooooooooooooooooooo ugly */

#if defined(CONFIG_ARCH_GTA02_v1) || defined(CONFIG_ARCH_GTA02_v2)

/* we need auto hw flow control on the gsm and gps port */

if (dev_index == 0 || dev_index == 1)

uart->UMCON = 0x10;

#endif

_serial_setbrg(dev_index);

return (0);

}

7.由于標準設(shè)備還沒有初始化(gd->flags & GD_FLG_DEVINIT=0),這時控制臺使用串口作為控制臺

函數(shù)只有一句:gd->have_console = 1;

int console_init_f (void)

{

gd->have_console = 1;?//將標志位置1

#ifdef CONFIG_SILENT_CONSOLE

if (getenv("silent") != NULL)

gd->flags |= GD_FLG_SILENT;

#endif

return (0);

}

8.int dram_init (void)

{//PHYS_SDRAM_1在整個include/configs.h文件中有很多定義,只在一個地方define為0x30000000

//PHYS_SDRAM_1_SIZE定義為64MB

gd->bd->bi_dram[0].start = PHYS_SDRAM_1;

gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;

return 0;

}

9. ulong flash_init (void)

這里smdk2410的默認flash是AMD的,mini2440的板子是SST39F1601,如果NOR Flash符合CFI接口標準,可以使用drivers/cfi_flash.c

里面的接口函數(shù),否則就得重寫。如果使用cfi_flash.c,需要修改include/configs/$(board_name).h,在里面增加:

#define CFG_FLASH_CFI_DRIVER ?1

在board/$(board_name)/Makefile中去掉flash.o

在《嵌入式linux完全手冊》上P273頁有說明。

首先是有一個變量flash_info_t flash_info[CFG_MAX_FLASH_BANKS]來記錄flash的信息。flash_info_t定義:

typedef struct {

ulong size;?? /* 總大小BYTE? */

ushort sector_count;? /* 總的sector數(shù)*/

ulong flash_id;? /* combined device & manufacturer code */

ulong start[CFG_MAX_FLASH_SECT];?? /* 每個sector的起始物理地址。 */

uchar protect[CFG_MAX_FLASH_SECT]; /* 每個sector的保護狀態(tài),如果置1,在執(zhí)行erase操作的時候?qū)⑻^對應(yīng)sector*/

#ifdef CFG_FLASH_CFI //我不管CFI接口。

.....

#endif

} flash_info_t;

flash_init()的操作就是讀取ID號,ID號指明了生產(chǎn)商和設(shè)備號,根據(jù)這些信息設(shè)置size,sector_count,flash_id.

以及start[]、protect[]。

10.mem_malloc_init()

11.nand_init()

12.env_relocate()

13.devices_init ();?/* get the devices list going. */定義于common/devices.c

14.jumptable_init ()

15.console_init_r ();?/* fully init console as a device ,前面結(jié)構(gòu)體中的是前期控制臺初始化,這是后期*/

主要過程:查看環(huán)境參數(shù)stdin,stdout,stderr中對標準IO的指定的設(shè)備名稱,再按照環(huán)境指定的名稱搜索devlist,將搜到的設(shè)備指針賦給標準IO數(shù)組stdio_devices[]。置gd->flag標志GD_FLG_DEVINIT。這個標志影響putc,getc函數(shù)的實現(xiàn),未定義此標志時直接由串口serial_getc和serial_putc實現(xiàn),定義以后通過標準設(shè)備數(shù)組stdio_devices[]中的putc和getc來實現(xiàn)IO。

下面是相關(guān)代碼:

void putc (const char c)

{

#ifdef CONFIG_SILENT_CONSOLE

if (gd->flags & GD_FLG_SILENT)//GD_FLG_SILENT無輸出標志

return;

#endif

if (gd->flags & GD_FLG_DEVINIT) {//設(shè)備list已經(jīng)初始化

/* Send to the standard output */

fputc (stdout, c);

} else {

/* Send directly to the handler */

serial_putc (c);//未初始化時直接從串口輸出。

}

}

void fputc (int file, const char c)

{

if (file < MAX_FILES)

stdio_devices[file]->putc (c);

}

為什么要使用devlist,std_device[]?

為了更靈活地實現(xiàn)標準IO重定向,任何可以作為標準IO的設(shè)備,如USB鍵盤,LCD屏,串口等都可以對應(yīng)一個device_t的結(jié)構(gòu)體變量,只需要實現(xiàn)getc和putc等函數(shù),就能加入到devlist列表中去,也就可以被assign為標準IO設(shè)備std_device中去。如函數(shù)

int console_assign (int file, char *devname); /* Assign the console 重定向標準輸入輸出*/

這個函數(shù)功能就是把名為devname的設(shè)備重定向為標準IO文件file(stdin,stdout,stderr)。其執(zhí)行過程是在devlist中查找devname的設(shè)備,返回這個設(shè)備的device_t指針,并把指針值賦給std_device[file]。

16.enable_interrupts ();

(1)首先,需要設(shè)置系統(tǒng)時鐘、初始化串口,只要這兩個設(shè)置好,就能從串口看到打印信息。

board_init函數(shù)設(shè)置MPLL,改變系統(tǒng)時鐘,這是一個開發(fā)板相關(guān)的函數(shù)。

serial_init函數(shù)用來初始化串口,設(shè)置UART控制器,是CPU相關(guān)的函數(shù),

(2)檢測系統(tǒng)內(nèi)存映射

對于特定的開發(fā)板,內(nèi)存分布是比較明確的,dram_init函數(shù)指定了目標開發(fā)板的內(nèi)存起始地址為0x30000000,大小為64M

(3)U-boot命令的格式

uboot中的每個命令都是通過U_BOOT_CMD宏來定義,格式:U_BOOT_CMD(name,maxargs,repeatable,command,"usage","help")

這個宏定義在include/command.h中,

(4)為內(nèi)核設(shè)置啟動參數(shù)

uboot是通過標記列表向內(nèi)核傳遞參數(shù),設(shè)置內(nèi)存標記、命令標記的函數(shù)setup_memory_tags、setup_commandline_tag,

在lib_arm/armlinux.c中定義實現(xiàn)。如果要定義一個命令,需要在include/configs/$(board_name).h中增加一個關(guān)于

命令的配置項:

如: #define CONFIG_CMDLINE_TAG? 1

對于arm架構(gòu)的CPU,都是通過lib_arm/armlinux.c中的do_bootm_linux函數(shù)來啟動內(nèi)核,在這個函數(shù)中,設(shè)置標記列表,最后通過

the_kernel(0,bd->bi_arch_number,bd->bi_boot_params)調(diào)用內(nèi)核。

PS:

1.分析過程參照了一位網(wǎng)友的文章,很有參考價值,給我很大幫助。我只是按照配置->編譯->啟動過程

的這么一個認識過程來分析,可能會顯得比較混亂。

總結(jié)

以上是生活随笔為你收集整理的uboot启动流程概述_uboot 分析之 启动流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

中文在线中文资源 | 久久这里有 | www.在线观看视频 | 中文字幕在线观看一区二区 | 综合婷婷久久 | 亚洲免费在线观看视频 | 国产一级黄 | 香蕉精品视频在线观看 | 在线看小早川怜子av | 久久爱www. | 久久精品www人人爽人人 | 五月婷在线播放 | 精品久久91 | 国产精品第 | 麻豆久久久久久久 | 黄色亚洲 | 在线电影 一区 | 午夜精品一区二区三区在线观看 | 日本在线观看中文字幕无线观看 | 国产午夜精品福利视频 | 在线99视频 | 欧美伦理一区二区三区 | 久久免费精品 | 极品中文字幕 | 成年人网站免费观看 | 天天干天天草天天爽 | 国产欧美综合视频 | 国产婷婷| 亚洲免费专区 | 在线 国产 日韩 | 日韩精品久久中文字幕 | 超碰免费观看 | 99久久这里有精品 | 亚洲三级影院 | 精产嫩模国品一二三区 | www.在线看片.com | 国产日韩视频在线播放 | 欧美ⅹxxxxxx| 欧美五月婷婷 | 精品国产免费av | 日韩欧美亚州 | 一区二区三区免费看 | 91亚洲精品久久久久图片蜜桃 | 日韩网站在线观看 | 热久久在线视频 | 亚洲精品久久激情国产片 | 天天爱天天爽 | 五月婷久 | 国产日产高清dvd碟片 | 色精品视频 | 久久人网 | 日韩久久精品一区二区三区 | 人人爱爱 | 久久成人资源 | 久久久精华网 | 国产免费观看av | 精品1区2区3区 | 日韩在线色视频 | 亚洲午夜精品一区 | 久久久www成人免费精品 | 天天综合狠狠精品 | av在线直接看 | 亚洲精品视频在线免费播放 | 国产免费观看av | 国产无遮挡又黄又爽馒头漫画 | 欧美国产精品一区二区 | 欧美国产日韩一区二区三区 | 国产午夜视频在线观看 | 久久久综合香蕉尹人综合网 | 在线看国产精品 | 久久99中文字幕 | 永久中文字幕 | 国产大片免费久久 | 日韩欧美国产成人 | 欧美日韩在线观看视频 | 射久久 | 国产精品久久久久国产精品日日 | 午夜电影久久久 | 久久久精品国产免费观看一区二区 | 日本激情视频中文字幕 | 免费视频91蜜桃 | 日韩av网站在线播放 | 久久久久麻豆 | 亚洲三级黄色 | 伊人久久五月天 | 婷婷中文字幕 | 亚洲成a人片综合在线 | 国产精品视频大全 | 久久天天躁夜夜躁狠狠躁2022 | 国产免码va在线观看免费 | 美女在线观看网站 | 综合激情网 | 欧美成年网站 | 人人爽人人片 | 中文字幕日本电影 | 国产小视频在线免费观看视频 | 国产专区日韩专区 | 国产精品国内免费一区二区三区 | 久久久久免费精品国产 | 免费激情在线电影 | 99re热精品视频 | 激情偷乱人伦小说视频在线观看 | 中文字幕在线视频国产 | 伊甸园永久入口www 99热 精品在线 | 正在播放国产一区二区 | 在线免费观看国产精品 | 91精品久久香蕉国产线看观看 | 国产精品2区 | 久草精品视频在线观看 | 高清不卡一区二区在线 | 免费色视频 | 欧美va在线观看 | japanesefreesexvideo高潮| 免费观看全黄做爰大片国产 | 国产精品久久99综合免费观看尤物 | 亚洲国产精品成人va在线观看 | 丝袜美女视频网站 | 看污网站 | 亚洲国产999 | 成人高清av在线 | 日韩在线色视频 | 免费在线播放av电影 | 精品久久久久一区二区国产 | 中文资源在线观看 | 在线电影a | 亚洲欧美国产视频 | 国产精品久久久久毛片大屁完整版 | 国产免费又粗又猛又爽 | 日韩精品黄 | 激情综合婷婷 | 狠狠狠狠狠狠狠狠干 | 日韩电影一区二区三区 | 久久色在线观看 | 久久精品日本啪啪涩涩 | 日韩在线观看中文字幕 | 黄色三几片| 三级a毛片 | 8x成人在线| 啪啪资源| 天堂在线成人 | 国产视频美女 | 亚洲色影爱久久精品 | 日韩中文字幕视频在线 | 波多野结衣在线视频一区 | 久99精品 | 日韩电影在线观看一区二区三区 | 五月天中文字幕mv在线 | 精品黄色片 | 91香蕉国产 | 日韩免费观看高清 | 国产精品原创视频 | a v在线视频 | 久久精品国产免费看久久精品 | 黄色成人在线观看 | 丁香婷婷电影 | 日韩在线资源 | 激情一区二区三区欧美 | 日本特黄一级 | 天天曰夜夜操 | 天堂av在线免费观看 | 亚洲精品动漫成人3d无尽在线 | 亚洲婷婷丁香 | 久久不卡日韩美女 | 久久手机精品视频 | 日本精品一区二区在线观看 | 亚洲视频在线观看 | 日本在线免费看 | 中文字幕观看视频 | 国产精品久久视频 | 91国内在线| 一区二区三区四区精品视频 | 国产精品毛片一区二区 | 狠狠干狠狠操 | 国产999精品久久久影片官网 | 精品不卡av | 久久久久久片 | 精品国产一区二区三区久久久 | 三级动图 | 日韩色一区二区三区 | 亚洲a成人v | 国产精品久久久久9999吃药 | 日日夜夜精品视频天天综合网 | 人人玩人人添人人澡超碰 | 天天久久夜夜 | 色欧美日韩 | 成人黄色片在线播放 | 国产精品观看视频 | 精品亚洲一区二区三区 | 国产成人精品国内自产拍免费看 | wwwav视频| 91精品影视| 日韩中文字幕第一页 | 日韩女同一区二区三区在线观看 | 国产热re99久久6国产精品 | 国产手机视频精品 | 草久在线视频 | 亚洲精品午夜久久久久久久久久久 | 日韩精品不卡在线 | www.成人sex| 亚洲成人欧美 | 久久精品视频2 | 992tv又爽又黄的免费视频 | av网站地址 | 一级国产视频 | 国产精品一区二区三区久久久 | 日本护士撒尿xxxx18 | 天天插天天狠天天透 | 中文字幕亚洲欧美日韩2019 | 国产v在线 | 国产成人专区 | 九色在线视频 | 亚洲精选在线观看 | 97在线观看免费观看 | 欧美精品一区二区三区四区在线 | 91精品国产麻豆国产自产影视 | 超碰人人99 | 欧美日本在线视频 | 伊人久久精品久久亚洲一区 | 色搞搞| av成人在线观看 | 成人国产精品电影 | 色婷婷成人网 | 国语精品视频 | 国产综合在线观看视频 | 六月婷婷网 | 国产精品久久人 | 久久精品这里热有精品 | 亚洲aⅴ免费在线观看 | 在线视频观看成人 | 国产精品日韩在线观看 | 国产又粗又猛又色 | 天天草天天干天天 | 青青河边草手机免费 | 最近中文字幕在线中文高清版 | www久久久久| 日韩av二区 | av免费电影在线 | 天天激情 | 亚洲精品福利视频 | 91精品视频一区二区三区 | 99这里只有精品视频 | 久久91久久久久麻豆精品 | www色av| av免费看网站 | 久久成人毛片 | 在线播放国产一区二区三区 | 久草亚洲视频 | 国产视频不卡一区 | 在线免费色 | 久久精品福利视频 | 日日操天天操夜夜操 | 在线看小早川怜子av | 欧美精品久久久久久久免费 | 黄色av观看 | 日韩在线免费高清视频 | av在线网站观看 | 日本在线观看黄色 | 久热超碰 | 狠狠色丁香婷婷综合久久片 | 久久国产精品一国产精品 | 国产精品99精品久久免费 | 成年人看片 | 日本久久久久久久久久久 | 国产一区二区三区 在线 | 国产成人精品综合久久久 | 亚洲婷久久 | 国产精品久久久久久久久久三级 | 中文字幕丝袜一区二区 | 亚洲精品永久免费视频 | 国产精品一区二区果冻传媒 | 精品国产一区二区三区久久久 | 亚洲黄色网络 | 日韩精品一区二区三区视频播放 | 亚州免费视频 | 精品在线观看一区二区三区 | 天天干,夜夜操 | 香蕉在线观看 | 在线看国产一区 | 中文字幕刺激在线 | 91网免费看 | a v在线观看 | 91完整版在线观看 | 在线97| 久久精品99国产精品日本 | 少妇bbw揉bbb欧美 | av在线播放国产 | 97超碰人人澡 | 久久尤物电影视频在线观看 | 亚洲精品动漫成人3d无尽在线 | 天天操欧美 | 国产高清在线看 | 日本中文字幕免费观看 | 玖玖精品在线 | 中文字幕在线一区二区三区 | 精品天堂av | 黄色大全在线观看 | 99精品电影 | 日韩精品久久久久久中文字幕8 | 亚洲高清免费在线 | 天天操天天干天天摸 | 日韩精品视频第一页 | 国产精品久久久久久久久毛片 | 麻豆免费精品视频 | 国产高清黄 | 91九色视频导航 | 亚洲免费专区 | 九色琪琪久久综合网天天 | 国产日本在线 | 欧美激情视频一二三区 | 92精品国产成人观看免费 | 久久极品 | 探花系列在线 | 免费能看的黄色片 | 日韩视频免费在线观看 | 中文字幕色站 | 久青草视频在线观看 | 国产资源中文字幕 | 99久久99视频| 制服丝袜天堂 | 黄色网www | 国产视频一区二区在线播放 | 日本大片免费观看在线 | 在线小视频 | 日日草天天草 | 午夜久久影院 | 日韩欧美视频免费看 | 亚洲天堂精品 | 婷婷在线免费视频 | 国产情侣一区 | 狠狠操天天射 | 亚洲黄色激情小说 | 五月花激情| 色狠狠综合天天综合综合 | 人人爽人人澡人人添人人人人 | 天堂av在线网站 | 91系列在线观看 | 精品99在线视频 | 黄色av电影在线观看 | 亚洲精品久久激情国产片 | 在线观看黄色免费视频 | 日日夜夜免费精品视频 | 精品999 | 三上悠亚一区二区在线观看 | 91超级碰| 国产免费观看久久 | 午夜精品剧场 | 成全免费观看视频 | 亚洲国产成人精品电影在线观看 | 国产黄色片网站 | 天天激情天天干 | 色福利网 | 久草资源免费 | 亚洲精品动漫久久久久 | 久久久久久黄色 | 精品一区二区三区香蕉蜜桃 | 久久成人午夜视频 | 18国产精品白浆在线观看免费 | 天天射射天天 | 日本久久久亚洲精品 | 黄色三级免费看 | 中文字幕高清在线播放 | 在线观看精品黄av片免费 | 欧美日韩伦理在线 | 91麻豆精品久久久久久 | av在线激情 | 免费日韩一区二区三区 | 国产不卡在线看 | 亚洲乱码精品久久久久 | 天天色天天射天天干 | 中国一区二区视频 | 成人在线你懂得 | 麻豆视频在线观看 | 色综合久久综合网 | 黄色国产高清 | 五月婷丁香 | 成人中心免费视频 | 91麻豆精品国产91久久久久 | 国产最顶级的黄色片在线免费观看 | 在线中文字母电影观看 | 国产美女无遮挡永久免费 | 日本视频高清 | 久久呀| 国产一区二区三区在线 | 色播五月激情五月 | av大全在线免费观看 | 国产精品久久影院 | 日韩在线播放av | 色综合婷婷久久 | 91精品在线免费 | 国产中文字幕大全 | 在线免费观看国产视频 | 最近免费中文字幕mv在线视频3 | 西西444www大胆无视频 | 午夜美女视频 | 深爱五月激情网 | 日韩视频在线观看视频 | 西西444www大胆高清视频 | 久久久久日本精品一区二区三区 | 在线播放亚洲激情 | 久久影视网 | 日韩中文字幕第一页 | 久久精品欧美日韩精品 | 午夜成人影视 | 精品福利视频在线观看 | 最近中文字幕视频网 | 国产亚洲精品电影 | 精品国内自产拍在线观看视频 | 在线观看中文字幕dvd播放 | 91麻豆精品国产自产在线游戏 | 免费中文字幕视频 | 最近中文字幕mv免费高清在线 | 丁香九月激情综合 | 久草热久草视频 | 四虎国产精品成人免费影视 | 天天操天天干天天摸 | 久久精品一级片 | www.xxx.性狂虐| 国产午夜激情视频 | 亚洲精品乱码久久久久久高潮 | 国产精品欧美在线 | 日本久久免费电影 | 在线免费精品视频 | 国产永久免费 | 色综合久久综合网 | 精品在线视频一区二区三区 | 正在播放国产一区 | 国产精品午夜久久久久久99热 | 98涩涩国产露脸精品国产网 | 黄色免费看片网站 | 亚洲国产精品久久久 | 亚洲精品777 | 免费看日韩片 | 欧美性黑人 | 在线观看黄色免费视频 | 超碰在线亚洲 | 深爱激情五月婷婷 | 久久国产精品小视频 | 国产精品自产拍在线观看中文 | 麻豆视传媒官网免费观看 | 69av在线播放 | 四虎国产精品免费观看视频优播 | 综合国产视频 | 麻豆视频网址 | 免费美女av| 久免费 | 国产精品a久久久久 | 久久免费黄色大片 | 亚洲乱码精品久久久 | 婷婷成人亚洲综合国产xv88 | 在线免费观看欧美日韩 | 久久99视频免费观看 | 麻豆视频免费入口 | 久操久 | 成人免费精品 | 国产精品麻豆91 | 99久久99久久精品 | 91精品欧美一区二区三区 | 中文字幕第一页在线播放 | 中文字幕在线观看一区二区三区 | 免费观看日韩 | 六月婷操| 国产一区国产二区在线观看 | 999视频网| 欧美日韩在线观看不卡 | 亚洲国产精品一区二区久久,亚洲午夜 | 天天激情在线 | 国产一卡在线 | 中国黄色一级大片 | 久久久免费精品国产一区二区 | 日日激情| 国产成人一区在线 | 国产精品久久久久久久免费大片 | 久草在线免费播放 | 在线观看欧美成人 | 日本久久精品 | 在线免费观看国产精品 | 婷婷在线免费视频 | 日韩r级电影在线观看 | 亚洲欧美日韩精品久久奇米一区 | 久久视频这里只有精品 | 精品一区二区三区久久久 | 欧美在线日韩在线 | 国产精品免费人成网站 | 欧美一级黄大片 | 亚洲美女精品 | 色婷婷视频网 | 午夜久久电影网 | 国产高清亚洲 | 日韩高清观看 | 国产中文视| 天堂av官网 | 91精品国产91 | 在线看黄色的网站 | 久久久久影视 | 国产精品久久久久久久久久免费 | 天天操天天摸天天干 | 久久精品视频免费 | 久久国产精品免费 | 在线天堂亚洲 | 国产综合片 | 亚洲综合丁香 | 中文字幕永久免费 | 亚洲一级黄色av | 午夜123| 在线观看视频色 | 亚洲国产精品成人va在线观看 | 久久成人国产精品入口 | 亚洲免费一级电影 | 麻豆视频免费在线播放 | 日韩草比 | 免费av在线网 | 色999精品 | 91精品成人久久 | 在线视频 91| 国产视频精品在线 | 久久精品欧美一区 | 四虎成人精品永久免费av九九 | 亚洲精品合集 | av一级片在线观看 | 热久精品 | 日韩精品一区二区在线观看 | 天天操天天干天天操天天干 | 五月婷婷操 | 欧美电影黄色 | 97精品国产91久久久久久久 | 激情视频在线观看网址 | 视频高清 | 这里只有精品视频在线观看 | 永久黄网站色视频免费观看w | 男女拍拍免费视频 | 免费国产亚洲视频 | 色婷婷99| 激情av在线资源 | 国产午夜剧场 | 欧美污在线观看 | 日本公妇在线观看 | 综合黄色网| 成人香蕉视频 | 免费精品国产 | 亚洲精品中文在线观看 | 欧美在线观看视频一区二区三区 | 欧美精品首页 | 九九在线国产视频 | 久久久久亚洲精品成人网小说 | 国产精品免费观看久久 | 成av在线 | 国产精品久久久久久久av电影 | 波多野结衣视频一区二区三区 | 不卡视频一区二区三区 | 2018亚洲男人天堂 | 中文字幕在线观看视频一区二区三区 | 中文字幕一区二区三区乱码不卡 | 九色91在线| 二区中文字幕 | 久碰视频在线观看 | 日韩专区在线 | 日本在线中文 | 国内精品免费久久影院 | 成人久久18免费网站图片 | 夜色资源站国产www在线视频 | 天天天干天天射天天天操 | 黄色a三级| 国产精品二区三区 | 久久九九久久精品 | 中文字幕乱码视频 | 五月天婷婷综合 | 99理论片| 久久精品中文字幕 | 综合色爱| 成年人视频在线免费 | 色婷婷久久久综合中文字幕 | 免费色视频在线 | 久久久www成人免费毛片麻豆 | 国内丰满少妇猛烈精品播放 | 久久神马影院 | 久草国产在线观看 | 99精品国产免费久久久久久下载 | 婷婷激情五月 | 欧美国产精品一区二区 | 久久国产热 | 97在线观看免费 | www.五月天婷婷.com | 婷婷国产视频 | 天天色 天天 | 射综合网 | 最近免费中文视频 | 中文理论片 | 日韩在线 一区二区 | 婷婷伊人综合 | 人人草在线视频 | 国产精品精品久久久久久 | 黄色成人在线网站 | 国产精品国产三级国产aⅴ9色 | 国模精品在线 | 好看的国产精品视频 | 久久99精品久久只有精品 | 在线视频 影院 | 日韩精品一区二区三区水蜜桃 | 亚洲欧洲精品一区二区 | 99久免费精品视频在线观看 | 五月开心六月伊人色婷婷 | 97在线免费视频 | 日韩理论电影在线观看 | 国产理论影院 | 国产精品扒开做爽爽的视频 | 婷婷在线网 | 久久综合在线 | 欧美日韩三区二区 | 高清av在线免费观看 | 欧美激情视频一二区 | 日本公乱妇视频 | 超碰免费久久 | 国产69精品久久久久99尤 | 久久精品国产久精国产 | 国产成本人视频在线观看 | 国产破处在线视频 | 欧美日韩一区二区在线 | 一区二区影视 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 国产一卡在线 | 一区二区三区免费在线观看视频 | 最近更新中文字幕 | 国产精品久久久久久久久久不蜜月 | 日韩欧美一区二区在线 | 日本69hd| 四虎成人精品永久免费av | 一级黄色免费 | 欧美一区二区三区在线观看 | 深爱激情久久 | 婷婷色伊人| av在线播放观看 | 四虎在线免费观看 | 视频精品一区二区三区 | 91麻豆网站 | www.伊人色.com | 胖bbbb搡bbbb擦bbbb| 日韩高清一二三区 | 四虎国产视频 | 久久精品黄 | 一区二区 精品 | 日韩欧美在线视频一区二区三区 | 麻豆精品传媒视频 | 91爱看片 | avv天堂| 国产亚洲精品v | 久久婷婷国产色一区二区三区 | 婷婷色资源 | www.久久久com| 中文字幕在线字幕中文 | 日韩综合在线观看 | 天堂在线一区 | 久久久精品| 免费下载高清毛片 | 成人97人人超碰人人99 | 99精品在线免费观看 | 中文字幕在线网址 | 精品一区二区三区四区在线 | www色| 1000部国产精品成人观看 | 色播99| 国产又粗又猛又爽 | 午夜精品一区二区三区四区 | 国产午夜三级一区二区三桃花影视 | 成人aaa毛片 | 六月丁香社区 | 欧美a级一区二区 | 婷婷激情在线观看 | 国产一区二区精品 | 国产黄色一级片 | 亚洲最大的av网站 | 奇米影视8888在线观看大全免费 | 亚洲精品1区2区3区 超碰成人网 | 一级精品视频在线观看宜春院 | 六月激情 | www.天天色.com| 中文在线中文资源 | 日韩和的一区二在线 | 国产操在线 | 中文字幕a∨在线乱码免费看 | 久久久久久国产精品美女 | 韩国精品视频在线观看 | 特黄特色特刺激视频免费播放 | 亚洲精品乱码久久久久久蜜桃91 | 在线看国产视频 | 99麻豆视频 | 一级免费看 | 成人黄色片免费看 | 91入口在线观看 | 激情婷婷久久 | 国产成人福利在线观看 | 国产精品乱码在线 | 色综合欧洲 | 欧美日韩免费一区二区 | 在线a人片免费观看视频 | 91爱看片 | 天天操天天操 | 在线观看成人 | 一区二区影院 | 日本久久久精品视频 | 国产成人中文字幕 | 手机av网站| 免费美女av | 成人在线黄色 | 久久伊人爱 | 国语黄色片 | 日韩免费视频在线观看 | 色噜噜噜噜 | 亚洲在线综合 | 精品国产免费看 | 免费在线观看a v | 国产视频91在线 | 久久黄视频 | 国产成人一区二区三区在线观看 | 亚洲资源片 | 青青草华人在线视频 | 久久久久久久久久久福利 | 激情五月开心 | 久久久久久免费视频 | 精品视频久久 | 狠狠操狠狠插 | 色射爱| 一区av在线播放 | 免费在线观看av网站 | 99久久久久久国产精品 | 99视频在线免费 | 久久久精品国产一区二区电影四季 | 一本一道波多野毛片中文在线 | 婷婷丁香导航 | 国产免费视频在线 | 日韩美女一级片 | 久久久久成 | 97电影在线| 亚洲性xxxx | 在线视频黄 | 国产精品乱码一区二三区 | 国产成人精品一区二三区 | 2020天天干天天操 | 成人免费 在线播放 | 黄色资源网站 | av高清网站在线观看 | 婷婷亚洲五月 | 成人中文字幕+乱码+中文字幕 | 日韩乱码中文字幕 | 日韩亚洲在线 | 日韩无在线 | 7777xxxx | 免费看污网站 | 国内精品视频在线 | 久久综合久久综合这里只有精品 | 丰满少妇麻豆av | 国产97在线视频 | 亚洲欧美日韩国产一区二区三区 | 天天爽天天搞 | 中文字幕在线观看第一区 | 夜夜操综合网 | 久久久精品欧美一区二区免费 | 亚洲免费视频在线观看 | 黄色精品在线看 | 久草在线欧美 | 日韩理论在线视频 | 精品日韩中文字幕 | 黄色小视频在线观看免费 | 日韩在线观看电影 | 日韩欧美69| 国产伦精品一区二区三区… | 午夜精品一区二区三区在线观看 | 亚洲精品乱码久久久久v最新版 | 青青射| 99精品热视频 | 久久影院一区 | 日本中文字幕在线 | 国产青草视频在线观看 | 色吊丝在线永久观看最新版本 | 久久成人免费 | 亚洲另类久久 | 国产亚洲欧美精品久久久久久 | 91成人精品国产刺激国语对白 | 欧美特一级片 | 欧美日韩在线精品一区二区 | 国产高清在线永久 | ww亚洲ww亚在线观看 | av高清免费在线 | 五月婷亚洲| 一区二区三区精品在线 | 久久香蕉电影网 | 精品免费视频. | 久久理论影院 | 93久久精品日日躁夜夜躁欧美 | 手机成人在线电影 | 国产在线精 | 在线观看免费av片 | 欧美日韩国产一区二区在线观看 | 国产精美视频 | 99热9 | 九九热精品在线 | 韩日精品在线 | 欧美激情综合五月色丁香小说 | 亚洲免费在线观看视频 | 欧美成人一区二区 | 精品久久美女 | 久久久网站 | 日韩欧美电影在线观看 | 久久久999精品视频 国产美女免费观看 | 精品欧美日韩 | 亚洲国产精品成人av | 日韩视频一二三区 | 岛国大片免费视频 | 成人a视频片观看免费 | 日日骑| av中文在线 | 毛片1000部免费看 | 天天操夜夜操天天射 | 美女在线黄| 亚在线播放中文视频 | 天天天天天天操 | 日韩国产欧美在线视频 | 久久av不卡 | 中文字幕在线播放一区二区 | 亚洲视频www| 中中文字幕av在线 | 国产最新在线 | 国产成年免费视频 | 久久久国产一区二区三区四区小说 | 99视频精品全部免费 在线 | 中文字幕专区高清在线观看 | 精品免费久久久久 | 高潮毛片无遮挡高清免费 | 国产又粗又猛又黄 | 九九九热精品免费视频观看网站 | 韩国精品视频在线观看 | 看av在线 | 亚洲精品 在线视频 | 人人人爽| 亚洲色综合 | 玖玖玖在线观看 | 人人看人人草 | 精品伊人久久久 | 成人v| 亚洲美女久久 | 国产精品一区二区三区观看 | 在线观看国产日韩欧美 | 日韩在线视频观看免费 | 超碰97国产精品人人cao | 日韩在线小视频 | 丁香午夜 | 天天干干 | 天天天天天天操 | 黄色国产精品 | 中文av影院 | 欧美成人按摩 | 中午字幕在线观看 | 在线免费观看视频a | 久久艹久久| 深夜成人av | 亚洲人毛片 | 人九九精品 | 免费在线观看国产精品 | 不卡视频在线 | 992tv在线成人免费观看 | 久久久久久综合网天天 | 玖玖国产精品视频 | 91一区二区三区在线观看 | 在线观看网站你懂的 | 婷婷丁香在线 | 夜夜操天天摸 | 精品一区二区三区在线播放 | 日韩欧美高清在线 | 日韩精品一区二区三区在线视频 | 国产在线精品观看 | 久久免费视频国产 | 一级片色播影院 | 久久国产精品影片 | 午夜精品视频免费在线观看 | 欧美日韩1区 | 天海翼一区二区三区免费 | 久久精品亚洲综合专区 | 国产精品一区在线观看 | 日韩精品久久一区二区三区 | 免费裸体视频网 | 黄色国产大片 | 九九亚洲视频 | 很污的网站 | 国产精品国产毛片 | 国精产品999国精产品岳 | 欧美日韩在线视频观看 | 中文字幕在线看视频 | 久久久久久国产精品 | 国产一区欧美日韩 | www.在线看片.com | 波多野结衣动态图 | 国产成人在线免费观看 | 97国产精品久久 | 国产精品精品国产色婷婷 | 在线亚洲高清视频 | 在线观看免费视频 | 五月天亚洲综合小说网 | 夜夜视频资源 | 国产精品一区二区久久精品爱微奶 | 午夜在线观看 | 国产网站色 | 在线观看岛国 | 亚洲自拍偷拍色图 | 99精品视频在线播放免费 | 欧美大jb | 婷婷在线资源 | 久久精品国产成人精品 | 91亚洲综合 | 97视频久久久 | 三日本三级少妇三级99 | 国产精品福利视频 | 五月精品 | 久久精品中文字幕一区二区三区 | 麻豆一区在线观看 | 丁五月婷婷| 三级av网站 | 国产一区在线看 | 99婷婷狠狠成为人免费视频 | 91伊人久久大香线蕉蜜芽人口 | 91精品国产欧美一区二区 | 97色视频在线 | 免费视频一二三 | 极品国产91在线网站 | 99爱视频| 999久久a精品合区久久久 | 九九在线播放 | 操操操日日| 在线观看韩日电影免费 | 又黄又爽又色无遮挡免费 | 日韩在线视频线视频免费网站 | 狠狠激情中文字幕 | 色吊丝av中文字幕 | 91麻豆文化传媒在线观看 | 97成人资源站 | 玖玖视频国产 | 日韩av一区二区在线播放 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 亚洲精品h | 伊人久久在线观看 | 免费黄色av电影 | av大片免费在线观看 | 日日干美女 | 色av男人的天堂免费在线 | 婷婷在线不卡 | 天天爱天天色 | 色综合久久久久综合体桃花网 | 在线观看完整版免费 | 亚洲激情免费 | 亚洲另类在线视频 | 欧美一区在线观看视频 | 午夜电影中文字幕 | 中文字幕在线播放一区二区 | 国产成人综合在线观看 | 国产麻豆精品传媒av国产下载 | 亚洲国产成人高清精品 | 在线免费观看国产 | 韩日精品在线观看 | www.黄色小说.com | 91精品视频免费在线观看 | 欧美日韩超碰 | 九九九电影免费看 | 亚洲视频在线看 | www.啪啪.com| 天天草av| 国内视频| 婷婷丁香六月 | 日韩一二三 | 日韩av一区在线观看 | 在线精品视频免费播放 | 久久精品久久精品久久 | 五月天狠狠操 | 国产视频不卡一区 | 黄色亚洲免费 | 久久久影院一区二区三区 | 欧美与欧洲交xxxx免费观看 | 日韩精品偷拍 | 97天天综合网 | 国产精品一区二区62 | 国产精品字幕 | 日韩在线视频线视频免费网站 | 国产99久久精品 | 久久久久一区二区三区四区 | 国产精品视频99 | 久久久精品福利视频 | 中文字幕乱码在线播放 | 欧美伦理一区二区 | 久久手机免费观看 | 国产精品久久久久久久久久免费看 | 东方av在线免费观看 | 伊人伊成久久人综合网站 | 久久人人97超碰国产公开结果 | 久99久中文字幕在线 | 天堂在线v| 免费观看黄色av | 久久久综合九色合综国产精品 | 亚洲最快最全在线视频 | 午夜黄色大片 | 天天天天天干 | 免费看的视频 |