S3C2440之MMU驱动代码模板(RealView MDK)

发布者:Zhenxiang最新更新时间:2018-06-04 来源: eefocus关键字:S3C2440  MMU  驱动代码模板 手机看文章 扫描二维码
随时随地手机看文章

好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出自己写的S3C2440 MMU代码库。使用友善MINI2440开发板,开发环境为RealView MDK 4.22。

该源码结构简单明了,原始工程下载地址:点击打开链接


Register 0, ID code register:


  1. unsigned int MMU_ReadID(void)  

  2. {  

  3.     unsigned int id;  

  4.     __asm("mrc p15, 0, id, c0, c0, 0");  

  5.     return id;  

  6. }  


Register 0, cache type register:



  1. unsigned int MMU_ReadCacheType(void)  

  2. {  

  3.     unsigned int type;  

  4.     __asm("mrc p15, 0, type, c0, c0, 1");  

  5.     return type;  

  6. }  


Register 1, control register:



  1. void MMU_EnterFastBusMode(void)  

  2. {  

  3.     unsigned int r0;  

  4.     __asm{  

  5.         mrc p15, 0, r0, c1, c0, 0  

  6.         bic r0, r0, #(3<<30)  

  7.         mcr p15, 0, r0, c1, c0, 0  

  8.     }  

  9. }  

  10.   

  11. void MMU_EnterSyncMode(void)  

  12. {  

  13.     unsigned int r0;  

  14.     __asm{  

  15.         mrc p15, 0, r0, c1, c0, 0  

  16.         bic r0, r0, #(1<<31)  

  17.         orr r0, r0, #(1<<30)  

  18.         mcr p15, 0, r0, c1, c0, 0  

  19.     }  

  20. }  

  21.   

  22. void MMU_EnterAsyncMode(void)  

  23. {  

  24.     unsigned int r0;  

  25.     __asm{  

  26.         mrc p15, 0, r0, c1, c0, 0  

  27.         orr r0, r0, #(11<<30)  

  28.         mcr p15, 0, r0, c1, c0, 0  

  29.     }  

  30. }  

  31.   

  32.   

  33. void MMU_EnableICache(void)  

  34. {  

  35.     unsigned int r0;  

  36.     __asm{  

  37.         mrc p15, 0, r0, c1, c0, 0  

  38.         orr r0, r0, #(1<<12)  

  39.         mcr p15, 0, r0, c1, c0, 0  

  40.     }  

  41. }  

  42.   

  43.   

  44. void MMU_DisableICache(void)  

  45. {  

  46.     unsigned int r0;  

  47.     __asm{  

  48.         mrc p15, 0, r0, c1, c0, 0  

  49.         bic r0, r0, #(1<<12)  

  50.         mcr p15, 0, r0, c1, c0, 0  

  51.     }  

  52. }  

  53.   

  54.   

  55. void MMU_EnableDCache(void)  

  56. {  

  57.     unsigned int r0;  

  58.     __asm{  

  59.         mrc p15, 0, r0, c1, c0, 0  

  60.         orr r0, r0, #(1<<2)  

  61.         mcr p15, 0, r0, c1, c0, 0  

  62.     }  

  63. }  

  64.   

  65.   

  66. void MMU_DisableDCache(void)  

  67. {  

  68.     unsigned int r0;  

  69.     __asm{  

  70.         mrc p15, 0, r0, c1, c0, 0  

  71.         bic r0, r0, #(1<<2)  

  72.         mcr p15, 0, r0, c1, c0, 0  

  73.     }  

  74. }  

  75.   

  76. void MMU_EnableAlignFault(void)  

  77. {  

  78.     unsigned int r0;  

  79.     __asm{  

  80.         mrc p15, 0, r0, c1, c0, 0  

  81.         orr r0, r0, #(1<<1)  

  82.         mcr p15, 0, r0, c1, c0, 0  

  83.     }  

  84. }  

  85.   

  86.   

  87. void MMU_DisableAlignFault(void)  

  88. {  

  89.     unsigned int r0;  

  90.     __asm{  

  91.         mrc p15, 0, r0, c1, c0, 0  

  92.         bic r0, r0, #(1<<1)  

  93.         mcr p15, 0, r0, c1, c0, 0  

  94.     }  

  95. }  

  96.   

  97. void MMU_Enable(void)  

  98. {  

  99.     unsigned int r0;  

  100.     __asm{  

  101.         mrc p15, 0, r0, c1, c0, 0  

  102.         orr r0, r0, #1  

  103.         mcr p15, 0, r0, c1, c0, 0  

  104.     }  

  105. }  

  106.   

  107.   

  108. void MMU_Disable(void)  

  109. {  

  110.     unsigned int r0;  

  111.     __asm{  

  112.         mrc p15, 0, r0, c1, c0, 0  

  113.         bic r0, r0, #1  

  114.         mcr p15, 0, r0, c1, c0, 0  

  115.     }  

  116. }  


