下面是具体的代码实现:

 #define S3C2440_MPLL_200MHZ ((0x5C<<12)|(0x01<<4)|(0x02))
#define MEM_CTL_BASE     0x48000000
.text
.global _start:
_start:                  /* 关闭看门狗 * /
 ldr r0, =0x53000000
    mov r1,#0
    str r1,[0]
   
 
    /* 设置时钟 */
    ldr r0,=0x4c000014
    mov r1,#0x03;    //FCLK:HCLk:PCLK=1:2:4,HDIVN=1,PDIVN=1
    str r1,[r0]
   /*如果HDIVN非0,CPU的总线模式应该从“fast bus mode ”变为 asynchronous,这是根据数据手册来的,数据手册要求这样做(条件:如果FCLK不等于HCLK的话)*/
   mrc p15,0,r1,cl,c0,0   /*读出控制寄存器*/
   orr r1,r1,#0xc0000000  /*设置为"asynchronous bus mode"*/
   mcr p15,0,r1,c1,c0,0   /*写入控制寄存器*/
  
   /*设置MPLLCON= S3C2440_MPLL_200MHZ*/
 ldr r0,= 0x4c000004
 ldr r1,= s3c2440_MPLL_200MHZ    /*伪汇编指的是在编译时,如果这个值比较复杂的话,那就会将这个值拆分放在内存的某个地方,然后再读那个内存地址*/
 str r1,[r0]
 /* 初始化SDRAM */
     ldr r0,=MEM_CTL_BASE
     adr r1,sdram_config     /*得到当前地址*/
     add r3,r0,#(13*4)
1b:
  ldr r2,[r1],#4
  str r2,[r0],#4
  cmp r0,r3
  bne 1b
 
sdram_config:
   .long     0x22011110    //BWSCOON
   .long     0x00000700    //BANKCON0
   .long     0x00000700    //BANKCON1
   .long     0x00000700    //BANKCON2
   .long     0x00000700    //BANKCON3
   .long     0x00000700    //BANKCON4
   .long     0x00000700    //BANKCON5
   .long     0x00018005    //BANKCON6
   .long     0x008c04F4   
   .long     0x000000B1    //BANKSIZE
   .long     0x00000030    //MRSRB6
   .long     0x00000030    //MRSRB7
  
 
/* 重定位bootloader ,把本身的代码从flash复制到它的链接地址去*/
   ldr sp,= 0x34000000
   bl  nand_init          /*初始化nandflash*/
  
   mov r0,#0
   ldr r1, =_start        /*计算需要拷贝的文件的大小*/
   ldr r2, =__bss_start
   sub r2,r3,r1
  
   bl copy_code_to_sdram    /*将代码拷贝到sdram中*/
   bl clear_bss             /*bss段中的变量都赋值为0,至于为甚麽,我认为是语法的问题*/
/* 执行main  */
   ldr lr,=halt
   ldr pc,=main
halt:
   b  halt    /*假设main函数有返回值的话,一直停在这里,避免单板跑飞。*/
void clear_bss(void)      /*清除bss段,将这段都赋值为0*/
{
      
        extern int __bss_start,__bss_end;
     int *p = &__bss_start;
      for(;p < &__bss_end;p++)
       *p = 0;
  
}
void   nand_init(void)
{    #define TACLS 0
     #define TWTPH0 3
  #define TERPH1 0
    /*设置时序*/
  S3C2440nand->NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);
  /*使能nand flash控制器,初始化ECC,禁止片选*/
  s3c2440nand->NFCONT = (1<<4) | (1<<1)| (1<<0);
 
}
/*nand发出命令函数*/
void nand_cmd(unsigned char cmd)
{
   int i;
  NFCMMMD cmd;
  for (i = 0;i < 10;i++);  /*必须等待一会,否则程序会出错*/
}
/*nand的地址函数*/
void nand_addr(unsigned int addr)
{
  unsigned int col = addr /2048;
  unsigned int page = addr % 2048;
  volatile int i;
  NFADDR = col & 0xff;
  for (i = 0;i < 10;i++);
  NFADDR = (col >> 8) & 0xff;
  for (i = 0;i < 10;i++);
 
  NFADDR = page & 0xff;
  for (i = 0;i < 10;i++);
  NFADDR = (page >> 8) & 0xff;
  for (i = 0;i < 10;i++);
  NFADDR = (page >> 16) & 0xff;
  for (i = 0;i < 10;i++)
}
/*nand的等待函数*/
void nand_wait_ready()
{
 while(!(NFSTAT & 1));
}
/*nand的数据*/
void unsigned char  nand_data(void)
{
 return NFDATA;
 
}
/*nand片选函数*/
void nand_select(void)
{
  NFCONT &= ~(1<<1);
}
/*取消片选函数*/
void  nand_deselect(void)
{
 NFCONT |= (1<<1);
}
/*nand的读函数*/
void nand_read(unsigned int addr,unsigned char *buf.unsigned int len)

  int col = addr /2048;   /*col指的是读的是第一页的某个地址,并不是从0开始读的*/
  int i = 0;
  /*选中*/
  nand_select();
 
