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 ...
随机推荐
- Java JPA小记
什么是JPA JPA之于ORM(持久层框架,如MyBatis.Hibernate等)正如JDBC之于数据库驱动. JDBC是Java语言定义的一套标准,规范了客户端程序访问关系数据库(如MySQL.O ...
- MQTT 学习记录
学习mqtt协议,从网上找demo验证一下. 参考链接 https://www.jianshu.com/p/ebbe25d1c4b2 https://blog.csdn.net/xxmonstor/a ...
- Linux系统排查4——网络篇
用于排查Linux系统的网络故障. 网络排查一般是有一定的思路和顺序的,其实排查的思路就是根据具体的问题逐段排除故障可能发生的地方,最终确定问题. 所以首先要问一问,网络问题是什么,是不通,还是慢? ...
- Schema中elementFormDefault="qualified"所起的作用
有的xsd文件的开头是这样写的: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.or ...
- MyBatis Generator使用com.mysql.cj.jdbc.Driver遇到的问题
MyBatis Generator使用com.mysql.cj.jdbc.Driver Mybatis Generator 1.3.5 新建了一个decision库,并创建了一张user表 impor ...
- 【问题集】redis集群set报错(error) MOVED 11469 192.168.181.201:7002
没有启动集群模式(即缺少了那个"-c"): redis-cli -c -h yourhost -p yourpost
- 在WPS中删除整行的快捷键是什么?
选中需要删除的行,(方法:点击最左侧的行号):按快捷键Ctrl+-(按着Ctrl不放,再按小键盘的减号“-”),“-”是删除,“+”是插入,选中行,是对行操作,选中列就是对列操作,选中单元格,就是单元 ...
- Python处理数据
由于找实习,要学习python处理数据,python连接mysql,python读写文件,python读写xlsx文件,这些只要引入了相关的包,就非常容易,处理过程非常清晰.模块如果封装的好,没怎么学 ...
- CentOS7.5 Linux搭建全文检索--Solr7.4.0单机服务
一.Solr安装环境 1.官方参考文档 Solr教程参考指南:http://lucene.apache.org/solr/guide/7_4/solr-tutorial.html 2.Solr运行环境 ...
- Python----八荣八耻
以动手实践为荣 , 以只看不练为耻; 以打印日志为荣 , 以单步跟踪为耻; 以空格缩进为荣 , 以制表缩进为耻; 以单元测试为荣 , 以人工测试为耻; 以模块复用为荣 , 以复制粘贴为耻; 以多态应用 ...