修改Tiny4412 uboot关闭MMU
来源:互联网 发布:自制app软件 编辑:程序博客网 时间:2024/06/05 21:57
材料: uboot_tiny4412-20130729.tgz dnw-linux.tar.gz
目的:使用dnw下载运行裸机程序。
原因:裸机开发中操作的都是物理地址,开启MMU之后,地址被映射,无法准确操作寄存器,所以需要关闭uboot中的mmu。
操作步骤:
1.修改uboot源码目录中:include/configs/tiny4412.h文件
修改第339行:
‘#define CONFIG_ENABLE_MMU’
为:
‘#undef CONFIG_ENABLE_MMU’
2.修改uboot源码目录中:board/samsung/tiny4412/config.mk文件
修改:
‘CONFIG_SYS_TEXT_BASE = 0xc3e00000’
为:
‘CONFIG_SYS_TEXT_BASE = 0x43e00000’
备注: Tiny4412开发板内存地址分布中0x40000000 – 0x8000000为内存地址,总共为1G。为什么这样分布及其它地址为什么东西,还有待查证!
修改重新编译后,打开System.map文件可以发现,里面的函数地址变为0x4开头的了,表示修改成功。
最后,我们使用烧写一个例子,验证printf函数能不能使用。
程序内容如下:
/* * 李柏章 Li Baizhang, makelinux@gmail.com, 2013-08, */#include "regs.h"void (*printf)(char *, ...) = 0x43e11434;int test(void){ unsigned long value = 0; __asm__ __volatile__ ( "mrs %0, cpsr\n" : "=&r" (value) ); printf(" value = 0x%x\n", value); return 0;}
0x43e11434为System.map里面printf的前面的地址,读者最好确认一下,可能需要修改!
Makefile内容如下:
default: arm-linux-gcc -c test.c -o test.o arm-linux-ld -Ttext=0x70003000 test.o -o test arm-linux-objcopy -O binary test test.binclean: rm -f test.o test test.bin *~
重要的是这个链接地址:0x70003000,dnw下载程序的时候,下载到地址就是0x70003000。链接地址的作用就是指明程序的储存地址,也就是让程序存放在0x70003000地方。(自己总结的!待深入了解。。)
编译完成后,就要使用dnw下载程序了,dnw驱动的安装,下载步骤不再详细说明,遇到问题,再多查查网络。
大概步骤如下:
1.开发板端进入uboot输入:dnw 70003000
开发板会等待连接。
2.此时主机会检测到usb设备,dnw Windows驱动win10一直装不上(尝试过很多资源,未成功!),所以只能使用Linux端的dnw。
安装驱动:insmod secbulk.ko
然后,dnw test.bin
连接成功并传输完成后,开发板会有反应,可能会出现校验和错误,但我发现程序还是可以成功运行,先不管。
3.传输完成后,输入go 70003000
跳转到这个地址去,就会执行程序,结果好像是打印cpu id吧!想要详细了解,需要查看arm处理器手册,里面有讲各个寄存器存储什么样的值,以及读取方式,指令等。
至此,实验完成。
reg.h
/* * 李柏章 Li Baizhang, makelinux@gmail.com, 2013-08, */#pragma once#define gpiobase 0x11000000#define GPM4CON (*(volatile unsigned long *)(gpiobase + 0x02E0)) #define GPM4DAT (*(volatile unsigned long *)(gpiobase + 0x02E4))#define GPX3CON (*(volatile unsigned long *)(gpiobase + 0x0C60))#define GPX4DAT (*(volatile unsigned long *)(gpiobase + 0x0C64))#define EXT_INT43CON (*(volatile unsigned long *)(gpiobase + 0x0e0c))#define EXT_INT43_MASK (*(volatile unsigned long *)(gpiobase + 0x0f0c))#define EXT_INT43_PEND (*(volatile unsigned long *)(gpiobase + 0x0f4c))#define gicbase 0x10480000#define ICCICR_CPU0 (*(volatile unsigned long *)(gicbase + 0x0))#define ICCPMR_CPU0 (*(volatile unsigned long *)(gicbase + 0x4))#define ICCBPR_CPU0 (*(volatile unsigned long *)(gicbase + 0x8))#define ICCIAR_CPU0 (*(volatile unsigned long *)(gicbase + 0xc))#define ICCEOIR_CPU0 (*(volatile unsigned long *)(gicbase + 0x10))#define ICCRPR_CPU0 (*(volatile unsigned long *)(gicbase + 0x14))#define ICCHPIR_CPU0 (*(volatile unsigned long *)(gicbase + 0x18))#define ICCABPR_CPU0 (*(volatile unsigned long *)(gicbase + 0x1c))#define INTEG_EN_C_CPU0 (*(volatile unsigned long *)(gicbase + 0x40))#define INTERRUPT_OUT_CPU0 (*(volatile unsigned long *)(gicbase + 0x44))#define ICCIIDR (*(volatile unsigned long *)(gicbase + 0xfc))#define icdbase 0x10490000#define ICDDCR (*(volatile unsigned long *)(icdbase + 0x0))#define ICDICTR (*(volatile unsigned long *)(icdbase + 0x4))#define ICDIIDR (*(volatile unsigned long *)(icdbase + 0x8))#define ICDISR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0080))#define ICDISR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0084))#define ICDISR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0088))#define ICDISR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x008C))#define ICDISR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0090))#define ICDISER0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0100))#define ICDISER1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0104))#define ICDISER2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0108))#define ICDISER3_CPU0 (*(volatile unsigned long *)(icdbase + 0x010C))#define ICDISER4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0110))#define ICDICER0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0180))#define ICDICER1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0184))#define ICDICER2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0188))#define ICDICER3_CPU0 (*(volatile unsigned long *)(icdbase + 0x018C))#define ICDICER4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0190))#define ICDISPR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0200))#define ICDISPR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0204))#define ICDISPR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0208))#define ICDISPR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x020C))#define ICDISPR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0210))#define ICDICPR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0280))#define ICDICPR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0284))#define ICDICPR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0288))#define ICDICPR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x028C))#define ICDICPR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0290))#define ICDABR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0300))#define ICDABR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0304))#define ICDABR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0308))#define ICDABR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x030C))#define ICDABR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0310))#define ICDIPR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0400)) #define ICDIPR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0404)) #define ICDIPR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0408)) #define ICDIPR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x040C)) #define ICDIPR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0410)) #define ICDIPR5_CPU0 (*(volatile unsigned long *)(icdbase + 0x0414)) #define ICDIPR6_CPU0 (*(volatile unsigned long *)(icdbase + 0x0418)) #define ICDIPR7_CPU0 (*(volatile unsigned long *)(icdbase + 0x041C)) #define ICDIPR8_CPU0 (*(volatile unsigned long *)(icdbase + 0x0420)) #define ICDIPR9_CPU0 (*(volatile unsigned long *)(icdbase + 0x0424)) #define ICDIPR10_CPU0 (*(volatile unsigned long *)(icdbase + 0x0428))#define ICDIPR11_CPU0 (*(volatile unsigned long *)(icdbase + 0x042C))#define ICDIPR12_CPU0 (*(volatile unsigned long *)(icdbase + 0x0430))#define ICDIPR13_CPU0 (*(volatile unsigned long *)(icdbase + 0x0434))#define ICDIPR14_CPU0 (*(volatile unsigned long *)(icdbase + 0x0438))#define ICDIPR15_CPU0 (*(volatile unsigned long *)(icdbase + 0x043C))#define ICDIPR16_CPU0 (*(volatile unsigned long *)(icdbase + 0x0440))#define ICDIPR17_CPU0 (*(volatile unsigned long *)(icdbase + 0x0444))#define ICDIPR18_CPU0 (*(volatile unsigned long *)(icdbase + 0x0448))#define ICDIPR19_CPU0 (*(volatile unsigned long *)(icdbase + 0x044C))#define ICDIPR20_CPU0 (*(volatile unsigned long *)(icdbase + 0x0450))#define ICDIPR21_CPU0 (*(volatile unsigned long *)(icdbase + 0x0454))#define ICDIPR22_CPU0 (*(volatile unsigned long *)(icdbase + 0x0458))#define ICDIPR23_CPU0 (*(volatile unsigned long *)(icdbase + 0x045C))#define ICDIPR24_CPU0 (*(volatile unsigned long *)(icdbase + 0x0460))#define ICDIPR25_CPU0 (*(volatile unsigned long *)(icdbase + 0x0464))#define ICDIPR26_CPU0 (*(volatile unsigned long *)(icdbase + 0x0468))#define ICDIPR27_CPU0 (*(volatile unsigned long *)(icdbase + 0x046C))#define ICDIPR28_CPU0 (*(volatile unsigned long *)(icdbase + 0x0470))#define ICDIPR29_CPU0 (*(volatile unsigned long *)(icdbase + 0x0474))#define ICDIPR30_CPU0 (*(volatile unsigned long *)(icdbase + 0x0478))#define ICDIPR31_CPU0 (*(volatile unsigned long *)(icdbase + 0x047C))#define ICDIPR32_CPU0 (*(volatile unsigned long *)(icdbase + 0x0480))#define ICDIPR33_CPU0 (*(volatile unsigned long *)(icdbase + 0x0484))#define ICDIPR34_CPU0 (*(volatile unsigned long *)(icdbase + 0x0488))#define ICDIPR35_CPU0 (*(volatile unsigned long *)(icdbase + 0x048C))#define ICDIPR36_CPU0 (*(volatile unsigned long *)(icdbase + 0x0490))#define ICDIPR37_CPU0 (*(volatile unsigned long *)(icdbase + 0x0494))#define ICDIPR38_CPU0 (*(volatile unsigned long *)(icdbase + 0x0498))#define ICDIPR39_CPU0 (*(volatile unsigned long *)(icdbase + 0x049C))#define ICDIPTR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0800))#define ICDIPTR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0804))#define ICDIPTR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0808))#define ICDIPTR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x080C))#define ICDIPTR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0810))#define ICDIPTR5_CPU0 (*(volatile unsigned long *)(icdbase + 0x0814))#define ICDIPTR6_CPU0 (*(volatile unsigned long *)(icdbase + 0x0818))#define ICDIPTR7_CPU0 (*(volatile unsigned long *)(icdbase + 0x081C))#define ICDIPTR8_CPU0 (*(volatile unsigned long *)(icdbase + 0x0820))#define ICDIPTR9_CPU0 (*(volatile unsigned long *)(icdbase + 0x0824))#define ICDIPTR10_CPU0 (*(volatile unsigned long *)(icdbase + 0x0828))#define ICDIPTR11_CPU0 (*(volatile unsigned long *)(icdbase + 0x082C))#define ICDIPTR12_CPU0 (*(volatile unsigned long *)(icdbase + 0x0830))#define ICDIPTR13_CPU0 (*(volatile unsigned long *)(icdbase + 0x0834))#define ICDIPTR14_CPU0 (*(volatile unsigned long *)(icdbase + 0x0838))#define ICDIPTR15_CPU0 (*(volatile unsigned long *)(icdbase + 0x083C))#define ICDIPTR16_CPU0 (*(volatile unsigned long *)(icdbase + 0x0840))#define ICDIPTR17_CPU0 (*(volatile unsigned long *)(icdbase + 0x0844))#define ICDIPTR18_CPU0 (*(volatile unsigned long *)(icdbase + 0x0848))#define ICDIPTR19_CPU0 (*(volatile unsigned long *)(icdbase + 0x084C))#define ICDIPTR20_CPU0 (*(volatile unsigned long *)(icdbase + 0x0850))#define ICDIPTR21_CPU0 (*(volatile unsigned long *)(icdbase + 0x0854))#define ICDIPTR22_CPU0 (*(volatile unsigned long *)(icdbase + 0x0858))#define ICDIPTR23_CPU0 (*(volatile unsigned long *)(icdbase + 0x085C))#define ICDIPTR24_CPU0 (*(volatile unsigned long *)(icdbase + 0x0860))#define ICDIPTR25_CPU0 (*(volatile unsigned long *)(icdbase + 0x0864))#define ICDIPTR26_CPU0 (*(volatile unsigned long *)(icdbase + 0x0868))#define ICDIPTR27_CPU0 (*(volatile unsigned long *)(icdbase + 0x086C))#define ICDIPTR28_CPU0 (*(volatile unsigned long *)(icdbase + 0x0870))#define ICDIPTR29_CPU0 (*(volatile unsigned long *)(icdbase + 0x0874))#define ICDIPTR30_CPU0 (*(volatile unsigned long *)(icdbase + 0x0878))#define ICDIPTR31_CPU0 (*(volatile unsigned long *)(icdbase + 0x087C))#define ICDIPTR32_CPU0 (*(volatile unsigned long *)(icdbase + 0x0880))#define ICDIPTR33_CPU0 (*(volatile unsigned long *)(icdbase + 0x0884))#define ICDIPTR34_CPU0 (*(volatile unsigned long *)(icdbase + 0x0888))#define ICDIPTR35_CPU0 (*(volatile unsigned long *)(icdbase + 0x088C))#define ICDIPTR36_CPU0 (*(volatile unsigned long *)(icdbase + 0x0890))#define ICDIPTR37_CPU0 (*(volatile unsigned long *)(icdbase + 0x0894))#define ICDIPTR38_CPU0 (*(volatile unsigned long *)(icdbase + 0x0898))#define ICDIPTR39_CPU0 (*(volatile unsigned long *)(icdbase + 0x089C))#define ICDICFR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C00))#define ICDICFR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C04))#define ICDICFR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C08))#define ICDICFR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C0C))#define ICDICFR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C10))#define ICDICFR5_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C14))#define ICDICFR6_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C18))#define ICDICFR7_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C1C))#define ICDICFR8_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C20))#define ICDICFR9_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C24))#define PPI_STATUS_CPU0 (*(volatile unsigned long *)(icdbase + 0x0D00))#define SPI_STATUS0 (*(volatile unsigned long *)(icdbase + 0x0D04))#define SPI_STATUS1 (*(volatile unsigned long *)(icdbase + 0x0D08))#define SPI_STATUS2 (*(volatile unsigned long *)(icdbase + 0x0D0C))#define SPI_STATUS3 (*(volatile unsigned long *)(icdbase + 0x0D10))#define ICDSGIR (*(volatile unsigned long *)(icdbase + 0x0f00))#define wdtbase 0x10060000#define WTCON (*(volatile unsigned long *)(wdtbase + 0x0000)) #define WTDAT (*(volatile unsigned long *)(wdtbase + 0x0004)) #define WTCNT (*(volatile unsigned long *)(wdtbase + 0x0008)) #define WTCLRINT (*(volatile unsigned long *)(wdtbase + 0x000C)) #define pwmbase 0x139D0000#define TCFG0 (*(volatile unsigned long *)(pwmbase + 0x0000)) #define TCFG1 (*(volatile unsigned long *)(pwmbase + 0x0004)) #define TCON (*(volatile unsigned long *)(pwmbase + 0x0008)) #define TCNTB0 (*(volatile unsigned long *)(pwmbase + 0x000C)) #define TCMPB0 (*(volatile unsigned long *)(pwmbase + 0x0010)) #define TCNTO0 (*(volatile unsigned long *)(pwmbase + 0x0014)) #define TCNTB1 (*(volatile unsigned long *)(pwmbase + 0x0018)) #define TCMPB1 (*(volatile unsigned long *)(pwmbase + 0x001C)) #define TCNTO1 (*(volatile unsigned long *)(pwmbase + 0x0020)) #define TCNTB2 (*(volatile unsigned long *)(pwmbase + 0x0024)) #define TCMPB2 (*(volatile unsigned long *)(pwmbase + 0x0028)) #define TCNTO2 (*(volatile unsigned long *)(pwmbase + 0x002C)) #define TCNTB3 (*(volatile unsigned long *)(pwmbase + 0x0030)) #define TCMPB3 (*(volatile unsigned long *)(pwmbase + 0x0034)) #define TCNTO3 (*(volatile unsigned long *)(pwmbase + 0x0038)) #define TCNTB4 (*(volatile unsigned long *)(pwmbase + 0x003C)) #define TCNTO4 (*(volatile unsigned long *)(pwmbase + 0x0040)) #define TINT_CSTAT (*(volatile unsigned long *)(pwmbase + 0x0044))
learning from libaizhang
- 修改Tiny4412 uboot关闭MMU
- Tiny4412 uboot
- Tiny4412学习之--MMU
- 第六章——uboot for tiny4412中MMU虚拟地址设置
- 关闭uboot的MMU 会导致S5pv210 android 不稳定?!
- (6)uboot详解——关闭缓存和mmu
- 嵌入式学习-uboot-lesson4.4-关闭MMU和cache
- uboot详解——关闭缓存和mmu
- 【Tiny4412--2】Uboot移植
- tiny4412 uboot 裸机环境搭建
- tiny4412 uboot分析(1)
- tiny4412 uboot分析(2)
- tiny4412 uboot分析 (3)
- OK6410的uboot关闭mmu和cache---嵌入式回归第九篇
- 二十七.关闭MMU
- 关闭mmu和cache
- 三星 6410 uboot 关掉MMU
- 关闭中断和关闭MMU
- ubuntu安装nginx依赖库zlib,pcre,openssl
- 【剑指offer】从尾到头翻转打印单链表
- JAVA入门开发环境搭配
- Android_LaunchMode
- 邮票问题
- 修改Tiny4412 uboot关闭MMU
- NGUI和UGUI优缺点和性能比较
- 挪用公款罪立案标准
- 设计模式之命令模式
- 终于来了:360 N5发布安卓7.0测试版升级包下载
- linux基础入门之man帮助
- 严重: Developer Notification (set struts.devMode to false to disable this message): Unexpected Excepti
- 【框架整合】四、整合redis
- 【Tomcat9源码分析】请求过程概述