Register 2, translation table base (TTB) register:


  1. void MMU_SetTTB(void)  

  2. {  

  3.     unsigned int r0 = (unsigned int)TTB;  

  4.     __asm("mcr p15, 0, r0, c2, c0, 0");  

  5. }  


Register 3, domain access control register:


  1. void MMU_SetDomain(unsigned int domain)  

  2. {  

  3.     __asm("mcr p15, 0, domain, c3, c0, 0");  

  4. }  


Register 7, cache operations register:


  1. void MMU_InvalidICacheDCache(void)  

  2. {  

  3.     unsigned int r0 = 0;  

  4.       

  5.     __asm("mcr p15, 0, r0, c7, c7, 0");  

  6. }  

  7.   

  8. void MMU_InvalidICache(void)  

  9. {  

  10.     unsigned int r0 = 0;  

  11.       

  12.     __asm("mcr p15, 0, r0, c7, c5, 0");  

  13. }  

  14.   

  15. void MMU_InvalidICacheSingleEntry(unsigned int MVA)  

  16. {  

  17.     __asm("mcr p15, 0, MVA, c7, c5, 1");  

  18. }  

  19.   

  20. void MMU_PrefechICacheLine(unsigned int MVA)  

  21. {  

  22.     __asm("mcr p15, 0, MVA, c7, c13, 1");  

  23. }  

  24.   

  25. void MMU_InvalidDCache(void)  

  26. {  

  27.     unsigned int r0 = 0;  

  28.       

  29.     __asm("mcr p15, 0, r0, c7, c6, 0");  

  30. }  

  31.   

  32. void MMU_InvalidDCacheSingleEntry(unsigned int MVA)  

  33. {  

  34.     __asm("mcr p15, 0, MVA, c7, c6, 1");  

  35. }  

  36.   

  37. void MMU_CleanDCacheSingleEntry(unsigned int MVA)  

  38. {  

  39.     __asm("mcr p15, 0, MVA, c7, c10, 1");  

  40. }  

  41.   

  42. void MMU_CleanInvalidDCacheEntry(unsigned int MVA)  

  43. {  

  44.     __asm("mcr p15, 0, MVA, c7, c14, 1");  

  45. }  

  46.   

  47. void MMU_CleanDCacheSingleEntry2(unsigned int index)  

  48. {  

  49.     __asm("mcr p15, 0, index, c7, c10, 2");  

  50. }  

  51.   

  52. void MMU_CleanInvalidDCacheEntry2(unsigned int index)  

  53. {  

  54.     __asm("mcr p15, 0, index, c7, c14, 2");  

  55. }  

  56.   

  57. void MMU_DrainWriteBuffer(void)  

  58. {  

  59.     unsigned int r0 = 0;  

  60.       

  61.     __asm("mcr p15, 0, r0, c7, c10, 4");  

  62. }  

  63.   

  64. void MMU_WaitForInterrupt(void)  

  65. {  

  66.     unsigned int r0 = 0;  

  67.       

  68.     __asm("mcr p15, 0, r0, c7, c0, 4");  

  69. }  



