當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 1、前言IO端口與IO內(nèi)存的概念:外設(shè)中的寄存器稱為是IO端口,外設(shè)中的內(nèi)存稱為是IO內(nèi)存。二者統(tǒng)稱為IO空間。Linux內(nèi)核是通過虛擬地址訪問外設(shè)的。所以需要先將虛擬地址映射到相應(yīng)外設(shè)的物理地址上,lin

1、前言

IO端口與IO內(nèi)存的概念:外設(shè)中的寄存器稱為是IO端口,外設(shè)中的內(nèi)存稱為是IO內(nèi)存。二者統(tǒng)稱為IO空間。Linux內(nèi)核是通過虛擬地址訪問外設(shè)的。所以需要先將虛擬地址映射到相應(yīng)外設(shè)的物理地址上,linux的映射方式有兩種:靜態(tài)映射(map_desc)和動(dòng)態(tài)映射(ioremap),其實(shí)也是內(nèi)核訪問外設(shè)資源的方式。

2、靜態(tài)映射基本過程:

在驅(qū)動(dòng)中配置寄存器,可以調(diào)用類似于s3c_gpio_cfgpin、s3c_gpio_setpull、gpio_direction_output等直接配置IO寄存器的函數(shù)。這些函數(shù)訪問的虛擬地址,這些虛擬地址都是已經(jīng)在啟動(dòng)啟動(dòng)的時(shí)候通過靜態(tài)映射方式映射到IO寄存器的物理地址上。

靜態(tài)映射概念:所謂的靜態(tài)映射是指,虛擬地址到物理地址的轉(zhuǎn)換所需要的頁表在操作系統(tǒng)啟動(dòng)時(shí)已經(jīng)配置好,不需要用戶進(jìn)行配置,虛擬地址到物理地址的查表轉(zhuǎn)換可直接完成(fromnet)。

以s5pv210為例講述:

MACHINE_START(SMDKV210,"SMDKV210")

/* Maintainer: Kukjin Kim */

.boot_params =S5P_PA_SDRAM + 0x100,

.init_irq =s5pv210_init_irq,

.map_io = smdkv210_map_io,

.init_machine = smdkv210_machine_init,

#ifdefCONFIG_S5P_HIGH_RES_TIMERS

.timer = &s5p_systimer,

#else

.timer =&s5p_timer,

#endif

MACHINE_END

其中IO映射函數(shù)是smdkv210_map_io實(shí)現(xiàn):

staticvoid __init smdkv210_map_io(void)

{

s5p_init_io(NULL,0, S5P_VA_CHIPID);

s3c24xx_init_clocks(24000000);

s5pv210_gpiolib_init();

s3c24xx_init_uarts(smdkv210_uartcfgs,

ARRAY_SIZE(smdkv210_uartcfgs));

#ifndefCONFIG_S5P_HIGH_RES_TIMERS

s5p_set_timer_source(S5P_PWM2, S5P_PWM4);

#endif

s5p_reserve_bootmem(s5pv210_media_devs,

ARRAY_SIZE(s5pv210_media_devs),

S5P_RANGE_MFC);

}

該函數(shù)中調(diào)用s5p_init_io進(jìn)行地址的映射,

/*read cpu identification code */

void__inits5p_init_io(struct map_desc*mach_desc,

int size, void __iomem *cpuid_addr)

{

unsigned long idcode;

/* initialize the io descriptors we need forinitialization */

iotable_init(s5p_iodesc, ARRAY_SIZE(s5p_iodesc));

if (mach_desc)

iotable_init(mach_desc, size);

idcode = __raw_readl(cpuid_addr);

s3c_init_cpu(idcode,cpu_ids, ARRAY_SIZE(cpu_ids));

}

其中最重要是struct map_desc s5p_iodesc[]結(jié)構(gòu)體 和 staticstruct map_desc s5pv210_iodesc[]:

structmap_desc{

unsigned long virtual; // IO空間映射后的虛擬地址

unsigned long pfn; // IO空間的物理地址所在的頁幀號(hào)

unsigned long length; // IO空間的長(zhǎng)度

unsigned int type; // IO空間的類型

};

/*minimal IO mapping這部分是最小系統(tǒng)層次的映射*/

staticstruct map_desc s5p_iodesc[] __initdata = {

{

.virtual =(unsigned long)S5P_VA_CHIPID,

.pfn =__phys_to_pfn(S5P_PA_CHIPID),

.length =SZ_4K,

.type =MT_DEVICE,

}, {

.virtual = (unsigned long)S3C_VA_SYS,

.pfn = __phys_to_pfn(S5P_PA_SYSCON),

.length = SZ_64K,

.type = MT_DEVICE,

},{

.virtual =(unsigned long)S3C_VA_TIMER,

.pfn =__phys_to_pfn(S5P_PA_TIMER),

.length =SZ_16K,

.type =MT_DEVICE,

},{

.virtual =(unsigned long)S3C_VA_WATCHDOG,

.pfn =__phys_to_pfn(S3C_PA_WDT),

.length =SZ_4K,

.type =MT_DEVICE,

}, {

.virtual =(unsigned long)S5P_VA_SROMC,

.pfn =__phys_to_pfn(S5P_PA_SROMC),

.length =SZ_4K,

.type =MT_DEVICE,

},

};

/*Initial IO mappings*/

staticstruct map_desc s5pv210_iodesc[] __initdata = {

{

.virtual =(unsigned long)S5P_VA_SYSTIMER,

.pfn =__phys_to_pfn(S5PV210_PA_SYSTIMER),

.length =SZ_4K,

.type =MT_DEVICE,

}, {

.virtual =(unsigned long)S5P_VA_GPIO,

.pfn =__phys_to_pfn(S5PV210_PA_GPIO),

.length =SZ_4K,

.type =MT_DEVICE,

}, {

.virtual =(unsigned long)VA_VIC0,

.pfn =__phys_to_pfn(S5PV210_PA_VIC0),

.length =SZ_16K,

.type =MT_DEVICE,

}, {

.virtual =(unsigned long)VA_VIC1,

.pfn =__phys_to_pfn(S5PV210_PA_VIC1),

.length =SZ_16K,

.type =MT_DEVICE,

}, {

.virtual =(unsigned long)VA_VIC2,

.pfn =__phys_to_pfn(S5PV210_PA_VIC2),

.length =SZ_16K,

.type =MT_DEVICE,

}, {

.virtual =(unsigned long)VA_VIC3,

.pfn =__phys_to_pfn(S5PV210_PA_VIC3),

.length =SZ_16K,

.type =MT_DEVICE,

}, {

.virtual =(unsigned long)S3C_VA_UART,

.pfn =__phys_to_pfn(S3C_PA_UART),

.length =SZ_512K,

.type =MT_DEVICE,

}, {

.virtual =(unsigned long)S5P_VA_DMC0,

.pfn =__phys_to_pfn(S5PV210_PA_DMC0),

.length =SZ_4K,

.type =MT_DEVICE,

}, {

.virtual =(unsigned long)S5P_VA_DMC1,

.pfn =__phys_to_pfn(S5PV210_PA_DMC1),

.length =SZ_4K,

.type =MT_DEVICE,

},{

.virtual = (unsigned long)S5P_VA_BUS_AXI_DSYS,

.pfn = __phys_to_pfn(S5PV210_PA_BUS_AXI_DSYS),

.length= SZ_4K,

.type = MT_DEVICE,

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