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 ...
随机推荐
- android 监听动画对象后不能播放动画
采用监听 AnimationListener 发现不能播放动画了. 解决办法: 将动画的启动方式:animation.startnow去掉,改为如下即可 view.startAnimation(an ...
- Java知多少(31)static关键字以及Java静态变量和静态方法
static 修饰符能够与变量.方法一起使用,表示是“静态”的. 静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法.静态 ...
- Java知多少(77)日期和时间类
Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...
- JAVA的各种O
转自:http://jeoff.blog.51cto.com/186264/88517/ J2EE开发中大量的专业缩略语很是让人迷惑, 特别是对于刚毕业的新人来说更是摸不清头脑.若与公司大牛谈技术人家 ...
- Matlab如何循环读取文件
循环读取图片第一种方法①List =dir('*.jpg'); %如需其它图片格式支持,可以自己[重载dir()]函数,实现查找所有图片文件的功能,%如果图片是其它路径,可以用 ["路径&q ...
- Java如何检查文件是否在服务器上被修改了?
在Java编程中,如何检查文件是否在服务器上被修改了? 以下示例显示如何检查文件是否在服务器上进行了修改. package com.yiibai; import java.net.URL; impor ...
- Java如何清除空格?
在Java编程中,如何清除/删除空格? 以下示例演示如何使用Util.regex.Pattern类的matcher.replaceAll(stringname)方法来删除空格. package com ...
- java-信息安全(十七)-*.PFX(*.p12)&个人信息交换文件
原文地址 http://snowolf.iteye.com/blog/735294 与计费系统打交道,少不了用到加密/解密实现.为了安全起见,通过非对称加密交换对称加密密钥更是不可或缺.那么需要通过什 ...
- java socket 服务器多线程 数据转发的研究实践
项目中借鉴了以下资料: https://www.cnblogs.com/whenever/p/5526420.html https://www.cnblogs.com/jpwz/p/5715852.h ...
- 提升linux下TCP服务器并发连接数(limit)
https://cloud.tencent.com/developer/article/1069900 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进 ...