Register 8, TLB operations register:


  1. void MMU_InvalidAllTLB(void)  

  2. {  

  3.     unsigned int r0 = 0;  

  4.       

  5.     __asm("mcr p15, 0, r0, c8, c7, 0");  

  6. }  

  7.   

  8. void MMU_InvalidITLB(void)  

  9. {  

  10.     unsigned int r0 = 0;  

  11.       

  12.     __asm("mcr p15, 0, r0, c8, c5, 0");  

  13. }  

  14.   

  15. void MMU_InvalidITLBSingleEntry(unsigned int MVA)  

  16. {  

  17.     __asm("mcr p15, 0, MVA, c8, c5, 1");  

  18. }  

  19.   

  20. void MMU_InvalidDTLB(void)  

  21. {  

  22.     unsigned int r0 = 0;  

  23.       

  24.     __asm("mcr p15, 0, r0, c8, c6, 0");  

  25. }  

  26.   

  27. void MMU_InvalidDTLBSingleEntry(unsigned int MVA)  

  28. {  

  29.     __asm("mcr p15, 0, MVA, c8, c6, 1");  

  30. }  


Register 9, cache lockdown register:


  1. unsigned int MMU_ReadDCacheLockdownBase(void)  

  2. {  

  3.     unsigned int r0;  

  4.       

  5.     __asm("mrc p15, 0, r0, c9, c0, 0");  

  6.     r0 >>= 26;  

  7.       

  8.     return r0;  

  9. }  

  10.   

  11. void MMU_WriteDCacheLockdownBase(unsigned int index)  

  12. {  

  13.     index <<= 26;  

  14.     __asm("mcr p15, 0, index, c9, c0, 0");  

  15. }  

  16.   

  17.   

  18. unsigned int MMU_ReadICacheLockdownBase(void)  

  19. {  

  20.     unsigned int r0;  

  21.       

  22.     __asm("mrc p15, 0, r0, c9, c0, 1");  

  23.     r0 >>= 26;  

  24.       

  25.     return r0;  

  26. }  

  27.   

  28. void MMU_WriteICacheLockdownBase(unsigned int index)  

  29. {  

  30.     index <<= 26;  

  31.     __asm("mcr p15, 0, index, c9, c0, 1");  

  32. }  


Register 13, FCSE PID register:


  1. unsigned int MMU_ReadPID(void)  

  2. {  

  3.     unsigned int pid;  

  4.       

  5.     __asm("mrc p15, 0, pid, c13, c0, 0");  

  6.       

  7.     return (pid >> 25);  

  8. }  

  9.   

  10. void MMU_WritePID(unsigned int pid)  

  11. {  

  12.     pid <<= 25;  

  13.     __asm("mcr p15, 0, pid, c13, c0, 0");  

  14. }  


设置Memory Translation Table:


  1. void MMU_SetMTT(unsigned int vStart, unsigned int vEnd, unsigned int pStart, unsigned int attr)  

  2. {  

  3.     unsigned int vaddr, paddr;  

  4.       

  5.     vaddr = vStart;  

  6.     paddr = pStart;  

  7.     while(vaddr != (vEnd + 1))  

  8.     {  

  9.         TTB[vaddr >> 20] = (paddr & 0xFFF00000) | attr;  

  10.         vaddr += 0x100000;  

  11.         paddr += 0x100000;  

  12.     }  

  13. }  


MMU初始化:


  1. void MMU_Init(void)  

  2. {  

  3.     MMU_DisableICache();  

  4.     MMU_DisableDCache();  

  5.       

  6.     MMU_SetTTB();  

  7.     MMU_SetDomain(0xFFFFFFFF);  

  8.     MMU_InvalidAllTLB();  

  9.     MMU_EnableAlignFault();  

  10.       

  11.     MMU_SetMTT(0x00000000, 0x001FFFFF, 0x00000000, RW_CB);  

  12.     MMU_SetMTT(0x30000000, 0x33FFFFFF, 0x30000000, RW_CB);  

  13.     MMU_SetMTT(0x40000000, 0x4FFFFFFF, 0x40000000, RW_NCNB);  

  14.     MMU_SetMTT(0x50000000, 0x5FFFFFFF, 0x50000000, RW_NCNB);  

  15.       

  16.     MMU_EnableICache();  

  17.     MMU_EnableDCache();  

  18.     MMU_Enable();  

  19. }  


