LPC3250 Perpheral IO Mapping_weixin_34075268的博客-程序员宅基地

技术标签: 嵌入式  

LPC3250 IO空间图

机器描述

    在board-smartarm3250.c中实现:
MACHINE_START (LPC3XXX, "SmartARM3250 board with the LPC3250 Microcontroller")
          /* Maintainer: Kevin Wells, NXP Semiconductors */
          .phys_io= UART5_BASE,
          .io_pg_offst= ((io_p2v (UART5_BASE))>>18) & 0xfffc,
          .boot_params= 0x80000100,
         .map_io = lpc32xx_map_io,        //CPU IO映射入口
          .init_irq= lpc32xx_init_irq,
          .timer= &lpc32xx_timer,
          .init_machine= smartarm3250_board_init,
MACHINE_END
 
 
 

IO映射实现

   LPC3250移植代码对已经安排了外设的片内IO空间进行了映射,包括IRAM、AHB总线上的外设、FAB和APB总线上的外设。在arch-lpc32xx.c中实现:
 
static struct map_desc lpc32xx_io_desc[] __initdata = {
{                                                                                      //AHB0总线空间IO映射
          .virtual= io_p2v( AHB0_START),
          .pfn= __phys_to_pfn( AHB0_START),
          .length= AHB0_SIZE,
          .type= MT_DEVICE
},
{                                                                                      //AHB1总线空间IO映射
          .virtual= io_p2v(AHB1_START),
          .pfn= __phys_to_pfn(AHB1_START),
          .length= AHB1_SIZE,
          .type= MT_DEVICE
},
{                                                                                      //FAB和APB总线空间IO映射
          .virtual= io_p2v(FABAPB_START),
          .pfn= __phys_to_pfn(FABAPB_START),
          .length= FABAPB_SIZE,
          .type= MT_DEVICE
},
{                                                                                     //IRAM空间IO映射
          .virtual= io_p2v(IRAM_BASE),
          .pfn= __phys_to_pfn(IRAM_BASE),
          .length= (SZ_64K * 4),
          .type= MT_DEVICE
},
};
 
void __init lpc32xx_map_io(void)
{
          iotable_init (lpc32xx_io_desc, ARRAY_SIZE (lpc32xx_io_desc));
}
 

涉及到的宏定义

platform.h文件中定义所使用的宏定义。以AHB0为例:
/*
* AHB 0 physical base addresses
*/       
 
#define SLC_BASE          0x20020000
#define SSP0_BASE        0x20084000
#define SPI1_BASE        0x20088000
#define SSP1_BASE        0x2008C000
#define SPI2_BASE        0x20090000
#define I2S0_BASE        0x20094000
#define SD_BASE           0x20098000
#define I2S1_BASE        0x2009C000
#define MLC_BASE         0x200A8000
 
#define AHB0_START      SLC_BASE
#define AHB0_SIZE        ((MLC_BASE - SLC_BASE) + SZ_4K)
 

延伸阅读

    添加用户的特定IO映射

   如果要用户外扩了设备,需要添加IO映射,可以修改.map_io为用户自定义io_map函数,在自定义io_map函数中调用CPU的io_map函数。下面是基于PXA270的mainstone系统。
   首先声明一个map_desc结构,然后在自定义io_map函数中调用iotable_init函数对用户空间映射进行初始化:
 
610    static struct map_desc mainstone_io_desc[] __initdata = {
611        {       /* CPLD */
612                .virtual        =  MST_FPGA_VIRT,
613                .pfn            = __phys_to_pfn( MST_FPGA_PHYS),
614                .length         = 0x00100000,
615                .type           = MT_DEVICE
616        }
617    };
618
619    static void __init mainstone_map_io(void)
620    {
621        pxa_map_io();
622        iotable_init(mainstone_io_desc, ARRAY_SIZE(mainstone_io_desc));
623
624        /*      for use I SRAM as framebuffer.  */
625        PSLR |= 0xF04;
626        PCFR = 0x66;
627    }
628
629    MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
630        /* Maintainer: MontaVista Software Inc. */
631        .phys_io        = 0x40000000,
632        .boot_params    = 0xa0000100,   /* BLOB boot parameter setting */
633        .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
634        .map_io         = mainstone_map_io,            //IO空间映射
635        .init_irq       = mainstone_init_irq,
636        .timer          = &pxa_timer,
637        .init_machine   = mainstone_init,
638    MACHINE_END

    _phys_to_pfn

    _phys_to_pfn在arch/arm/include/asm/memory.h文件中定义:
