mmu裸机程序
硬件平台:JZ2440
init.c --> 初始化sdram,创建页表
leds.c --> 使用init.c初始化的VA地址控制led
start.s --> 上电初始化汇编程序
start.s 源码:
.text
.global _start
_start:
ldr sp,=
bl disable_watch_dog
bl enable_sdram
bl copy_2th_to_sdram
bl creat_page_table
bl enable_mmu
ldr sp,=0xb4000000
ldr pc,=0xb0004000
loop1:
b loop1
init.c 源码:
void disable_watch_dog(void)
{
(*(unsigned long *)0x53000000)=;
} void enable_sdram(void)
{
unsigned long sdram_conf[]={0x22011110,0x00000700,0x00000700,0x00000700,0x00000700,0x00000700,0x00000700,0x00018005,0x00018005,0x008c07a3,0x000000b1,0x00000030,0x00000030};
unsigned long* sdram_register=(unsigned long *)0x48000000;
int i=;
for(i=;i<;i++) sdram_register[i]=sdram_conf[i];
} void copy_2th_to_sdram(void)
{
unsigned int *sour=(unsigned int *);
unsigned int *dest=(unsigned int *)0x30004000;
while(sour<(unsigned int *))
{ *dest=*sour;
sour++;
dest++;
}
} void creat_page_table(void)
{
#define SET_AP (3<<10)
#define SET_DOMINE (0<<5)
#define SET_4 (1<<4)
#define SET_C (1<<3)
#define SET_B (1<<2)
#define SET_0 (2) #define mmu_cache (SET_AP|SET_DOMINE|SET_4|SET_C|SET_B|SET_0)
#define mmu (SET_AP|SET_DOMINE|SET_4|SET_0) unsigned long vir_ad=,phy_ad=;
unsigned long *mmu_base_ad=(unsigned long *)0x30000000; /*steppingstone*/
vir_ad=;
phy_ad=;
*(mmu_base_ad+(vir_ad>>))=(phy_ad & 0xfff00000)|mmu_cache; /*gpio*/
vir_ad=0xa0000000;
phy_ad=0x56000000;
*(mmu_base_ad +( vir_ad>>))=(phy_ad & 0xfff00000)|mmu; /*sdram*/
vir_ad=0xb0000000;
phy_ad=0x30000000;
while(vir_ad<0xb4000000)
{
*(mmu_base_ad +(vir_ad>>))=(phy_ad&0xfff00000)|mmu_cache;
vir_ad+=0x100000;
phy_ad+=0x100000;
}
} void enable_mmu(void)
{
unsigned long ttb=0x30000000;
__asm__
(
"mov r0,#0\n" /**/
"mcr p15,0,r0,c7,c7,0\n" /*使无效icache dcache*/
"mcr p15,0,r0,c7,c10,4\n" /*清空*/
"mcr p15,0,r0,c8,c7,0\n" /*使无效itlb dtlb*/
"mov r4,%0\n" /*页表基地址*/
"mcr p15,0,r4,c2,c0,0\n" /**/
"mvn r0,#0\n" /**/
"mcr p15,0,r0,c3,c0,0\n" /*域访问控制器为可读写*/
"mrc p15,0,r0,c1,c0,0\n" /*读控制器的值*/
"bic r0,r0,#0x3000\n" /*先清除 再是能*/
"bic r0,r0,#0x0300\n" /**/
"bic r0,r0,#0x0087\n" /**/
"orr r0,r0,#0x0002\n" /*使能对齐检查*/
"orr r0,r0,#0x0004\n" /*是能cache_buff*/
"orr r0,r0,#0x1000\n" /*使能icache*/
"orr r0,r0,#0x0001\n" /*使能mmu*/
"mcr p15,0,r0,c1,c0,0\n"
: /**/
:"r"(ttb) /**/
);
}
leds.c 源码:
#define GPFCON (*(unsigned long *)0x56000050)
#define GPFDAT (*(unsigned long *)0x56000054)
#define LED1_ON (1<<8)
#define LED2_ON (1<<10)
#define LED3_ON (1<<12) static inline delay(unsigned long num)
{
while(--num);
} int main(void)
{
GPFCON=LED1_ON|LED2_ON|LED3_ON;
while()
{
GPFDAT=~(<<);
delay();
GPFDAT=~(<<);
delay();
GPFDAT=~(<<);
delay();
} return ;
}
链接脚本 mmu.lds :
SECTIONS
{
first 0x00000000 :{start.o init.o}
seconed 0xb0004000:AT(){leds.o}
}
编译的Makefile:
objs:=start.o init.o leds.o mmu.bin:$(objs)
arm-linux-ld -Tmmu.lds -o mmu_elf $^
arm-linux-objcopy -O binary -S mmu_elf $@
arm-linux-objdump -D -m arm mmu_elf > mmu.dis %.o:%.c
arm-linux-gcc -Wall -O2 -o $@ -c $< %.o:%.s
arm-linux-gcc -Wall -O2 -o $@ -c $< clean:
rm -f *.bin *.o *.dis mmu_elf
mmu裸机程序的更多相关文章
- 基于KEIL4开发ARM9(S3C2440)的裸机程序
本文主要介绍如何使用Keil4开发ARM9(S3C2440)裸机程序. 说明: 一.平台: 操作系统:Windows XP系统 KEIL版本:4.73 开发板:ARM9(S3C2440) 二.建立工程 ...
- ubuntu15.10跑裸机程序跑.bin文件
1:安装tftp:#apt-get update#apt-get install tftp-hpa tftpd-hpa xinetd2:#cd /srv#mkdir tftp#chmod 777 tf ...
- EB-SAM9G45裸机程序下载方法
开发板:EB-SAM9G45 这里提供一种裸程序下载的方法. 在官方提供的下载方法中有手动下载和自动下载,它们都离不开SAM-BA软件,而该软件使用比较麻烦,而且操作不当很容易导致电脑蓝屏,还有一个很 ...
- s3c2440 lcd 显示图片裸机程序
因为前面的裸机程序非常的简单,就不写博了. 程序的流程: 1,初始化C SP 2,关看门狗 3,初始化SDRAM 4,读出 NAND FLASH 中的 包含图片的程式放到SDRAM里面 5,跳转到SD ...
- ARM入门实践(一)----Mini6410上最简单的LED点灯裸机程序
Mini6410上最简单的LED点灯裸机程序 : 实验环境: 根据友善教程,要用ADS,据说现在都不用这个了,但是为了打开友善给的mcp工程,就下了一个,Win7下弄上兼容模式和管理员权限,再下一个S ...
- JZ2440学习笔记之第一个裸机程序(Keil-MDK)
CPU:S3C2440, ARM920T, Internal 4KB RAM, Support boot from NAND flash, 128MB for each bank. JZ2440:Me ...
- freeRTOS与裸机程序相比有什么区别??
FreeRTOS命名及变量规则 初学FreeRTOS的用户对其变量和函数的命名比较迷惑, FreeRTOS的核心源代码遵从MISRA编码标准指南,关于MISRA编码标准,可以查看文章https: ...
- MDK972-EK开发板裸调试设置和裸机程序烧写(转)
硬件平台:MDK972-EK开发板编译调试软件:KEIL uVision4仿真工具:JLINK V7/V8 本例子从串口输出信息,如图: KEIL uVision4调试设置如图所示: ...
- JZ2440学习笔记之通过J-Link单步裸机程序(Keil+J-Link)
我们还是使用JZ2440学习笔记之第一个裸机程序(Keil-MDK)里面的程序,但是把延时拿掉,要不然单步的时候一直在delay里面: int main(void) { // Set GPF4/5/6 ...
随机推荐
- nginx下wordpress 固定链接问题
情况是这样的, 我的wordpress并不是放在网站的根目录的,而是放在/blog目录下的,然后在wordpress中设置固定链接的时候,每次都出错,用了网上几个方法都不行,后来在http://cod ...
- 【转】ELK到底是什么鬼?辣么多公司用!
Sina.饿了么.携程.华为.美团.freewheel.畅捷通 .新浪微博.大讲台.魅族.IBM...... 这些公司都在使用ELK!ELK!ELK! ELK竟然重复了三遍,是个什么鬼? 一. ...
- python安装模块
pychram安装模块,非常简单!
- tronado学习
请求处理程序和请求参数: 原创首发:http://www.cnblogs.com/zxlovenet/p/4128644.html 程序将URL映射到tornado.web.RequestHandle ...
- Spark学习笔记——RDD编程
1.RDD——弹性分布式数据集(Resilient Distributed Dataset) RDD是一个分布式的元素集合,在Spark中,对数据的操作就是创建RDD.转换已有的RDD和调用RDD操作 ...
- 斯特林公式 ——Stirling公式(取N阶乘近似值)(转)
斯特灵公式是一条用来取n阶乘近似值的数学公式.一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用.从图中可以看出,即使在n很小的时候,斯特灵公式的取值已经十分准确. 公式为: ...
- Service 中的 onStart 和 onStartCommand
在自定义的service中,写了onStart和onStartCommand, public class HttpWebService extends Service { @Override publ ...
- JSESSIONID、SESSION、cookie .
所谓session可以这样理解:当与服务端进行会话时,比如说登陆成功后,服务端会为用户开壁一块内存区间,用以存放用户这次会话的一些内容,比如说用户名之类的.那么就需要一个东西来标志这个内存区间是你的而 ...
- MTK framework系统默认设置
Android 5.1 最新framework系统默认设置 一般默认位置:frameworks\base\packages\SettingsProvider\res\values\defaults.x ...
- 大杂烩 -- Java内存布局【图】以及java各种存储区【详解】
基础大杂烩 -- 目录 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 一.Java内存布局浅谈 1. 总述 我们知道,线 ...