注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

火车的家

Put first thing first

 
 
 

日志

 
 

2012.02.05 kernel porting ( 二 ) ---- machine_desc 结构体  

2012-02-05 15:25:57|  分类: linux kernel |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

下文直接以源代码的形式说明 machine_desc 结构体 应该如何填充。
board-map100.c 源代码:

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/platform_device.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/time.h>
#include <mach/baseregs.h>
#include <hal/inc/hal_gpio.h>
#include <linux/delay.h>

#define IO_MAP_DESC_ENTRY(a) {a##_BASE_UA, __phys_to_pfn(a##_BASE_PA), a##_SIZE, MT_DEVICE}

extern void map100_init_irq(void);
extern void map100_init_platform_devices(void);
extern int map_power_check(void);
extern struct sys_timer map100_timer;
static void map100_power_off(void);

//1. 所有的XXX_UA虚地址都在
//arch\arm\mach-map100\include\mach\baseregs.h
//文件定义。
//有个问题,为什么虚地址从F4000000开始定义?会不会与其他地址冲突?

//不会冲突,因为
//iotable_init(map100_io_desc, ARRAY_SIZE(map100_io_desc));
//会将map100_io_desc加入内存映射表,之后的映射不会再使用
//map100_io_desc中已经使用的地址。
//实际上,可以从任何linux内核高地址区间开始定义,也就是只要地址高于3G即可。

//2. 物理地址和size定义在
//arch\arm\mach-map100\include\hal\inc\hal_soc.h文件

//3. 这里的内存映射和mmu有什么区别?
//这里的内存映射关系会直接填充到mmu。

static struct map_desc map100_io_desc[] __initdata = {
    IO_MAP_DESC_ENTRY(NANDC),
    IO_MAP_DESC_ENTRY(MEDIACORE),
    IO_MAP_DESC_ENTRY(I2C2),
    IO_MAP_DESC_ENTRY(I2C1),
    IO_MAP_DESC_ENTRY(GPIO),
    IO_MAP_DESC_ENTRY(INTC),
    IO_MAP_DESC_ENTRY(WDT),
    IO_MAP_DESC_ENTRY(TIMER),
    IO_MAP_DESC_ENTRY(RTC),
    IO_MAP_DESC_ENTRY(PMU),
    IO_MAP_DESC_ENTRY(FFUART),
    IO_MAP_DESC_ENTRY(BTUART),
    IO_MAP_DESC_ENTRY(SUART),
    IO_MAP_DESC_ENTRY(MSC),
    IO_MAP_DESC_ENTRY(SDMMC1),
    IO_MAP_DESC_ENTRY(SDMMC2),
    IO_MAP_DESC_ENTRY(SPI1),
    IO_MAP_DESC_ENTRY(I2SAC97),
    IO_MAP_DESC_ENTRY(SPI2),
    IO_MAP_DESC_ENTRY(LCDC),
    IO_MAP_DESC_ENTRY(TVE),
    IO_MAP_DESC_ENTRY(ISP),
    IO_MAP_DESC_ENTRY(OTG),
    IO_MAP_DESC_ENTRY(SDMC),
    IO_MAP_DESC_ENTRY(SMC),
    IO_MAP_DESC_ENTRY(AHBC),
    IO_MAP_DESC_ENTRY(EBIC),
    IO_MAP_DESC_ENTRY(APBBRG),
    IO_MAP_DESC_ENTRY(APBDMA),
    IO_MAP_DESC_ENTRY(DMAC),
};

static void __init map100_machine_init(void)
{
    map100_init_platform_devices();
}                          

static void map100_power_off(void)
{
    //do nothing now.
}

static void __init map100_map_io(void)
{
    //io地址的静态映射。
    iotable_init(map100_io_desc, ARRAY_SIZE(map100_io_desc));

    //如果这个指针不为空的话,关机时会调用这个函数
    pm_power_off = map100_power_off;
}

//MACHINE_START会隐式定义下面两个成员:

//1 .nr有什么用?
//.nr,代码中的注释是architecture number,
//在arch/arm/kernel/head.S中用到(代码中的MACHINFO_TYPE就是.nr)

//MACH_TYPE_##_type是在哪里定义的?
//include\asm-arm\mach-types.h
//这个文件是由arch/arm/tools/mach-types自动生成的

//2 .name,是移植平台的名称

MACHINE_START(MAP100, "MAP100")

//(做实验)
//下面两个字段做什么用的?
//参见 http://tassardge.blog.163.com/blog/static/1723017082012027113826709/
.phys_io    = FFUART_BASE_PA,
.io_pg_offst    = ((FFUART_BASE_UA) >> 18) & 0xfffc,

//(做实验)
//PARAMS_PHYS一般用来保存bootloader传入的启动参数.
//见下文
//1)http://tassardge.blog.163.com/blog/static/
//1723017082010102553942259/
//根据这篇文章PARAMS_PHYS应该是
//(物理内存起始地址+0x100)
//2)PARAMS_PHYS是一个物理地址.在
//arch\arm\mach-map100\include\mach\memory.h定义
//注意,在这个文件里PHYS_OFFSET是物理内存起始地址
.boot_params    = PARAMS_PHYS,

//指向系统的 timer
.timer        = &map100_timer,

//顾名思义,初始化中断向量表
.init_irq    = map100_init_irq,

//导入静态内存映射表
.map_io        = map100_map_io,

//初始化 platform 设备列表;注册 i2c/spi 总线等等。
.init_machine    = map100_machine_init,

MACHINE_END
  评论这张
 
阅读(836)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018