ITOP4412裸机编程-点亮LED灯_平凡的小蚂蚁的博客-程序员ITS304

技术标签: 嵌入式linux系统  

参考博文
ITOP4412裸机开发—LED
tiny4412裸机程序之点灯

前言:

       这是我的第一篇博客,不足之处还请批评指正,涉及侵权问题请与我联系,转载注明出处即可。
       本文介绍用SD卡启动的裸机编程,学会这个裸机编程,移植uboot之类的也不再话下了,由于Exynos4412这个芯片有两种封装方式pop和scp,这两个芯片对应着不同的BL1,盲目烧写错的BL1可能实现不了目标,详细实现功能请向下翻阅,博主的板子是迅为的精英板4412 pop1G封装。
博主的板子

启动原理:

overview
       图片是迅为提供的uboot文档中截的,从图中看开发板在上电时会经过以上三个步骤,就是图中的圆圈中的123了,第一步,开发板上电会去执行IROM,这个IROM会由OM的控制决定从哪个介质开始引导加载程序。
编码方式
       如图由五位二进制编码决定,详细不再讲,我们这里讲SD卡启动,就将开发板的拨码开关拨到SD卡启动。第二步,程序会从SD卡中加载第一段代码BL1到IRAM中;第三步,OS系统会被加载到DRAM中,至此引导结束。
       但是这个地方有个问题,第一步和第二步都对,但是第三步,BL1会从SD卡中的第18个扇区开始读取16K代码到internal SRAM中并跳转到这段代码的起始位置。如下图第一个:IRAM结构

       加载的这个BL2实际上是uboot的前16K,uboot后面的大部分代码会被BL2加载到DRAM中,然后跳转到DRAM中uboot开始的位置开始执行,我们这里讲裸机程序,实际上就是把BL2替换成裸机程序,但是这个裸机程序必须小于14K,为什么要小于14K呢?如下图BL2的结构:
BL2
       如图BL2的结构实际上是BL2的程序+4Byte的校验和+256Byte的签名+补全0=16K,因为BL1加载BL2到IRAM后要验证校验和是否正确,所以我们写好的裸机程序最终还要加上4字节的校验和后等于14K,官方提供的uboot中有制作校验和的源码,后面会介绍。

源码:

       新建文件夹及文件

mkdir leds
cd leds
touch start.S s3c4412_gpio.h myboot.lds Makefile mkbl2.c

       修改start.S

       这个汇编代码0x1002330c是PS_HOLD_CONTROL寄存器,保证电源管理芯片正常工作,0x11000c08是GPX0组控制上下拉的寄存器,有个ONO(GPX0_2)在控制电源管理。

#include "s3c4412_gpio.h"
.global _start

.word 0x2000
.word 0x0
.word 0x0
.word 0x0

_start:
   ldr	r10,=0x1002330c
   ldr	r11,[r10]
   orr	r11,r11,#0x300
   str	r11,[r10]

   ldr	r10,=0x11000c08
   ldr	r11,=0x0
   str	r11,[r10]

   ldr	r10,=GPL2CON
   mov	r11,#(0x01<<0)
   str	r11,[r10]

   ldr	r10,=GPK1CON
   mov	r11,#(0x01<<4)
   str	r11,[r10]

1:
   ldr	r10,=GPK1DAT
   mov	r11,#0x02
   str	r11,[r10]

   ldr	r10,=GPL2DAT
   mov	r11,#0x01
   str	r11,[r10]

   b	1b

       修改s3c4412_gpio.h

#ifndef S3C4412_GPIO_H
#define S3C4412_GPIO_H

#define GPX1CON (0x11000000+0x0c20)
#define GPX1DAT (0x11000000+0x0c24)
#define GPX1PUD (0x11000000+0x0c28)
#define GPX1DRV (0x11000000+0x0c2c)

#define GPK1CON (0x11000000+0x0060)
#define GPK1DAT (0x11000000+0x0064)
#define GPK1PUD (0x11000000+0x0068)
#define GPK1DRV (0x11000000+0x006c)

#define GPL2CON (0x11000000+0x0100)
#define GPL2DAT (0x11000000+0x0104)
#define GPL2PUD (0x11000000+0x0108)
#define GPL2DRV (0x11000000+0x010c)

#endif

       修改Makefile

CROSS_COMPILE = arm-linux-gnueabihf-
%.o : %.S
	$(CROSS_COMPILE)gcc -o [email protected] $< -c 
%.o : %.c
	$(CROSS_COMPILE)gcc -o [email protected] $< -c 

.PHONY: all
all : 	led.elf

