Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> I /Oメモリスタティックマップマップ

I /Oメモリスタティックマップマップ

  
 

Linuxでのターゲットボードを処理するために、多くの場合、物理メモリアドレスの静的マッピングに周辺I /Oの仮想アドレスを作成します。

//使用構造体structのmap_desc {unsigned long型仮想; //仮想アドレスunsigned long型PFN; //__ phys_to_pfn(物理アドレス)、物理ページフレーム番号の符号なし長い長さであり; //サイズunsigned int型; //タイプ};


Linuxで/アーチ/アーム/PLAT-S5P /cpu.cで:CPUタイプ* /静的定数サポートサポートCPUの

/*テーブル>ここでPLATレベルmap_ioでありますチャーname_s5pv210 [] =" S5PV210 /S5PC110";静的構造体cpu_table cpu_ids [] __initdata = {{.idcode = 0x43110000、.idmask = 0xfffff000、.map_io = s5pv210_map_io、//これは、マッハレベルmap_io.init_clocksの=のs5pv210_init_clocksあります.init_uarts = s5pv210_init_uarts、.INIT = s5pv210_init、.nameの= name_s5pv210、}、};

/*最小のIOマッピング* /静的構造体map_desc s5p_iodesc [] __initdata = {{(長い符号なし)= .virtual S5P_VA_CHIPIDページの、.pfn = __phys_to_pfn(S5P_PA_CHIPID)。長さ= SZ_4K、//サイズは、ARM 4Kであるので、この長さは= SZ_64K、.TYPE = MT_DEVICE、}、{.TYPEの複数4K = MT_DEVICE、}、{S3C_VA_SYS、.pfn = __phys_to_pfn(長い符号なし)= .virtual(S5P_PA_SYSCON)。長さでなければなりません= .virtual =(unsigned long型)S3C_VA_UART、.pfn = __phys_to_pfn(S3C_PA_UART)。長さ= SZ_4K、.TYPE = MT_DEVICE、}、{.virtual =(unsigned long型)VA_VIC0、.pfn = __phys_to_pfn(S5P_PA_VIC0)。長さ(unsigned long型)= SZ_16K、.TYPE = MT_DEVICE、}、{.virtual VA_VIC1、.pfn = __phys_to_pfn(S5P_PA_VIC1)。長さ= SZ_16K、.TYPE = MT_DEVICE、}、{= .virtual(unsigned long型)S3C_VA_TIMER、。 PFN = __phys_to_pfn(S5P_PA_TIMER)。長さ= SZ_16K、.TYPE = MT_DEVICE、}、{.virtual =(unsigned long型)S5P_VA_GPIO、.pfn = __phys_to_pfn(S5P_PA_GPIO)。長さ= SZ_4K、.TYPE = MT_DEVICE、}、{ = .virtual =(長符号なし)S3C_VA_WATCHDOG、.pfn = __phys_to_pfn(S5P_PA_WDT)。長さ= SZ_4K、.TYPE = MT_DEVICE、}、{(unsigned long型)= .virtual S3C_VA_OTG、.pfn = __phys_to_pfn(S5P_PA_OTG)。長さSZ_1M、.TYPE = MT_DEVICE、}、(unsigned long型)= {.virtual S3C_VA_OTGPHY、.pfn = __ph ys_to_pfn(S5P_PA_OTGPHY)、長さ= SZ_1M、.TYPE = MT_DEVICE、}、};


ボイド__init s5p_init_io(構造体map_desc * mach_desc、int型のサイズ、空隙__iomem * cpuid_addr){/*私たちは、初期化のために必要なIOディスクリプタ* /iotable_init(s5p_iodesc、ARRAY_SIZE(s5p_iodesc))を初期化し; //最終的にページマップ(ここでは主にPLATレベルmap_ioがある)

IDCODE = __raw_readl(の機能を確立cpuid_addr); s3c_init_cpu(IDCODE、cpu_ids、ARRAY_SIZE(cpu_ids)); //この関数は、最終的にはマッハレベルmap_io}


/カーネル/アーチ/アーム/マッハs5pv210によって呼び出します/mach-smdkv210.cここで://呼ばれるプレートを初期静的ボイド__init smdkv210_map_io(ボイド){s5p_init_io(NULL、0、S5P_VA_CHIPID); ...} MACHINE_START(sMDKV210、" smdkv210")phys_io = S3C_PA_UART。 & 0xfff00000、.io_pg_offst =(((U32)S3C_VA_UART)>> 18)& 0xfffc、.boot_params = S5P_PA_SDRAM + 0x100の、.fixup = s5pv210_fixup、.init_irq = s5pv210_init_irq、.map_io = smdkv210_map_io、.init_machine = smdkv210_machine_init 、.timer =& s5p_systim ER、MACHINE_ENDは


その後、(ioremap使用することなく、直接、仮想アドレスに対応するオフセットを加え、I /Oメモリマップされた静的なデバイスドライバを介してアクセスした場合) 。しかし、私は()も可能であるioremapを試してみましたが、間違っているかわかりませんか? ? ?







補足アタッチ(マッハ・レベルmap_io )中のlinux /アーチ/アーム/マッハs5pv210 /cpu.cで


/*初期IOマッピング* /静的構造体map_desc s5pv210_iodesc [] __initdata = {{.virtual = (unsigned long型)S5P_VA_SYSTIMER、.pfn = __phys_to_pfn(S5PV210_PA_SYSTIMER)。長さ= SZ_1M、.TYPE = MT_DEVICE、}、{.virtual =(unsigned long型)VA_VIC2、.pfn = __phys_to_pfn(S5PV210_PA_VIC2)。長さ= SZ_16K。タイプ= MT_DEVICE、}、{.virtual =(長符号なし)VA_VIC3、.pfn = __phys_to_pfn(S5PV210_PA_VIC3)。長さ= SZ_16K、.TYPE = MT_DEVICE、}、{= .virtual(unsigned long型)S5P_VA_SROMC、.pfn = __phys_to_pfn (S5PV210_PA_SROMC)。長さ= SZ_4K、.TYPE = MT_DEVICE、}、{.virtual =(unsigned long型)S5P_VA_AUDSS、.pfn = __phys_to_pfn(S5PV210_PA_AUDSS)。長さ= SZ_1M、.TYPE = MT_DEVICE、}、{.virtual = (unsigned long型)S5P_VA_DMC0、.pfn = __phys_to_pfn(S5PV210_PA_DMC0)。長さ= SZ_4K、.TYPE = MT_DEVICE、}、{(長い符号なし)= .virtual S5P_VA_DMC1、.pfn = __phys_to_pfn(S5PV210_PA_DMC1)、ルngth = SZ_4K、.TYPE = MT_DEVICE、}};

/* s5pv210_map_io **標準CPUレジスタIO領域* /ボイド__init s5pv210_map_io(ボイド){iotable_init(s5pv210_iodesc、ARRAY_SIZE(s5pv210_iodesc));} < BR>

Copyright © Windowsの知識 All Rights Reserved