在考虑PCI地址映射问题时,需要理清两个概念:主机端虚拟地址和DSP端物理地址。
    主机端虚拟地址是指在主机端进行任何操作时,编程人员提供给系统的地址,这个地址必须在系统的整个编址空间内,且如果是对某个设备进行操作,那么这个地址还必须在系统为这个设备分配的特定的一块(或不连续的几块)编址空间里。这个地址一般由一个基地址和编程人员提供的偏移地址组合而成。
    DSP端物理地址是指,在DSP端进行任何操作时,编程人员提供给DSP的地址,这个地址必须在DSP的整个编址空间内,且如果DSP所统辖的物理资源没有占用编址空间内的所有地址(一般没有任何系统),那么这个地址就必须在为具体物理设备分配的编址空间里。这个地址在主机端一般由DSPP寄存器的值作为基址,与编程人员提供的偏移地址组合而成。
    明白这两个概念后,让我们来看看具体到DM642的PCI接口的地址映射,都有哪些需要注意的事情。
一、配置空间
    配置空间的一部分寄存器的内容,是在DM642被主机识别时,从EEPROM里读出信息来进行赋值的,这些值包括芯片的类型、厂商信息、版本号等信息,一般是编程人员无法修改的信息。另一部分(Base0,Base1,Base2等)则是在DM642被识别时,由主机系统底层的PCI总线驱动程序进行分配的,由系统决定,也是编程人员无法修改的。PCI接口标准规定每个PCI设备最多可以有6块编制空间,DM642用了三块,这三块空间在主机端的虚拟地址的基地址,就是由PCI总线驱动程序分配给Base0、Base1、Base2三个寄存器的值。
二、虚拟地址向物理地址转换
    设备驱动程序的编程人员只需要标定Base0、Base1、Base2空间,并指定一个偏移地址就可以实现对设备分配的虚拟地址进行读写等操作。但是如果要求这个地址在DSP端可以解析成为一个自己想要的物理地址,则需要编程人员事先设定DSPP寄存器的值(对于DM642的PCI接口,只有在读写Base0空间时需要设置DSPP值,Base1和Base2空间不需要设置)。DSPP寄存器的值可以通过两种方式进行读写。第一种是通过Base1空间的0x01C1FFF8地址(Base1的物理地址的前九位是固定的0000 0001 1,只需要提供一个0x0041FFF8的偏移地址即可),第二种是通过Base2空间的0x00000008地址(Base2空间只有4个Word的空间,不足以分页,因此不需要提供DSPP)。
在Base0空间的访问过程中,DSPP寄存器和偏移地址的组合方式是:DSPP寄存器的后10位(0-9位)作为物理地址的最高10位,偏移地址的后22位(0-21位)作为物理地址的最低22位,且偏移地址的高10位必须设为0,不得越界。
三、DSP端物理地址空间的分配
    根据C64x系列DSP的文档说明,0x0000000-0x0003FFFF之间的256K地址作为片内或Cache的地址,因为DM642芯片内只有256K缓存器,因此这个空间只有256K。0x00040000-0x7FFFFFFF之间的地址保留或映射到外设寄存器(DM642的Base1空间即时从这部分空间中映射出来的),因此如果对这部分编址(除了映射给外设寄存器之外的)空间进行读写,将不可能成功。0x80000000-0x8FFFFFFF之间的地址用来映射SDRAM的存储空间。0x90000000-0x9FFFFFFF之间的地址用来映射FLASH、UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器,并行数据转串行数据)和FPGA(Field Programmable Gate Array,即现场可编程门阵列)寄存器。0xA0000000-AFFFFFFF之间的地址分配给Daughter Card(这个东西我也没用过)。0xB0000000-0xFFFFFFFF之间的地址分配给FPGA Sync Regs和Daughter Card。
    总结一下,我们在写一个PCI设备的时候,它的主机端虚拟地址并不是重要的,而且是对用户透明的,重要的是他的DSP端物理地址。因此只需要给定一个偏移地址和设定一个DSPP值,就完全可以对设备的空间进行读写了。至于读写是否成功,要看你写的地址是否对应了一个实际存在的物理设备。至此,DM642的地址映射机制讲完了,如有不当,请批评指正。

[说明]这里所指的“编程人员”,是PCI设备驱动以及驱动以上的应用程序的开发人员,不包括操作系统和PCI总线驱动程序的开发人员。

--------------
                                            §  李文凯 2008年04月08日 §
                                            §   作于WHHIT之IMLAB     §
                                            --------------