120   /*
121    * Convert a physical address to a Page Frame Number and back
122    */
123   #define __phys_to_pfn(paddr)   ((paddr) >> PAGE_SHIFT)
124   #define __pfn_to_phys(pfn)      ((pfn) << PAGE_SHIFT)
 
    而下面这是LPC3250的io_p2v实现:
/* Start of virtual addresses for IO devices */
# define IO_BASE         0xF0000000
 
#define io_p2v(x) (IO_BASE | (((x) & 0xff000000) >> 4) | ((x) & 0x000fffff))
#define io_v2p(x) ((((x) & 0x0ff00000) << 4) | ((x) & 0x000fffff))
 
 

    PAGE_SHIFT

    见arch/arm/include/asm/page.h文件:
  13   /* PAGE_SHIFT determines the page size */
  14   #define PAGE_SHIFT             12
  15   #define PAGE_SIZE               (1UL << PAGE_SHIFT)
  16   #define PAGE_MASK               (~(PAGE_SIZE-1))
 

    io_p2v

   每个处理器都有自己的io_p2v实现,下面是PXA270处理器的,见arch/arm/mach-pxa/include/mach/hardware.h文件:
  28   /*
  29    * Intel PXA2xx internal register mapping:
  30    *
  31    * 0x40000000 - 0x41ffffff <--> 0xf2000000 - 0xf3ffffff
  32    * 0x44000000 - 0x45ffffff <--> 0xf4000000 - 0xf5ffffff
  33    * 0x48000000 - 0x49ffffff <--> 0xf6000000 - 0xf7ffffff
  34    * 0x4c000000 - 0x4dffffff <--> 0xf8000000 - 0xf9ffffff
  35    * 0x50000000 - 0x51ffffff <--> 0xfa000000 - 0xfbffffff
  36    * 0x54000000 - 0x55ffffff <--> 0xfc000000 - 0xfdffffff
  37    * 0x58000000 - 0x59ffffff <--> 0xfe000000 - 0xffffffff
  38    *
  39    * Note that not all PXA2xx chips implement all those addresses, and the
  40    * kernel only maps the minimum needed range of this mapping.
  41    */
  42    #define io_p2v(x) (0xf2000000 + ((x) & 0x01ffffff) + (((x) & 0x1c000000) >> 1))
  43    #define io_v2p(x) (0x3c000000 + ((x) & 0x01ffffff) + (((x) & 0x0e000000) << 1))
 

    添加外扩设备寄存器   

  18    #define MST_FPGA_PHYS           PXA_CS2_PHYS
  19    #define MST_FPGA_VIRT           (0xf0000000)
  20    #define MST_P2V(x)             ((x) - MST_FPGA_PHYS + MST_FPGA_VIRT)
  21    #define MST_V2P(x)              ((x) - MST_FPGA_VIRT + MST_FPGA_PHYS)
  22
  23    #ifndef __ASSEMBLY__
  24    # define __MST_REG(x)           (*((volatile unsigned long *)MST_P2V(x)))
  25    #else
  26    # define __MST_REG(x)           MST_P2V(x)
  27    #endif
  28
  29    /* board level registers in the FPGA */
  30
  31    #define MST_LEDDAT1             __MST_REG(0x08000010)
  32    #define MST_LEDDAT2             __MST_REG(0x08000014)
  33    #define MST_LEDCTRL             __MST_REG(0x08000040)
  34    #define MST_GPSWR               __MST_REG(0x08000060)
  35    #define MST_MSCWR1              __MST_REG(0x08000080)
  36    #define MST_MSCWR2              __MST_REG(0x08000084)
  37    #define MST_MSCWR3              __MST_REG(0x08000088)
  38    #define MST_MSCRD               __MST_REG(0x08000090)
  39    #define MST_INTMSKENA           __MST_REG(0x080000c0)
  40    #define MST_INTSETCLR           __MST_REG(0x080000d0)
  41    #define MST_PCMCIA0             __MST_REG(0x080000e0)
  42    #define MST_PCMCIA1             __MST_REG(0x080000e4)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34075268/article/details/86104714

智能推荐

centos7环境下使用python脚本监控mongodb集群复制状态-程序员宅基地

centos7环境下使用python脚本监控mongodb集群复制状态centos环境下搭建了 MongoDB 副本集,需要对集群的复制状态进行监控获取集群的状态信息,集群是3个节点,没有设置仲裁者[root@eus-image-design-mongo01:/usr/local]# mongo --port 21000MongoDB shell version v3.4.24c..._环境:python2.7+centos7+mongodb3.4/3.6/4.0 副本集

消息队列及常见消息队列介绍_消息队列有哪些_coder i++的博客-程序员宅基地