在本代码中需要注意的是,如果直接使用S3C2440.s的话,在C代码中调用上述代码会导致Undefine异常。因为进入main()之前,启动代码已经将处理器模式设置为USER模式了,而在USER模式下是无法操作CP15处理器的,所以产生异常。如果要在C中正常调用上述嵌入汇编,则需要将启动代码S3C2440.s中处理器模式设置为USER模式的那段代码注释掉,直接以SVC模式运行,就能正常执行,如下:


  1. ;  Enter Supervisor Mode and set its Stack Pointer  

  2.                 MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit  

  3.                 MOV     SP, R0  

  4.                 SUB     R0, R0, #SVC_Stack_Size  

  5.   

  6. ;  Enter User Mode and set its Stack Pointer  

  7. ;                MSR     CPSR_c, #Mode_USR  

  8. ;                MOV     SP, R0  

  9. ;                SUB     SL, SP, #USR_Stack_Size  

  10.   

  11. ;  Enter User Mode and set its Stack Pointer  

  12. ;                MSR     CPSR_c, #Mode_USR  

  13. ;                IF      :DEF:__MICROLIB  

  14.   

  15. ;                EXPORT __initial_sp  

  16.   

  17. ;                ELSE  

  18.   

  19. ;                MOV     SP, R0  

  20. ;                SUB     SL, SP, #USR_Stack_Size  

  21.   

  22. ;                ENDIF  


或者不修改处理器模式,而直接将以下汇编插入到S3C2440.s中Clock设置代码的后面,一样能运行:


  1. mrc p15, 0, r0, c1, c0, 0   

  2. orr r0, r0, #0xc0000000   

  3. mcr p15, 0, r0, c1, c0, 0   



关键字:S3C2440  MMU  驱动代码模板 引用地址:S3C2440之MMU驱动代码模板(RealView MDK)

上一篇:S3C2440之UART驱动代码模板(RealView MDK)
下一篇:S3C2440之LCD驱动代码模板(RealView MDK)

推荐阅读最新更新时间:2024-03-16 16:04

