Chinaunix首页 | 论坛 | 博客
  • 博客访问: 299513
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 587
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-09 09:24
个人简介

水滴

文章分类

全部博文(52)

文章存档

2021年(3)

2019年(8)

2018年(32)

2017年(9)

我的朋友

分类: LINUX

2018-07-01 19:02:31

物理地址映射

    对于系统含有mmu(内存管理单元), 实现物理地址地址到虚拟地址之间映射关系,Linux内核中操作,基本都是对虚拟地址的操作,实现对外设设备的控制

1. 物理地址映射

    文件arch/arm/mach-exynos/cpu-exynos4.c文件,实现物理地址到虚拟地址的映射,当系统初始化时,调用系统函数int __init exynos4_init(void)实现物理地址到虚拟地址的映射。
    主要结构体:
    struct map_desc {
        unsigned long virtual;   //虚拟地址
        unsigned long pfn;       //物理地址
        unsigned long length;   //空间大小
        unsigned int type;        //类型
    };
    例如:
    {
        .virtual    = (unsigned long)S5P_VA_GPIO2,             //0xF6000000+0x02240000
        .pfn        = __phys_to_pfn(EXYNOS4_PA_GPIO2),    //物理地址 0x11000000
        .length        = SZ_4K,
        .type        = MT_DEVICE,
    }

2.gpio初始化

    文件drivers/gpio/gpio-exynos4.c实现gpio虚拟地址的初始化。
    core_initcall 当系统启动初始化时被调用,初始化函数exynos4_gpiolib_init(void);
    主要结构体:
    struct s3c_gpio_chip {
        struct gpio_chip    chip;
        struct s3c_gpio_cfg    *config;
        struct s3c_gpio_pm    *pm;
        void __iomem        *base;
        int            irq_base;
        int            group;
        unsigned int        eint_offset;
        spinlock_t        lock;
        #ifdef CONFIG_PM
            u32            pm_save[4];
        #endif
    };
    例如:
    {
        .base   = (S5P_VA_GPIO2 + 0x100),     //GPL2CON的控制虚拟地址
        .eint_offset = 0x20,    //io中断偏移
        .group    = 22,           //GPIO分组
        .chip    = {
            .base    = EXYNOS4_GPL2(0), //GPIOL2有8个I0口,基地址
            .ngpio    = EXYNOS4_GPIO_L2_NR, //IO口数量
            .label    = "GPL2",
        },
    }
    后期对GPL2(0)端口的设置,则只需要对虚拟地址EXYNOS4_GPL2(0)进行操作设置
阅读(3548) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~