DM642的PCI驱动编程笔记:详述DM642的PCI接口的地址映射机制相关推荐

  1. 我的内核学习笔记6:PCI驱动probe的一点认知

    对于PCI的学习,在文章<初识PCI>和<再识PCI:一个PCI驱动实例>中有介绍,文中使用大量代码进行演示.但总觉得有些认知不到位.于是就再写一文. 一.PCI驱动一般框架 ...

  2. Linux设备驱动编程第三版-笔记

    第1章 设备驱动简介 1.1 驱动程序的角色 机制:提供什么能力. 策略:如何使用这些能力. 1.2. 划分内核 内核的角色可以划分:     一:进程管理 二:内存管理 三:文件系统 四:设备控制 ...

  3. linux设备驱动读书笔记

    linux设备驱动读书笔记 设备驱动简介 机制:提供什么能力 策略:如何使用这些能力 在编写驱动时, 程序员应当编写内核代码来存取硬件, 但是不能强加特别的策略给用户, 因为不同的用户有不同的需求. ...

  4. linux设备驱动读书笔记(转)

    linux设备驱动读书笔记 设备驱动简介 机制:提供什么能力 策略:如何使用这些能力 在编写驱动时, 程序员应当编写内核代码来存取硬件, 但是不能强加特别的策略给用户, 因为不同的用户有不同的需求. ...

  5. 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

    目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...

  6. 再识PCI:一个PCI驱动实例

    之前写了第一篇关于PCI的文章,当时只是作为入门的接触笔记,后来对PCI又研究了一下,主要包括PCI设备的扫描过程及PCI驱动注册过程. 本文主要给出一个PCI实例,并在内核中做很多的打印以便跟踪其过 ...

  7. 设备文件BSP及嵌入式驱动开发笔记

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! BSP及嵌入式驱动开辟笔记 第一讲嵌入式系统基本概念 以应用为中央,以计算机 ...

  8. Go语言编程笔记16:存储数据

    Go语言编程笔记16:存储数据 图源:wallpapercave.com 几乎任何程序都绕不开读写数据,只不过具体的数据存储介质和方式有所不同.本篇文章将从多种数据存储方式进行探讨各种存储方式如何实现 ...

  9. c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]

    Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...

  10. linux 设备驱动编程

    驱动 目 录 驱动 I/O端口 from smth 基本结构 驱动程序 具体实现 PCI loopback Sis 900 ISA总线DMA的实现 驱动     Linux系统支持三种类型的硬件设备: ...

最新文章

  1. 服务器温度3d显示,智能问答助手、3D可视化展示,腾讯医典“黑科技”助力科普更有温度...
  2. “半真半假”DeepFake换脸也能精准识别?阿里安全提出全新检测方法
  3. Python混淆矩阵可视化:plt.colorbar函数自定义颜色条的数值标签、配置不同情况下颜色条的数值范围以及数据类型(整型、浮点型)
  4. 订单BOM与销售BOM的区别
  5. 为什么log4j的概念模型是错的--zlog的模型简介
  6. 创建MySQL数据库中useUnicode=truecharacterEncoding=UTF-8
  7. Linux下网络流量实时监控工具大全
  8. 电脑开机动画_领克的开机画面,你修改了?
  9. Qt编写自定义控件及插件的使用
  10. generator mysql插件_mybatis Generator最佳实践(数据库:mysql)
  11. Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析
  12. ParaSwap启动Aave V2集成,允许用户在V1和V2版之间进行套利
  13. 【工具使用系列】关于 MATLAB Embedded Coder, 你需要知道的事
  14. 用Python学分析:集中与分散
  15. 为什么我电脑的所有浏览器都开不了网页
  16. download failed: assets/main/import/09/09f53264-cd95-4751-99ad-d516c164dd80._cconb.dbbin, status: 40
  17. 利用AlphaFold进行蛋白质结构预测
  18. 计算机CD_ROM表示中文,CD-ROM是指什么?
  19. PostgreSQL 源码解读(160)- 查询#80(如何实现表达式解析)
  20. Patchwork++论文阅读——基于3D点云的快速鲁棒地面分割算法

热门文章

  1. 全向轮平台的旋转中心位置计算
  2. [思维][模拟]Scholomance Academy 第45届icpc区域赛沈阳站K
  3. Closest_Pair
  4. testcenter自动化
  5. c语言中sub是什么指令,汇编 – SUB指令的目的是什么?
  6. macbook黑屏_Mac Book突然黑屏开不了机怎么办
  7. ARFoundation系列讲解 - 80 AR内容制作一
  8. 推荐阅读20100812
  9. 美国四大科技巨头:苹果、微软、Facebook、谷歌的爱恨情仇
  10. 2022最新仿绚丽彩虹音乐播放器完整源码