05-S3C2440学习之内核(移植)linux3.4.2移植(1) 简单移植+修改MTD分区+制作jffs2文件系统
一、框架介绍及简单修改 1.1 Bootloader如何引导内核 Bootloader的工作: (1)讲内核读入内存中 (2)存一些内核启动参数到指定位置,内核启动时去解析 (3)启动内核,传入机器ID 1.2、内核的启动流程: 首先 内核的最终目的是挂接根文件系统,并启动应用程序。 想启动应用程序—需要挂接根文件系统—装载驱动程序(flash、网卡)--要解析参数(文件系统在哪)--根据R1判断内核是否支持该ID—支持调用初始化相关函数 每个开发板都有不同的硬件参数 内核移植过程中要决定我这个内核支持哪些硬件开发板 我在内核里针对这个开发板给他一个ID。Uboot启动的时候传入和内核中设置好的匹配
[单片机]
05-S3C2440学习之内核(移植)linux3.4.2移植(1) 简单移植+修改MTD分区+制作jffs2文件系统
S3C2440之ADC
S3C2440包含一个8通道A/D转换器,有10位分辨率下面简要介绍一下S3C2440中ADC的用法: 用到的寄存器: ADCCON:ADC控制寄存器 ADCDAT0:ADC转换数据寄存器 SUBSRCPND:次级源挂起寄存器 INTSUBMSK:中断次级屏蔽寄存器 SRCPND:源挂起寄存器 INTPND:中断挂起寄存器 INTMSK:中断屏蔽寄存器 ADCCON:AD控制寄存器 ADCDAT0:AD转换数据寄存器 1,首先设置控制寄存器ADCCON的相应位来选择频率和通道: view plain copy rADCCON = (1 14)|(preScale
[单片机]
<font color='red'>S3C2440</font>之ADC
S3C2440裸机实验(4) -----IIC
花了两天的时间终于把这个搞定了,其实I2C的原理还是比较简单的,只是几个细节性的东西还是需要特别的注意,主要是需要注意一下几点: 1.rIICCON &= ~0x10; 清中断必须要在rIICDS = slvAddr; 和rIICSTAT = 0xf0; // 主设备,启动 之后 2.延时对于写外部的低速设备来说非常重要,比如while(flag)之后一定要加延时,还有在写数据时发现只能写入基数地址的数据,这也是由于延时导致的 3.开始调试的时候系统总是死在read的函数中,后来发现在数据手册的note中说当读取最后一个数据的时候一定不能返回ACK信号,而我却在程序中使用while(flag)来等待ACK引发中断,这不
[单片机]
S3c2440ARM异常与中断体系详解5---_swi异常模示程序示例
这节我们再来演示swi的处理流程 swi软件中断: software interrupt 在前面的视频中我们讲过ARMCPU有7中模式(下图为7种模式),除了用户模式以外,其他6种都是特权模式,这些特权模式可以直接修改CPSR进入其他模式 usr用户模式不能修改CPSR进入其他模式 Linux应用程序一般运行于用户模式 APP运行于usermode,(受限模式,不可访问硬件) APP想访问硬件,必须切换模式,怎么切换? 通过发生异常中断进入特权模式 发生异常3种模式 1、中断是一种异常 2、und也是 3、 swi + 某个值(使用软中断切换模式) 由上图可知道,当进入reset时,进入的svc模式
[单片机]
S3c2440ARM异常与中断体系详解5---_swi异常模示程序示例
基于Linux NFS的Web数码相框设计
   O 引言   随着数码相机和互联网的普及,越来越多的家庭拥有自己的媒体库。媒体库中既包含有自己拍摄的影像文件,也有从网络上下载的影像资料。然而展示影像资料的手段单一,主要通过PC来实现。因此未来构建以媒体库为中心的家庭多媒体网络,把多媒体资料在各式各样的家庭网络媒体终端上展示出来,将成为一种必然的趋势。媒体终端包括Web数码相框、网络数字电视等。   Web数码相框的提出正是为了设计一种家庭嵌入式网络媒体终端,但目前市场上常见的数码相框的网络可扩展性差,本设计方案的提出正是为了能够弥补这方面的不足,提高网络可扩展性。并在本设计方案的基础上构建网络数字电视等其他多功能终端实体。    1 技术方案   Web数
[嵌入式]
S3C2440 开发板实战(6):网络配置 + 设置NFS
这篇的主要目的是将PC端(server)和开发板端(client)之间共享文件。 事先声明:本人的PC端是直接安装Ubuntu系统的,所以在操作的时候没有虚拟机这个概念。 linux版本:2.6.22.6 ---------------------------------------------------------------------------------------------------------------------------------- 一、硬件连接 唯一要求:client的网线应该连接上server或者是给server提供服务的router。 比如说我的硬件配置:开发板连接网线至P
[单片机]
S3C2440 nfs 的使用
Linux主机需要先安装并开启 NFS 服务, NFS 服务的安装配置启动参考http://blog.csdn.net/u011641885/article/details/47696143 中 的安装 nfs服务。 使用 uboot 上的 nfs 命令替代 tftp 下载 根文件系统 nfs 30000000 192.168.1.106:/work/nfs_root/tmp/fs.yaffs2 后面的操作步骤与 tftp 下载文件系统一样,擦除 Nand Flash, 写入 Nand Flash。 还有一种用法,就是将 nfs 当类似 U盘之类的存储设备用(开发板进入根文件系统后,手动挂载 nfs)。命令如下:
[单片机]
S3C2440输入/输出端口
端口控制描述(详细见S3C2440的数据手册) 端口配置寄存器(GPACON至GPJCON) 端口数据寄存器(GPADAT至GPJDAT) 端口上拉寄存器(GPBUP至GPJUP) 杂项控制寄存器 外部中断控制寄存器 用一个实例(LED流水灯)来学习下输入/输出端口 (在TQ2440开发板中 是用GPB5~8控制LED1~4) #include 2440addr.h #define LED1_ON (rGPBDAT &=~(1 5)) #define LED1_OFF (rGPBDAT |=(1 5) ) #define LED2_ON (rGPBDAT &=~(1 6))
[单片机]
<font color='red'>S3C2440</font>输入/输出端口
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved