硬件平台: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裸机程序的更多相关文章

  1. 基于KEIL4开发ARM9(S3C2440)的裸机程序

    本文主要介绍如何使用Keil4开发ARM9(S3C2440)裸机程序. 说明: 一.平台: 操作系统:Windows XP系统 KEIL版本:4.73 开发板:ARM9(S3C2440) 二.建立工程 ...

  2. ubuntu15.10跑裸机程序跑.bin文件

    1:安装tftp:#apt-get update#apt-get install tftp-hpa tftpd-hpa xinetd2:#cd /srv#mkdir tftp#chmod 777 tf ...

  3. EB-SAM9G45裸机程序下载方法

    开发板:EB-SAM9G45 这里提供一种裸程序下载的方法. 在官方提供的下载方法中有手动下载和自动下载,它们都离不开SAM-BA软件,而该软件使用比较麻烦,而且操作不当很容易导致电脑蓝屏,还有一个很 ...

  4. s3c2440 lcd 显示图片裸机程序

    因为前面的裸机程序非常的简单,就不写博了. 程序的流程: 1,初始化C SP 2,关看门狗 3,初始化SDRAM 4,读出 NAND FLASH 中的 包含图片的程式放到SDRAM里面 5,跳转到SD ...

  5. ARM入门实践(一)----Mini6410上最简单的LED点灯裸机程序

    Mini6410上最简单的LED点灯裸机程序 : 实验环境: 根据友善教程,要用ADS,据说现在都不用这个了,但是为了打开友善给的mcp工程,就下了一个,Win7下弄上兼容模式和管理员权限,再下一个S ...

  6. JZ2440学习笔记之第一个裸机程序(Keil-MDK)

    CPU:S3C2440, ARM920T, Internal 4KB RAM, Support boot from NAND flash, 128MB for each bank. JZ2440:Me ...

  7. freeRTOS与裸机程序相比有什么区别??

    FreeRTOS命名及变量规则 初学FreeRTOS的用户对其变量和函数的命名比较迷惑,    FreeRTOS的核心源代码遵从MISRA编码标准指南,关于MISRA编码标准,可以查看文章https: ...

  8. MDK972-EK开发板裸调试设置和裸机程序烧写(转)

    硬件平台:MDK972-EK开发板编译调试软件:KEIL uVision4仿真工具:JLINK V7/V8   本例子从串口输出信息,如图:       KEIL uVision4调试设置如图所示: ...

  9. JZ2440学习笔记之通过J-Link单步裸机程序(Keil+J-Link)

    我们还是使用JZ2440学习笔记之第一个裸机程序(Keil-MDK)里面的程序,但是把延时拿掉,要不然单步的时候一直在delay里面: int main(void) { // Set GPF4/5/6 ...

随机推荐

  1. PHP最全笔记(四)(值得收藏,不时翻看一下)

    // 序列化(串行化) # 数据传输均是字符串类型 # 除了资源类型,均可序列化 # 序列化在存放数据时,存放数据本身,也存放数据类型 1.在网络传输数据时:2.为了将数组或对象放在磁盘时 # 序列化 ...

  2. CentOS7 yum方式安装MariaDB 10.2.13-1

    注:以下步骤都是以root身份运行. 一.建立mariadb.repo 1,编辑新文件,命令:vim  /etc/yum.repos.d/mariadb.repo 2,输入如下内容,保存退出 [mar ...

  3. Android高效加载大图、多图解决方案,有效避免程序OOM(转)

    本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/training/displaying ...

  4. python通过get,post方式发送http请求和接收http响应的方法,pythonget

    python通过get,post方式发送http请求和接收http响应的方法,pythonget 本文实例讲述了python通过get,post方式发送http请求和接收http响应的方法.分享给大家 ...

  5. Linux内核 GPIO操作部分API

    内核中关于GPIO的操作API主要集中在<linux/of_gpio.h>和<linux/gpio.h>中,前者主要是GPIO直接与设备树相关的操作,在Linux 设备树操作A ...

  6. .NET/C# 优化心得

    网上的优化千篇一律,遂干脆自己写一个,总结总结网上说的与自己的想法. 1.关于sql方面的优化,详见Mysql语句的优化 2.对于不常更新的网页,使用静态页,使用 cdn 加速. 3.关于主从同步,如 ...

  7. java编程感悟02

    很多时候我们需要网上查阅他人的代码,如果代码比较长或者注释较少,阅读起来就会比较费劲,这时需要培养快速读懂应用他人的代码的能力. 实现图片的旋转功能: import java.awt.geom.Aff ...

  8. js的server worker创建子进程

    类似nodejs的 child_process.fork() // index.html 主线程 function isClose(data){ if(data === 0) return true; ...

  9. golang - interface的作用

    多态.struct 可以赋值给 interface.interface 可以转换成子接口,或者 struct. 请看go中的一段的源代码: listener, _ := net.Listen(&quo ...

  10. 170825、SolrCloud 分布式集群部署步骤

    安装软件包准备 apache-tomcat-7.0.54 jdk1.7 solr-4.8.1 zookeeper-3.4.5 注:以上软件都是基于 Linux 环境的 64位 软件,以上软件请到各自的 ...