<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于S3C2410-ARM-Linux靜態(tài)映射分析

基于S3C2410-ARM-Linux靜態(tài)映射分析

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò ) 收藏
s3c2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPB0_TOUT0);
我們可以這樣控制外設寄存器,想過(guò)它怎么實(shí)現的嗎?
首先分析下structmachine_desc (include/asm-arm/Mach/Arch.h)
這是一個(gè)非常重要的結構體,內核通過(guò) machine_desc 來(lái)控制體系架構相關(guān)部分的初始化,包括map_io,init_irq,init_machine,pthys_io,timer等

本文引用地址:http://dyxdggzs.com/article/201611/316658.htm

structmachine_desc{
/*
* Note! The first five elements are used
* by assembler code in head-armv.S
*/
unsignedintnr;/* architecture number*/
unsignedintphys_ram;/* start of physical ram */
unsignedintphys_io;/* start of physical io*/
unsignedintio_pg_offst;/* byte offset for io
* page tabe entry*/
constchar*name;/* architecture name*/
unsignedlongboot_params;/* tagged list*/
unsignedintvideo_start;/* start of video RAM*/
unsignedintvideo_end;/* end of video RAM*/
unsignedintreserve_lp0:1;/* never has lp0*/
unsignedintreserve_lp1:1;/* never has lp1*/
unsignedintreserve_lp2:1;/* never has lp2*/
unsignedintsoft_reboot:1;/* soft reboot*/
void(*fixup)(structmachine_desc*,
structtag*,char**,
structmeminfo*);
void(*map_io)(void);/* IO mapping function*/
void(*init_irq)(void);
structsys_timer*timer;/* system tick timer*/
void(*init_machine)(void);
};

那我們怎么創(chuàng )建自己的machine_desc呢?
內核給我們提供了一個(gè)宏:

#defineMACHINE_START(_type,_name)/
conststructmachine_desc __mach_desc_##_type/
__attribute__((__section__(".arch.info.init")))={/
.nr=MACH_TYPE_##_type,/
.name=_name,
#defineMACHINE_END/
};


這樣我們就可以定義自己的machine_desc了

MACHINE_START(SMDK2410,"SMDK2410")/* @TODO: request a new identifier and switch
* to SMDK2410 */
/* Maintainer: Jonas Dietsche */
.phys_ram=S3C2410_SDRAM_PA,
.phys_io=S3C2410_PA_UART,
.io_pg_offst=(((u32)S3C24XX_VA_UART)>>18)&0xfffc,
.boot_params=S3C2410_SDRAM_PA+0x100,
.map_io=smdk2410_map_io,
.init_irq=smdk2410_init_irq,
.init_machine=sdmk2410_init,
.timer=&s3c24xx_timer,
MACHINE_END

這里我們創(chuàng )建了 machine_desc,并給其中一些成員賦了值,這相當于是內核給我們提供的編程接口,這樣就可以調用自己的函數了。

這其中map_io 在 setup_arch 中調用調用,我們跟進(jìn)去會(huì )發(fā)現:

在smdk2410_map_io-->s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc))->iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)) 看到:

void__init iotable_init(structmap_desc*io_desc,intnr)
{
inti;
for(i=0;icreate_mapping(io_desc+i);
}

就是在這里調用create_mapping()創(chuàng )建的頁(yè)表,這里的第一個(gè)參數,map_desc 定義如下:

structmap_desc{
unsignedlongvirtual;
unsignedlongphysical;
unsignedlonglength;
unsignedinttype;
};

create_mapping()就是通過(guò)這個(gè)結構體創(chuàng )建的映射表,這樣我們可以通過(guò)創(chuàng )建 map_desc 然后傳給這個(gè)函數就可以創(chuàng )建相應的 虛擬地址-->物理地址 映射.

在 inlcude/asm-arch/Arch-s3c2410/Map.h

定義了每一種資源用于 map_desc變量的宏定義,如:

/* MMC controller - available on the S3C2400 */
#defineS3C2400_VA_MMC S3C2400_ADDR(0x00700000)
#defineS3C2400_PA_MMC (0x15A00000)
#defineS3C2400_SZ_MMC SZ_1M

/* UARTs */
#defineS3C24XX_VA_UART S3C2410_ADDR(0x00800000)
#defineS3C2400_PA_UART(0x15000000)
#defineS3C2410_PA_UART(0x50000000)
#defineS3C24XX_SZ_UART SZ_1M

/* Timers */
#defineS3C24XX_VA_TIMER S3C2410_ADDR(0x00900000)
#defineS3C2400_PA_TIMER(0x15100000)
#defineS3C2410_PA_TIMER(0x51000000)
#defineS3C24XX_SZ_TIMER SZ_1M

然后針對具體的某個(gè)外設,有具體寄存器的定義,如:

include/asm/arch-s3c2410/regs-timer.h

#ifndef__ASM_ARCH_REGS_TIMER_H
#define__ASM_ARCH_REGS_TIMER_H"$Id: timer.h,v 1.4 2003/05/06 19:30:50 ben Exp $"

#defineS3C2410_TIMERREG(x)(S3C24XX_VA_TIMER+(x))
#defineS3C2410_TIMERREG2(tmr,reg)S3C2410_TIMERREG((reg)+0x0c+((tmr)*0x0c))

#defineS3C2410_TCFG0 S3C2410_TIMERREG(0x00)
#defineS3C2410_TCFG1 S3C2410_TIMERREG(0x04)
#defineS3C2410_TCON S3C2410_TIMERREG(0x08)

#defineS3C2410_TCFG_PRESCALER0_MASK(255<<0)
#defineS3C2410_TCFG_PRESCALER1_MASK(255<<8)
#defineS3C2410_TCFG_PRESCALER1_SHIFT(8)
#defineS3C2410_TCFG_DEADZONE_MASK(255<<16)
#defineS3C2410_TCFG_DEADZONE_SHIFT(16)
.........................




關(guān)鍵詞: S3C2410靜態(tài)映

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>