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 ...
随机推荐
- Entity Framework定义外键,限制通过migration命令自动更改字段名称
1.问题 在定义一个表的外键时,通过add-migration命令生成,并通过update-database更新到数据库,发现外键名称发生了重命名.举例说明: 人员表[User](Id,Name,Pa ...
- Web - JSONP和同源策略漫谈
0x00 前言 关于JSONP网上有很多文章了,我也是在拜读了别人的文章的基础上来写写自己的看法,这样可以加深自己印象,巩固一下学习效果.我们需要做的就是站在巨人的肩膀上眺望远方. 0x01 起 在W ...
- visio操作
1.上下标:选中要成为上标的文字,ctrl+shift+"=" 选中要成为下标的文字,ctrl+"="
- RR算法 调度
RR算法是使用非常广泛的一种调度算法. 首先将所有就绪的队列按FCFS策略排成一个就绪队列,然后系统设置一定的时间片,每次给队首作业分配时间片.如果此作业运行结束,即使时间片没用完,立刻从队列中去除此 ...
- 基于Java的数据采集(三)
<基于Java的数据采集(一)>:http://www.cnblogs.com/lichenwei/p/3904715.html <基于Java的数据采集(二)>:http:/ ...
- 两台centos之间传送文件
https://www.cnblogs.com/pangguoming/p/9282762.html
- 使用Android拨打电话功能
1.要使用Android系统中的电话拨号功能,首先必须在AndroidManifest.xml功能清单中加入允许拨打电话的权限: <uses-permission android:name=&q ...
- 关于 oh-my-zsh 插件的使用(以 Sublime Text 为例)
这里不讲 oh-my-zsh 是什么.也不讲 oh-my-zsh 插件的工作原理(太深奥,不懂 ). 讲一讲作为一个初学者,在使用过程中遇到的问题以及解决方法. 1 缘起 Ubuntu下,编辑/预览 ...
- Code Labels
Code Labels Code labels are three-letter codes with which commit messages can be prefixed. CODE Labe ...
- df
hdu 1052 Tian Ji -- The Horse Racing (2011-08-26 08:32:51) 转载▼ 标签: 杂谈 分类: acm杂谈 Tian Ji -- The Horse ...