• 6410 运行裸机程序


    关于ok6410的裸机开发资料,大多都是windows下的,使用RVDS编写裸机程序,并编译烧录到开发板上运行,但是我整了很久也没在windows10上将环境装好,又懒得装一个xp的虚拟机,所以就摸索在Linux下进行裸机程序的开发。具体内容分为以下几个部分:
    一.前期准备
    二.裸机程序的编写(驱动LED)
    三.裸机程序编译链接
    四.裸机程序的烧录
    一.前期准备
    1.交叉编译工具链
    交叉编译工具链用来编译、链接裸机程序,生成开发板可执行的二进制文件,只需要将ok6410光盘中的交叉编译工具解压到Linux下,并添加环境变量指明路径即可,如下图:

    2.tftp服务器
    tftp服务器用来将二进制文件传送到开发板上
    1.安装xinetd:
    zoro@ubuntu:~$ sudo apt-get install xinetd
    2.安装tftp客户端和服务器
    zoro@ubuntu:~$ sudo apt-get install tftp tftpd
    3.建立配置文件:
    建立/etc/xinetd.h/tftp 并写入如下内容,其中var/tftpboot/是服务器的目录,需要将其权限设为777


    3.SD卡
    由于之后裸机程序需要通过uboot上的tftp烧录到开发板中,所以需要制作SD卡将uboot烧录到NandFlash

    二、裸机程序的编写
    之前的准备工作做好之后,就可以编写裸机程序了,按照国际惯例先驱动LED(比较简单……),首先看ok6410的原理图


    由原理图可知,4个LED对应着芯片的GPM0~GPM3,接下来看芯片手册


    由芯片手册可知,GPM0~GPM3的配置是GPMCON的0~15位,分别将其设置为0001,即输出模式,然后给GPMDAT寄存器赋值即可确定输出高电平或者低电平,由原理图可知,在ok6410开发板输出低电平,LED发光。知道这些即可编写裸机程序:
     
     1 #define rGPMCON          (*(volatile unsigned *)(0x7F008820))
      2 #define rGPMDAT          (*(volatile unsigned *)(0x7F008824))
      3 #define rGPMPUD          (*(volatile unsigned *)(0x7F008828))
      4 
      5 
      6 void msDelay(int time)
      7 {
      8     volatile unsigned int i,j;
      9     for(i = 0; i < 2000000; i++)
     10     for(j=0; j<time; j++);
     11 }
     12 
     13 void GPIO_Init(void)
     14 {
     15     rGPMCON  = 0x11111;
     16     rGPMPUD  = 0x00;
     17     rGPMDAT  = 0X1F;
     18 }
     19 void LedTest(void)
     20 {
     21     volatile unsigned int i;
     22     while (1)
     23     {
     24         for(i=0; i<4; i++)
     25         {
     26             rGPMDAT  = ~(1<<i);
     27             msDelay(10);
     28         }
     29 
     30     }
     31 }
    32
     33 int main(void)
     34 {
     35     GPIO_Init();
     36     LedTest();
     37     return 0;
     38 }
    再编写启动代码,调用C程序:
    1
    2 bl _start
    3 _start:
    4
    5 /* Peri port setup */
    6 ldr r0, =0x70000000
    7 orr r0, r0, #0x13
    8 mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
    9
    10 /* Disable Watchdog */
    11 ldr r0, =0x7E004000 @看门狗寄存器地址为0x7E004000
    12 mov r1, #0
    13 str r1, [r0] @往看门狗寄存器写入0,关闭看门狗,否则板子会不断重启
    14
    15 /* 设置栈 */
    16 ldr sp, =8*1024 @此时栈大小不能大于8K,因为现在可用的内存只有8K
    17 @NAND Flash中的代码在复位后会移到SRAM中,而SRAM只有8K大小
    18
    19
    20 bl main @跳入C程序的main函数处执行
    21 halt:
    22 b halt
    其中678三行告诉cpu外设的基地址(如下图),16行用于设置C语言的运行栈,20行跳转到main函数(当然,不叫main也是可以的,如果改名的话,在C语言程序里做相应改变就行),最后俩行相当于一个死循环


    到这里裸机程序已经写完了,接下来需要做的就是编译了。

    三、 裸机程序编译链接
    说白了,使用RVDS只是把编译链接的过程集合到一块了,现在我们需要自己做这些工作,通过Makefile组织文件:
    1 ll: led.bin
    2
    3 led.bin: start.o led.o
    4 arm-linux-ld -Ttext 0 -o led.elf start.o led.o
    5 arm-linux-objcopy -O binary led.elf led.bin
    6 arm-linux-objdump -D led.elf > led.dis
    7
    8 start.o : start.s
    9 arm-linux-gcc -g -o start.o start.s -c
    10
    11 led.o : led.c
    12 arm-linux-gcc -g -o led.o led.c -c
    13
    14 clean:
    15 rm *.o led.elf led.bin led.dis

    arm-linux-gcc -g 为了调试 -o 控制输出文件 -c 只编译不链接
    arm-linux-ld 链接器
    arm-linux-objcopy 输出可执行二进制文件
    arm-linux-objdump 将led.elf反汇编到led.dis中

    然后执行make命令,就会生成二进制文件 len.bin


    四.裸机程序的烧录
    进行到这里,只需要将可执行文件烧录到开发板执行就ok了

    1.将led.bin文件复制到tftp服务器的目录下(和我的配置的一样的话,即/var/tftpboot目录)

    2.向开发板烧录uboot,然后切换到nandflash启动,出现输出信息是按空格,出现如下画面就成功了


    然后选择6,进入uboot,给开发板连接网线,确保主机和开发板处于同一局域网,关闭主机的防火墙,然后配置ip

    由上向下依次是 开发板ip, 主机ip, 网关, 最后保存

    3.将可执行文件下载到DRAM:
    tftp 【地址】【文件名】

    注意这里的地址必须在0x50000000~0x6FFFFFFF范围内,因为其他内存地址不是DRAM


    此时使用go命令, go 【地址】,即可运行你的裸机程序了,可以看到led被点亮了


    4.到这里可以说整个流程都走完了,但是裸机程序掉电以后就没了,如果想让程序掉电以后还在开发
    板上,可以将裸机程序写到nandflash,具体做法如下:

    nand erase 【偏移量】【擦除长度】
    擦除一块nand,我这里从0x30000000开始 擦除了1M
    nand write 【内存地址】【偏移量】【写长度】
    将内存里的数据写到nand,这里将0x60000000的裸机程序写到0x30000000处
    然后重启以后,再将这片nand内容读入内存,使用go命令运行读到文件的地址。


    这里需要注意的是,如果nand擦除的地址太低的话,有可能覆盖uboot,导致uboot不能正常启动,当然写入的地址如果为0的话,
    开发板启动以后会直接执行你写的裸机程序,不执行uboot了。

    到这里,你已经可以使用linux开发OK6410的裸机程序了,赶快燥起来,把其他外设也都驱动起来吧!
    ---------------------
    作者:Zoro_97
    来源:CSDN
    原文:https://blog.csdn.net/qq_36028037/article/details/78688002
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Django部署在CENTOS7上
    慕课DJANGO配置
    响应式布局组件介绍
    SYN泛洪攻击原理及防御
    Token,session,cookie
    -webkit-
    JS中dataTransfer对象在拖曳操作中的妙用。
    深入理解DOM节点类型第一篇——12种DOM节点类型概述
    js如何打印object对象
    cookie(2)
  • 原文地址:https://www.cnblogs.com/eastgeneral/p/10696332.html
Copyright © 2020-2023  润新知