led.elf : start.o myboot.lds
	$(CROSS_COMPILE)ld -T myboot.lds -o led.elf $^
	$(CROSS_COMPILE)objcopy -O binary led.elf led.bin
	$(CROSS_COMPILE)objdump -D led.elf > led.dis 

.PHONY : clean
clean:
	rm -rf *.o *.elf *.bin *.dis

       修改myboot.lds

SECTIONS
{
	. = 0x02023400;
	.text : {
		start.o
		* (.text)
	}
	.rodata ALIGN(4) : {
		* (.rodata*)
	}

	.data ALIGN(4) : {
		* (.data*)
	}
	.bss ALIGN(4) : {
		* (.bss)
		* (COMMON)
	}
}

修改完上诉文件使用指令make生成led.bin下面要用到

烧录SD卡:

       方法1:

       修改mkbl2.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
    
    FILE *fp;
    unsigned char src;
    char *buf, *a;
    int buf_len;
    int nbytes, file_len;
    unsigned int checksum = 0;
    int i;

    if (argc != 4) {
    
        printf("Usage: mkbl2 <source file> <destination file> <size> \n");
        return -1;
    }

    buf_len = atoi(argv[3]);
    buf = (char *)malloc(buf_len);
    memset(buf, 0x00, buf_len);

    fp = fopen(argv[1], "rb");
    if( fp == NULL) {
    
        printf("source file open error\n");
        free(buf);
        return -1;
    }

    fseek(fp, 0L, SEEK_END);
    file_len = ftell(fp);
    fseek(fp, 0L, SEEK_SET);

    nbytes = fread(buf, 1, file_len, fp);

    if (nbytes != file_len) {
    
        printf("source file read error\n");
        free(buf);
        fclose(fp);
        return -1;
    }

    fclose(fp);

    for(i = 0; i < (14 * 1024) - 4; i++)
        checksum += (unsigned char)(buf[i]);

    *(unsigned int*)(buf + i) = checksum;

    fp = fopen(argv[2], "wb");
    if (fp == NULL) {
    
        printf("destination file open error\n");
        free(buf);
        return -1;
    }

    a = buf;
    nbytes = fwrite(a, 1, buf_len, fp);

    if (nbytes != buf_len) {
    
        printf("destination file write error\n");
        free(buf);
        fclose(fp);
        return -1;
    }

    free(buf);
    fclose(fp);
    return 0;
}

用GCC编译工具编译上诉源码生成mkbl2校验和制作工具

gcc mkbl2.c -o mkbl2

制作BL2

./mkbl2 led.bin bl2.bin 14336

用ssh把bl1(E4412.S.BL1.SSCR.EVT1.1.bin)上传到leds文件夹内
插入SD卡并查看自己的盘符节点,我的是sdb,所以下面会用sdb,根据自己的实际情况更改盘符

df -l

sdb
清零SD卡中前1M的内容

dd if=/dev/zero of=/dev/sdb bs=512 seek=1 iflag=dsync oflag=dsync count=2048

烧写BL1

dd if=E4412.S.BL1.SSCR.EVT1.1.bin of=/dev/sdb bs=512 seek=1 iflag=dsync oflag=dsync 

烧写BL2

dd if=bl2.bin of=/dev/sdb bs=512 seek=17 iflag=dsync oflag=dsync

SD卡制作完毕,拔掉SD插入开发板观察现象

       方法2:

方法2非常简单,使用shell脚本,一行指令制作BL2并烧录进SD卡,下载sd_fuse压缩包,解压后用ssh上传到leds文件夹内,插入SD卡使用下列脚本命令烧录。

cd sd_fuse/itop4412
./sd_fusing.sh /dev/sdb ../../led.bin

现象:

LED亮

源码获取:

可以加入群聊:667039215找群主获取
CSDN获取leds压缩包
sd_fuse获取sd_fuse压缩包
github下载:git clone https://github.com/HOU1354696096/ITOP4412.git

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34390075/article/details/83037941

智能推荐

flyway遇到的问题Caused by: java.lang.ClassNotFoundException: org.flywaydb.core.api.callback.FlywayCallbac_jalen_zh的博客-程序员ITS304

问题环境是springboot2.1.8+flyway6.0.4,尝试编译出错,异常堆栈的信息是找不到flywaycallback类解决过程1、flywaycallback找不到,导致org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration这个bean创建失败...

使用lua语言做高并发限流_shecanwin的博客-程序员ITS304

lua语言介绍       Lua[1]  是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入