while(1)
  {/*发出读命令00h*/
   nand_cmd(0x00);
  
  /*发出地址(分5步发出)*/
  nand_addr(addr);
 
  /*发出读命令*/
  nand_cmd(0x30);
 
  /*判断状态*/
  nand_wait_ready();
 
  /*读数据*/
  for(;col< 2048;&&(i<len);col++)
  {
  buf[i] = nand_data();
  i++;
  addr++;
  }
   col =0;
 }
  /*取消选中,禁止nandflash发出片选信号*/
   nand_deselect();
}
  

从零开始写bootloader(1)的更多相关文章

  1. 从零开始写bootloader(2)

    下图是设置内核启动参数的存放图示,由于bootloader启动内核时,需要给内核传输一些启动参数,但是由于当bootloader把内核 启动之后,程序就跳转到内核中执行了,再也不会回到bootload ...

  2. 深入浅出React Native 3: 从零开始写一个Hello World

    这是深入浅出React Native的第三篇文章. 1. 环境配置 2. 我的第一个应用 将index.ios.js中的代码全部删掉,为什么要删掉呢?因为我们准备从零开始写一个应用~学习技术最好的方式 ...

  3. 从零开始写redis客户端(deerlet-redis-client)之路——第一个纠结很久的问题,restore引发的血案

    引言 正如之前的一篇博文,LZ最近正在从零开始写一个redis的客户端,主要目的是为了更加深入的了解redis,当然了,LZ也希望deerlet客户端有一天能有一席之地.在写的过程当中,LZ遇到了一个 ...

  4. 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)

    从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...

  5. 从零开始写一个武侠冒险游戏-7-用GPU提升性能(2)

    从零开始写一个武侠冒险游戏-7-用GPU提升性能(2) ----把地图处理放在GPU上 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.06 增加对 XCode ...

  6. 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)

    从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...

  7. 读《架构探险——从零开始写Java Web框架》

    内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...

  8. 从零开始写一个Tomcat(叁)--请求解析

    挖坑挖了这么长时间也该继续填坑了,上文书讲到从零开始写一个Tomcat(贰)--建立动态服务器,讲了如何让服务器解析请求,分离servlet请求和静态资源请求,读取静态资源文件输出或是通过URLCla ...

  9. 使用USBASP给Arduino烧写bootloader教程

    源:使用UsbAsp给UNO烧写bootloader ATMEGA16U2.ATMEGA328P固件烧写教程 arduino板由于操作不发导致固件损坏,或者想更新固件怎么办?今天给大家介绍一下如何使用 ...

随机推荐

  1. Linux中的Wheel组的作用

    原文:http://www.360doc.com/content/11/0505/10/4644186_114496525.shtml Linux中的Wheel组的作用(用自己的话翻译的) (原文) ...

  2. 20165304《JAVA程序设计》第四周学习总结

    教材内容总结 第五章 子类与继承 1.子类声明中通常用关键字extend来定义一个子类(class 子类名 extend 父类名{}) 2.子类和父类在同一包中的继承性,继承的成员变量或方法的访问权限 ...

  3. WMI Provider Host

    WMI 即 Windows Management Instrumentation(Windows 管理规范)的简写,是 Windows 操作系统的一项内置功能,它为软件和管理脚本提供了一种标准化方法, ...

  4. 让linux每天定时备份MySQL数据库并删除五天前的备份文件

    MYSQL定期备份是一项重要的工作,但人工操作太繁琐,也难避免有所疏漏,使用下面的方法即可让系统定期备份数据.利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的. 1. ...

  5. 机器学习进阶-图像梯度运算-Sobel算子 1. cv2.Sobel(使用Sobel算子进行计算) 2. cv2.convertScalerAbs(将像素点进行绝对值的计算)

    1.cv2.Sobel(src, ddepth, dx, dy, ksize)  进行sobel算子计算 参数说明:src表示当前图片,ddepth表示图片深度,这里使用cv2.CV_64F使得结果可 ...

  6. 机器学习入门-数值特征-数据四分位特征 1.quantile(用于求给定分数位的数值) 2.plt.axvline(用于画出竖线) 3.pd.pcut(对特征进行分位数切分,生成新的特征)

    函数说明: 1.  .quantile(cut_list) 对DataFrame类型直接使用,用于求出给定列表中分数的数值,这里用来求出4分位出的数值 2.  plt.axvline()  # 用于画 ...

  7. Linux命令之lsof

    1.lsof简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件. ...

  8. Windows系统封装总结

    注:使用虚拟机或者实体机进行封装均可,实体机进行封装的成功率更高.虚拟机进行封装建议使用VMware,12版本.过高的版本容易造成封装失败 一.            Windows 10系统封装 1 ...

  9. 使用__slots__限制实例的属性

    1.给实例化的对象添加新的属性 看下面一段代码,然后给实例化的对象s添加或者修改属性 class Student(object): name='china' s = Student() s1=Stud ...

  10. ArcGIS中的WKID(转)

    ArcGIS中的WKID link: https://www.cnblogs.com/liweis/p/5951032.html 提到坐标系统,大家多少能明白一些,但在运用时,有些朋友搞得不是非常清楚 ...