正在移植2440, 偶然看2.6.32代碼的時(shí)候, 發(fā)現(xiàn)smdk2440的mach-smdk2440.c中有如下結(jié)構(gòu)體定義:
static struct map_desc smdk2440_iodesc[] __initdata = {
/* ISA IO Space map (memory space selected by A24) */
{
.virtual = (u32)S3C24XX_VA_ISA_WORD,
.pfn = __phys_to_pfn(S3C2410_CS2),
.length = 0x10000,
.type = MT_DEVICE,
}, {
.virtual = (u32)S3C24XX_VA_ISA_WORD + 0x10000,
.pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)),
.length = SZ_4M,
.type = MT_DEVICE,
}, {
.virtual = (u32)S3C24XX_VA_ISA_BYTE,
.pfn = __phys_to_pfn(S3C2410_CS2),
.length = 0x10000,
.type = MT_DEVICE,
}, {
.virtual = (u32)S3C24XX_VA_ISA_BYTE + 0x10000,
.pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)),
.length = SZ_4M,
.type = MT_DEVICE,
}
};
不明白什么意思, so~ google到了http://blog.chinaunix.net/u2/68846/showart_692324.html
如果都是在memory空間的話,CPU內(nèi)部的寄存器(非CPU核的寄存器)和外設(shè)上的寄存器地位是同等的,因此映射方法也是2種:1是靜態(tài)映射(S3C2410的基本上是這種),2是ioremap,注意映射的單位都至少是page。當(dāng)然CPU核的寄存器(如X86的CS、DS,ARM的R0,R1等)只能用匯編來(lái)訪問了。
在將Linux移植到目標(biāo)電路板的過程中,通常會(huì)建立外設(shè)I/O內(nèi)存物理地址到虛擬地址的靜態(tài)映射,這個(gè)映射通過在電路板對(duì)應(yīng)的map_desc結(jié)構(gòu)體數(shù)組中添加新的成員來(lái)完成,map_desc結(jié)構(gòu)體的定義如代碼清單11.12所示。
代碼清單11.12 map_desc結(jié)構(gòu)體
1 struct map_desc
2 {
3 unsigned long virtual;//虛擬地址
4 unsigned long pfn ;// __phys_to_pfn(phy_addr)
5 unsigned long length; //大小
6 unsigned int type;//類型
7 };
例子就是文章開頭的ARM評(píng)估板SMDK2440的mach-smdk2440.c部分代碼.
Linux操作系統(tǒng)移植到特定平臺(tái)上MACHINE_START到MACHINE_END宏之間的定義針對(duì)特定電路板而設(shè)計(jì),其中的map_io()成員函數(shù)完成I/O內(nèi)存的靜態(tài)映射,代碼清單11.14給出了SMDK2440電路板的MACHINE_START、MACHINE_END宏的例子。
代碼清單11.14 SMDK2440 MACHINE_START、MACHINE_END宏
MACHINE_START(S3C2440, 'SMDK2440')
/* Maintainer: Ben Dooks .phys_io = S3C2410_PA_UART, .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc, .boot_params = S3C2410_SDRAM_PA + 0x100, .init_irq = s3c24xx_init_irq, .map_io = smdk2440_map_io, .init_machine = smdk2440_machine_init, .timer = &s3c24xx_timer, MACHINE_END 第8行賦值給map_io的smdk2440_map_io()函數(shù)完成SMDK2440電路板I/O內(nèi)存的靜態(tài)映射,最終調(diào)用的是cpu->map_io()建立map_desc數(shù)組中物理內(nèi)存和虛擬內(nèi)存的靜態(tài)映射關(guān)系。 static void __init smdk2440_map_io(void) { s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); s3c24xx_init_clocks(12000000); s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs)); } 在一個(gè)已經(jīng)移植好OS的內(nèi)核中,驅(qū)動(dòng)工程師完全可以對(duì)非常規(guī)內(nèi)存區(qū)域的I/O內(nèi)存(外設(shè)控制器寄存器、MCU內(nèi)部集成的外設(shè)控制器寄存器等)依照電路板的資源使用情況添加到map_desc數(shù)組中,代碼清單11.15的例子給出了內(nèi)存空間資源的使用情況(注釋部分)與map_desc數(shù)組的對(duì)應(yīng)關(guān)系。 /* * 邏輯地址 物理地址 * e8000000 40000000 PCI memory PHYS_PCI_MEM_BASE (max 512M) * ec000000 61000000 PCI 配置空間 PHYS_PCI_CONFIG_BASE (max 16M) * ed000000 62000000 PCI V3 regs PHYS_PCI_V3_BASE (max 64k) * ee000000 60000000 PCI IO PHYS_PCI_IO_BASE (max 16M) * ef000000 Cache flush * f1000000 10000000 核心模塊寄存器 * f1100000 11000000 系統(tǒng)控制寄存器 * f1200000 12000000 EBI寄存器 * f1300000 13000000 計(jì)數(shù)器/定時(shí)器 * f1400000 14000000 中斷控制器 * f1600000 16000000 UART 0 * f1700000 17000000 UART 1 * f1a00000 1a000000 調(diào)試用LEDs * f1b00000 1b000000 GPIO */ static struct map_desc ap_io_desc[] __initdata = { { .virtual = IO_ADDRESS(INTEGRATOR_HDR_BASE), .pfn = __phys_to_pfn(INTEGRATOR_HDR_BASE), .length = SZ_4K, .type = MT_DEVICE }, { .virtual = IO_ADDRESS(INTEGRATOR_SC_BASE), .pfn = __phys_to_pfn(INTEGRATOR_SC_BASE), .length = SZ_4K, .type = MT_DEVICE }, { .virtual = IO_ADDRESS(INTEGRATOR_EBI_BASE), .pfn = __phys_to_pfn(INTEGRATOR_EBI_BASE), .length = SZ_4K, .type = MT_DEVICE }, { .virtual = IO_ADDRESS(INTEGRATOR_CT_BASE), .pfn = __phys_to_pfn(INTEGRATOR_CT_BASE), .length = SZ_4K, .type = MT_DEVICE }, { .virtual = IO_ADDRESS(INTEGRATOR_IC_BASE), .pfn = __phys_to_pfn(INTEGRATOR_IC_BASE), .length = SZ_4K, .type = MT_DEVICE }, { .virtual = IO_ADDRESS(INTEGRATOR_UART0_BASE), .pfn = __phys_to_pfn(INTEGRATOR_UART0_BASE), .length = SZ_4K, .type = MT_DEVICE }, { .virtual = IO_ADDRESS(INTEGRATOR_UART1_BASE), .pfn = __phys_to_pfn(INTEGRATOR_UART1_BASE), .length = SZ_4K, .type = MT_DEVICE }, { .virtual = IO_ADDRESS(INTEGRATOR_DBG_BASE), .pfn = __phys_to_pfn(INTEGRATOR_DBG_BASE), .length = SZ_4K, .type = MT_DEVICE }, { .virtual = IO_ADDRESS(INTEGRATOR_GPIO_BASE), .pfn = __phys_to_pfn(INTEGRATOR_GPIO_BASE), .length = SZ_4K, .type = MT_DEVICE }, { .virtual = PCI_MEMORY_VADDR, .pfn = __phys_to_pfn(PHYS_PCI_MEM_BASE), .length = SZ_16M, .type = MT_DEVICE }, { .virtual = PCI_CONFIG_VADDR, .pfn = __phys_to_pfn(PHYS_PCI_CONFIG_BASE), .length = SZ_16M, .type = MT_DEVICE }, { .virtual = PCI_V3_VADDR, .pfn = __phys_to_pfn(PHYS_PCI_V3_BASE), .length = SZ_64K, .type = MT_DEVICE }, { .virtual = PCI_IO_VADDR, .pfn = __phys_to_pfn(PHYS_PCI_IO_BASE), .length = SZ_64K, .type = MT_DEVICE 85 } 86 }; 此后,在設(shè)備驅(qū)動(dòng)中訪問經(jīng)過map_desc數(shù)組映射后的I/O內(nèi)存時(shí),直接在map_desc中該段的虛擬地址上加上相應(yīng)的偏移即可,不再需要使用ioremap()。
上一篇:linux2.6.32 內(nèi)核移植s3c2440 - DM9000網(wǎng)卡驅(qū)動(dòng)移植
下一篇:linux 2.6.32 在arm9(s3c2440)平臺(tái)的移植 - 標(biāo)題要長(zhǎng)(2)
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- LDK130PU30R 3V、300 mA 低靜態(tài)電流極低噪聲 LDO 的典型應(yīng)用可調(diào)版本電路
- DER-508 - 4.75W 雙輸出電源
- LTC2201IUK、16 位、20Msps ADC 的典型應(yīng)用電路
- 使用 Analog Devices 的 LTC1450CN 的參考設(shè)計(jì)
- AD8646ARMZ-REEL 24MHz 軌到軌運(yùn)算放大器的典型應(yīng)用電路
- SimplePnP:個(gè)人用開源的PCB貼裝機(jī)(含設(shè)計(jì)文件、原理圖、源碼、軟件等)
- LT3970EMS-3.3 5V 同步降壓轉(zhuǎn)換器的典型應(yīng)用
- LT3007ITS8-3.3 用于保活電源的低壓差線性穩(wěn)壓器的典型應(yīng)用電路
- LT1021BCN8-5 精密電壓基準(zhǔn)的典型應(yīng)用
- 具有 250:1 PWM 調(diào)光和 LED 開路保護(hù)的 LT3755IMSE 21W 降壓-升壓模式的典型應(yīng)用電路
- RISC-V人才該怎么培養(yǎng)?專家這樣說(shuō)
- 割草機(jī)器人,四大流派的巔峰之戰(zhàn)
- 車載顯示迎來(lái)三大革命丨“形態(tài)”革命
- 什么是“CDC+空懸”?
- 汽車電子信息安全:如何有效保護(hù)硬件Debug口?
- 新能源汽車核心技術(shù)之“大三電”、“小三電”
- 芯原如何推動(dòng)RISC-V嵌入式軟件人才發(fā)展?
- Arm 技術(shù)助力《國(guó)家地理》探險(xiǎn)家繪制地球海洋圖景
- Arm SME2 技術(shù)加速安卓 AI 升級(jí),驅(qū)動(dòng)移動(dòng)應(yīng)用下一代功能革新
- VGA接口定義、功能用途和種類
- TouchGFX多屏切換無(wú)過渡效果,求解?
- 智能家居
- X波段波導(dǎo)裂縫全向天線的仿真研制
- STM32F10x軟件庫(kù)用戶手冊(cè)?在哪里可以下載
- MSP430仿真器調(diào)試遇到的的問題
- Microchip今天直播|TA100-VAO對(duì)ADAS和IVI系統(tǒng)的CAN FD進(jìn)行安全引導(dǎo)和消息身份驗(yàn)證
- ARM11后現(xiàn)代時(shí):Cortex開枝散葉
- 關(guān)于電子節(jié)氣門的問題
- 網(wǎng)友使用氣壓傳感器LPS22HBTR遇到的問題及解決辦法匯總
- 如何使用WINIO實(shí)現(xiàn)鍵盤的監(jiān)控?