简述微信砍价小程序运营新玩法_muyuxiaochengxun的博客-程序员ITS304

  砍价小程序日渐火爆,被越来越多的商家所利用以此来获得更多的用户和产品的盈利。如此好的优质的营销工具,要如何去经营呢?接下来就给大家介绍一下关于微信砍价小程序运营新玩法?感兴趣的可以和木鱼小铺(https://www.muyu007.cn)一起来看看。    1.内容营销预热,推广店铺    微信公众号是小程序推广引流的方式之一,主要是内容营销。所以商家可以结合微信公众号的文章内容来为小程序商城砍价活动进行预热,让用户可以通过内容来了解到线下店铺的环境、商品以及购买的优惠力度,吸引客户进入

matplotlib折线图及柱状图绘制_if shining的博客-程序员ITS304

python-matplotlib折线图及柱状图绘制一、折线图绘制二、柱状图绘制一、折线图绘制# 折线图: matplotlib.plot(横坐标,纵坐标,颜色,lw=线条宽度)# 1.导入numpy,matplotlib模块import numpy as npimport matplotlib.pyplot as plt# 2.定义各个点的横纵坐标x = np.array([1,2,3,4,5,6,7,8])y = np.array([3,5,9,2,7,6,3,8])# 3.将参数传入

SQL server 学习记录(一)_Damon_Code的博客-程序员ITS304

1、创建表create table(id int,name char(10))2、删除表中数据:delete tablename;  直接删除 数据库 数据、结构、日志  drop database;  删除表 drop tablename3、把表数据插入到另一个表    3.1:如果要插入目标表不存在: select * into 目标表 from 表 where …    3....

FPGA的学习:PLL-IP核的调用_石小舟的博客-程序员ITS304

锁相环是最常用的IP核之一,其性能强大,可以对输入到FPGA的时钟信号进行任意分频、倍频、相位调整、占空比调整,从而输出一个期望时钟。其基本原理如下:

随便推点

根据经纬度计算两点之间的距离_csdn_ss1991的博客-程序员ITS304_根据经纬度计算两点距离

package com.bandweaver.tunnel.common.platform.util;import java.math.BigDecimal;import javafx.geometry.Point2D;public class GPSUtil { private static final double EARTH_RADIUS = 6378137;// 赤道半...

基于python的大数据分析基础及实战 百度云_《基于PYTHON的大数据分析基础及实战》余本国著【摘要 书评 在线阅读】-苏宁易购图书..._weixin_39805195的博客-程序员ITS304

部分基础篇章Python语言基础/21.0引子/21.1工欲善其事,必先利其器(安装Python)/31.2学跑得先学走(语法基础)/91.3程序结构/111.3.1HelloWorld!/111.3.2运算符介绍/121.3.3顺序结构/141.3.4判断结构/171.3.5循环结构/181.3.6异常/201.4函数/241.4.1基本函数结构/241.4.2参数结构/251.4.3回调函数/...

深圳大学计算机与软件学院哪个校区,2021年深圳大学有几个校区,大一新生在哪个校区..._清溪-南柯的博客-程序员ITS304

很多深圳大学新生报到之前都有很多疑问,其中一个疑问就是深圳大学有几个校区,大一新生在哪个校区。本文主要为大家介绍关于2020年深圳大学的介绍,深圳大学招生各个专业目录、深圳大学新生在哪个校区的知识。一、深圳大学校区介绍深圳大学现有粤海、沧海、丽湖、罗湖四个校区,校园总面积2.72平方公里。学校教学资源丰富,科研设施齐备。校园总建筑面积146.9万平方米,教学、科研仪器设备总值28亿元。图书馆馆舍5...

python 如果没有该key值置为空,SECRET_KEY设置不能为空||可在Settings.py中找到_研究所的鹏鹏博士的博客-程序员ITS304

I tried to find this bug, but don't know how to solve it.I kept getting error message "The SECRET_KEY setting must not be empty." when executing populate_rango.pyI have checked on settings.py and the ...

Linux命令详解:md5sum 命令_morgan363的博客-程序员ITS304_md5命令

md5sum命令采用MD5报文摘要算法(128位)计算和检查文件的校验和。MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。MD5全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相 同的报文摘要的可能性是非常非常之小的。

关于h5中的fetch方法解读(小结)_mengzhengjie的博客-程序员ITS304

https://www.jb51.net/html5/586989.htmlhttps://segmentfault.com/a/1190000011973904Fetch概念fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,主要目的仅仅只是为了结合ServiceWorkers,来达到以下优化:优化离线体验 保持可扩展性当然如果ServiceWorke...

推荐文章

热门文章

相关标签