转载 消息队列及常见消息队列介绍 一、消息队列(MQ)概述消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。消息队列主要解决了应用耦合、异步处理、流量削锋等问题。当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列_消息队列有哪些

sql 查询重复记录并删除-程序员宅基地

--查询重复记录select original_product_name,original_product_specfrom ent_sfl_product_mappingwhere deleted = 0group by original_product_name,original_product_spec having count(1) > 1--删除重复记录d...

简述spring中常有的几种advice?-程序员宅基地

在Spring中,Advice都是通过Interceptor来实现的,主要有以下几种:1. 环绕Advice://例子摘自Spring referencepublic interface MethodInterceptor extends Interceptor { Object invoke(MethodInvocation invocation) throws T..._下列哪项不属于spring的advice类型

我叫LD,我是PM,我在路上-程序员宅基地

今天看到一片文章《我是艺术家》,颇有感受,忍不住想给自己也做个自我表述,当时涌上心头的词就是:我叫LD,我是PM,我在路上,那就用它来做我这篇自述的标题吧。 我81年出生在湖南的一个普通小镇,童年的岁月在父亲工作的大院的里度过,87年在母亲工作的中心小学读书,92年因为父亲的单位迁移到HY市而转学到子弟小学读书,93年上市重点初中,96年上省重点高中。在我18岁前的生命中,除了学习成绩不

go语言学习笔记2------第一个Go语言程序-程序员宅基地

第一个GO程序开发第一个GO程序。具体步骤如下:1:选择文件—&amp;gt;新建 弹出如下对话框。 注意:程序名称,和程序保存位置不能输入中文2:新建完成后,开始输入代码。第一行:每个Go源代码文件的开头都是一个package声明,表示该Go代码所属的包。 Go语言中是通过包来对代码进行管理的。那么什么是包呢?我通过一个例子来解释一下包的概念。例如:有一家公司叫“京东“”,该...

随便推点

vue实现tab切换并带切换样式的效果_vue tabs 默认tab就先刷新其他tab样式_小阳生煎的博客-程序员宅基地

如图所示<template> <div class="home" @touchmove.prevent @mousewheel.prevent> <div class="header"> <div class="header-one"> <div></div> </div> <div class="header-two"> <_vue tabs 默认tab就先刷新其他tab样式

flume报java.io.IOException: Not a data file的ERROR-程序员宅基地

flume清洗时报错 java.io.IOException: Not a data file,错误如下图:opening file 的文件明明是一个数据文件,非要说不是数据文件。没办法,追踪错误,查找源码去。。。结果在 package org.apache.avro.file中的 DataFileStream 类的initialize(InputStreamin)

android获取阅读进度,Android 进度条-程序员宅基地

ProgressBar是一个进度条控件,一般在需要做某个比较耗时的操作的时候,向用户展示执行进度,以免用户以为已经失去响应。常用属性:style  设置进度条的样式visible 是否显示进度条1、圆形进度条一个圆形进度条,不断旋转。1常用样式:Widget.ProgressBar.Small/Large/Inverse。没有Medium,效果上来看,Inverse相当于Medium。也..._android 获取progressminmax

I3D模型_2017_CVPR-程序员宅基地

作者的观点:若在足够大的视频动作识别数据集上训练(Kinetics),是否能提升模型在其他数据集(HMDB-51,UCF-101)上的表现呢?论文核心内容:对于不同模型,这种方法(见观点)提升性能程度相差很大,于是提出 Two-Stream Inflated 3D ConvNet ( I3D ) 模型 实验分析,现有最好的动作识别方法在数据集Kinetics上的表现,其次是在对..._i3d模型

HackTheBox - ScriptKiddie(CVE-2020-7384)_z4yn:)的博客-程序员宅基地

ScriptKiddie#0 信息收集Namp 扫描端口,根据端口开放情况切入点应该在5000端口上。─[sg-vip-1]─[10.10.14.19]─[htb-z4yn@htb-2t3aamavbq]─[~]└──╼ [★]$ nmap 10.10.10.226 -p-Starting Nmap 7.80 ( https://nmap.org ) at 2021-04-20 02:13 UTCNmap scan report for 10.10.10.226Host is up.._cve-2020-7384

计算机组成原理——计算机运算部分_、y从-程序员宅基地

存储容量与地址总线之间的关系1kb=210b 需要10根地址总线1Mb=210kb = 210*210b =220b需要20根地址总线1GB=210Mb=210*210*210b=230b 需要30根地址总线2GB=2 *230b=231b需要31根地址总线计算机系统性能评价1.非时间指标:机器字长:指机器一次能处理的二进制位数。总线宽度:数据总线一次能并行传送的最大信息位数。(..._、y从