Linux_kernel烧写Uboot02

news2024/11/15 21:48:47

一、温故知新

        1、开发环境

        Ubuntu的Linux操作系统(18.04 20.04 22.04)

        前面的版本号是双数,后面的版本号是04

        lsb_release -a        用于查看系统版本号

        uname -a                查看系统位数/内核版本号

        2、体系架构

        APP                        各种控制界面\通信的应用程序

        GUI                        Java\Qt\MiniGUI\LVGL

        本地应用程序        在本地可执行的程序

        Lib                        动态库\静态库(区别、制作)

        文件系统                根文件系统

        内核                        Linux\windows

        bootloader Uboot

---------------------------------------------------------

        S5P6818开发板 = 核心板 + 底板

                核心板 = SOC(芯片) + DDR内存(1GB) + EMMC硬盘(8GB) + PMU(电源管理芯片) + PHY(网络芯片)

                            SOC = CPU(ARM核心【8核】1.4GHz) + 总线(CPU通过总线访问外设) + 内存 + 硬盘 + 外设

                            CPU = arm-cortex-a53 + cache(高速缓存) + mmu(内存管理单元) + 中断控制器 +。。。

                底板 = key beep led SD0 SD1 USB UART LCD

     arm---------->三星----------->九鼎科技------->easthome---------->我们

芯片设计   芯片厂商(ODM)   代理商(OEM)       技术整理        整理好的方案

        3、阶段性学习

        ARM体系结构与编程

        系统移植

        Linux下的驱动开发

        项目

        4、Linux的启动顺序

        先启动Uboot(bootloader)----->启动uImage/zImage(Linux内核)----->启动rootfs(根文件系统)

                        未分区         已分区

        EMMC[Uboot uImage | rootfs]

        5、烧写Uboot

                对于S5P6818开发板来说,板子的驱动设备有:

                        第一启动设备:SD0

                        第二启动设备:EMMC

                        第三启动设备:USB

                一块新板的EMMC是没有内容的,所以我们需要使用SD卡启动

                1)为啥是第513个字节

                        主要是因为S5P6818芯片中有一块ROM,里面存储的是三星公司固化好的程序,里面的代码固定了需要从SD卡的第513个字节读取bootloader,把bootloader读到RAM中,执行bootloader的第一个阶段。

                2)为啥不放到第0个字节

                        主要是因为SD卡的前512个字节(第一个扇区),存放的是分区表

                3)如何准确地写入到第SD卡的第513个字节

                        【1】使用dd命令

                        【2】使用文件系统的命令对其进行操作,open lseek read write close

                                                未分区                        已分区

                        SD卡 = [512byte + 总扇区的1/100 | ---fat32---]

                4)SD卡分区操作

                        mount

                        umount

                        fdisk

                        mkfs.vfat

                        sync

                5)把Uboot烧写到SD卡中

                        sudo dd if=文件名 of=文件名 seek=1

二、搭建开发环境

        1、查询当前环境的编译器

                我们先使用gcc -v查询ubuntu操作系统中gcc编译器的架构

                CISC(复杂指令集)        X86-Intel

                RISC(精简指令集)        ARM、MIPS、PPC

                我们当前使用的Ubuntu操作系统的编译器是X86架构的,但我们程序需要在ARM架构的设备上运行,所以我们不能使用gcc来编译程序,我们需要使用交叉编译工具链。

        2、搭建交叉编译工具链

                代码咋上位机编译,可执行程序在下位机运行

                下载官网:Downloads | GNU-A Downloads – Arm Developer

         【1】、获取交叉编译工具链
                1)找到工具包

                        arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz

                        注意:需要在Linux操作系统中发现工具包

                                a、共享目录

                                b、把资料包拷贝到Linux系统

                2)创建目录

                        sudo mkdir /opt/toolchains -p

                        注意:/opt/ 存放的是附加的软件包

                3)把tar包拷贝到新建目录

                        sudo cp arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz /opt/toolchains

                4)进入新建目录

                        cd /opt/toolchains

                5)解压tar包

                        sudo tar xvf arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz

         【2】、交叉编译工具链的命名

                arch-core-kernel-system

                        arch        用于哪个目标平台

                        core        使用的是哪个CPU核心

                        kernel      所运行的内核(Linux uclinux bare<无OS>)

                        system    交叉编译工具链所所选择的库和目标(gun ... eabi)

        【3】配置环境变量
                1)查询环境变量

                     env | grep PATH

                2)修改环境变量

                     vim ~/.bashrc

                     export PATH=$PATH:/opt/toolchains/arm-cortex_a9-eabi-4.7-eglibc-2.18/bin

                     保存退出

                     source ~/.bashrc 

                3)验证交叉编译器是否搭建完成

                        输入:arm- + tab键,观察是否可以自动补全 

        3、保证下位机可以ping通上位机

                1)修改虚拟操作系统的IP

                        在虚拟操作系统中,输入命令

                                sudo ifconfig ens33 192.168.1.27

                        也可以手动进行配置,

         显示应用程序-->设置--->网络--->有线--->"+"--->身份--->名称--->"arm"--->ipv4--->手动--->

        

                2)配置虚拟机

         虚拟机-->设置--->网络适配器-->桥接模式--->

在windows系统中确定与开发板连接的网卡

在虚拟机中更改网络适配器

在VMnet0中选择与window相同的网卡,应用,确定

                3)配置开发板的IP

                        使用串口进入到开发板的Uboot的命令行(在开发板启动过程中,按回车键)

                        printenv / print / pr        打印Uboot中的环境变量(Uboot支持最短命令关键词匹配)

                        【1】Uboot环境变量分析

bootargs

启动内核时,回去修改这个环境变量
bootcmd延时之后要执行的命令
bootdelayUboot的延时计数
bootfile内核文件
ethaddr开发板的MAC地址
gatewayip网关
ipaddr开发板的IP地址
newmask子网掩码
serverip服务器的IP地址
stderr 标准错误对应的是串口
stdin标准输入对应的是串口
stdout标准输出对应的是串口

注意:Uboot也需要与PC机通过网络进行通信,这些IP地址类的信息内容指的是在Uboot下的信息内容,将来启动了Linux系统之后,就不一定了。

                         【2】设置Uboot环境变量(虚拟机作为服务器,开发板作为客户端)

                        设置Uboot本地IP

                                setenv ipaddr 192.168.1.6

                        设置服务器的IP

                                setenv serverip 192.168.1.27

                        设置延时计数

                                setenv bootdelay 5

                        保存环境变量

                                saveenv

                        重启

                                [1]按重启键复位

                                [2]re

        4、安装tftpd服务

                我们可以使用它,将我们在虚拟机编译好的程序烧录到下位机。

                例如,我们可以将ubootpak.bin(Uboot编译出来的二进制文件)和uImage(Linux内核)以及rootfs(根文件系统)下载并烧录到开发板上。

                1)保证虚拟机连上外网

                        重启网络服务

                        sudo service network-mnanager restart

                        或

                        sudo /etc/init.d/network-manager restart

                2)安装tftpd服务

                        安装tftpd客户端

                        sudo apt install tftpd

                        安装tftpd服务端

                        sudo apt install tftpd-hpa

                3)创建tftp下载目录

                        创建tftp下载目录

                        sudo mkdir /tftpboot

                        修改tftp下载目录权限

                        sudo chmod 777 /tftpboot

                4)配置tftp服务器

                        修改配置文件

                        sudo vim /etc/default/tftpd-hpa

 

                5)重启tftp服务器

                        sudo service tftpd-hpa restart 

        5、验证tftpd服务

                1)将准备好的ubootpak.bin下载到下位机

                        cp ubootpak.bin /tftpboot

                2)保证下位机可以ping通上位机

                        ping 192.168.1.27

                3)通过tftp服务下载文件

                        tftp 0x48000000 ubootpak.bin

                        tftp:命令

                        0x48000000:内存地址

                        ubootpak.bin:下载的文件名

                注意:48000000这个地址是开发板的内存地址,我们使用tftp命令将文件下载到开发板0x48000000这个地址,重启后,ubootpak.bin会丢失,另外,在Uboot中,可以不写0x前缀,默认是十六进制。

                4)将ubootpak.bin烧录到EMMC(硬盘)中

                        update_mmc 2 2ndboot 0x48000000 0x200 0x53ba8

                        录入之后,re重启

                        update_mmc:表示更新mmc

                        2:是第二个分区

                        2ndboot:表示第二个启动设备(EMMC)

                        0x48000000:表示从内存的0x48000000这个地址中读

                        0x200:偏移地址

                        0x53ba8:是ubootpak.bin文件大小

三、驱动S5P6818上的GPIO

                一般来说,GPIO的PIN的功能是多功能复用型管脚

                操作:

                        1、将GPIO的管脚选择功能复用为GPIO

                        2、将GPIO管脚配置为输出功能

                        3、控制管脚输出高/低电平

                S5P6818芯片上有537个管脚

                GPIO的管脚有160个,五组(A、B、C、D、E),每组有32个管脚

        1、先看硬件        

        2、开发板原理图

LED0 GPIOB26

LED1 GPIOC11

LED2 GPIOC7

LED3 GPIOC12

4栈LED灯的阳极连接了VCC,阴极连接了GPIO管脚

如果GPIO管脚输出低电平,灯亮

如果GPIO管脚输出高电平,灯灭

        3、查看数据手册        

GPIOB26        选择Alternate Function 1(复用功能1)

GPIOC11        选择Alternate Function 1(复用功能1)

GPIOC7          选择Alternate Function 1(复用功能1)

GPIOC12        选择Alternate Function 1(复用功能1)

配置GPIO复用选择寄存器

GPIOXALTFN0可以控制GPIO0~GPIO15

GPIOXALTFN1可以控制GPIO16~GPIO31

*(volatile unsigned int *)(0xC0010000) &= ~(3 << 24);        // 清零

*(volatile unsigned int *)(0xC0010000) |= (1 << 24);        // 置一

配置GPIO输出使能寄存器

*(volatile unsigned int *)(0xC001C004) |= (1 << 12);        // 置一

将对应的管脚置为高低电平

*(volatile unsigned int *)(0xC001C000) &= ~(1 << 12);        // 灯亮

*(volatile unsigned int *)(0xC001C000) |= (1 << 12);        // 灯灭

注意:ARM中所有的特殊功能寄存器都是32bit的,我们操作寄存器需要找到要操作寄存器的真实地址,然后使用位运算操作。

        寄存器的真实地址 = 基地址 + 偏移地址

--------------------------------------------------

volatile 关键字的本意是易变的,作用是告诉编译器,由其修饰的变量,每次进行编译时,都要谨慎地从内存中取出,而不是从缓存中取其备份。

---------------------------------------------------

#define GPIOCOUT    *(volatile unsigned int *)0xC001C000
#define GPIOCOUTENB *(volatile unsigned int *)0xC001C004
#define GPIOCALTFN0 *(volatile unsigned int *)0xC001C020

void delay(unsigned int x);

void led_test(void)
{   
    //把PC12管脚选择为复用功能1
    GPIOCALTFN0 &= ~(3 << 24);
    GPIOCALTFN0 |= (1 << 24);
 
    //把PC12管脚的输出功能使能
    GPIOCOUTENB |= (1 << 12);

    while(1)
    {
        GPIOCOUT &= ~(1 << 12);//把PC12管脚拉低(灯亮)
        delay(0x10000000);
        GPIOCOUT |= (1 << 12);//把PC12管脚拉高(灯灭)
        delay(0x10000000);
    }
}

void delay(unsigned int x)
{
    while(x--);
}

        5、 编译代码

                1)编译成目标文件

                arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c led_test.c -o led_test.o 

                2)编译成可执行文件

                arm-cortex_a9-linux-gnueabi-ld -nostdlib -nostartfiles -Ttext=0x48000000 -e led_test led_test.o -o led

                3)编译成二进制文件

                arm-cortex_a9-linux-gnueabi-objcopy -O binary led led.bin

        6、下载代码

                1)拷贝到tftp下载目录

                cp led.bin /tftpboot

                2)下位机下载代码

                tftp 0x48000000 led.bin

                1)下位机执行代码

                go 0x48000000

 四、任务

        1、流水灯

        2、蜂鸣器

        3、按键

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库 变更和版本控制管理工具 --Bytebase 安装部署

数据库 变更和版本控制管理工具 --Bytebase 安装部署 文章目录 数据库 变更和版本控制管理工具 --Bytebase 安装部署前言一.Docker部署Bytebase1.Docker 配置2. pull 数据3. 执行部署4. 打开浏览器 部署完成 二、使用步骤1.注册超管2.配置 Configure External URL 总结 前言 B…

点餐收银小程序

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《点餐收银小程序》。 系统含管理员/商家/用户三种角色&#xff0c;商家能维护菜式类别、维护菜品信息&#xff0c;用户在小程序能够选择门店&#xff0c;查看门店下各个分类的菜式信息&#xff0c;并进行加购…

【vSphere 7/8】深入浅出 vSphere 证书 Ⅲ—— vSphere 证书的更新和替换概述

目录 摘要1. vSphere Certificate Architecture2. 证书更新和替换概述2.1更新 VMCA 签名的证书&#xff08;1&#xff09;使用 vSphere Client UI&#xff08;2&#xff09;使用 vSphere Certificate Manager 命令行工具&#xff08;自动&#xff09;&#xff08;3&#xff09;…

行业大模型元年,“有云处皆智能”的愿景还有多远?

打造新质生产力、推动高质量发展&#xff0c;已成为众多行业用户在数字经济时代的一道必答题。 今年《政府工作报告》就提出要深化大数据、人工智能等研发应用&#xff0c;开展“人工智能”行动&#xff0c;大力推进现代化产业体系建设&#xff0c;加快发展新质生产力。这其中…

IBM是中国IT界的黄埔军校

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 我第一次听说IBM还是小的时候&#xff0c;当时很多人都说IBM是厉害&#xff0c;外号“蓝色巨人”&#xff0c;潜移默化我也知道IBM牛了。 而且当年我买的第一款笔记本电脑就是IBM的ThinkPad系列&#xff0c;花了6…

Python酷库之旅-第三方库Pandas(112)

目录 一、用法精讲 491、pandas.DataFrame.cumsum方法 491-1、语法 491-2、参数 491-3、功能 491-4、返回值 491-5、说明 491-6、用法 491-6-1、数据准备 491-6-2、代码示例 491-6-3、结果输出 492、pandas.DataFrame.describe方法 492-1、语法 492-2、参数 492…

中国书法艺术孙溟㠭浅析《平复帖》

中国书法艺术孙溟㠭浅析《平复帖》 《平复帖》是西晋文学家、书法家陆机创作的书法作品&#xff0c;纵23.8厘米、横20.5厘米&#xff0c;共九行、八十四字&#xff0c;是陆机写给久病未愈朋友的问候信札&#xff0c;因其中有“恐难平复”字样&#xff0c;故得“平复帖”之名。 …

【C++ 面试 - STL】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

2024最新最全:【计算机自学网站】大全,零基础入门到精通,看完这一篇就够了!

分享32个鲜为人知并且完全免费的高质量自学网站&#xff0c;每个都是堪称神器&#xff0c;让你相见恨晚。 1&#xff1a;Oeasy 是一个完全免费的综合视频教程网站&#xff0c;非常良心实用。 它提供的视频教程非常丰富并且质量很高&#xff0c;包括&#xff1a;PS 教程、手机…

通过 TS-Mixer 实现股票价格预测

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 最近遇到了 Time Mixer 模型,该模型以在复杂数据集上提供令人印象深刻的结果而闻名。出于好奇,我决定将其应用于我在 Kaggle 上找到的数据集,其中包含 Microsoft 的历史股票价格。在本文中,我…

盘点免费且靠谱的AI大模型 API,统一封装,任性调用!

现在做大模型&#xff0c;还有靠谱且免费的 API 接口吗? 靠谱的不免费&#xff0c;免费的不靠谱&#xff0c;鱼和熊掌不可兼得&#xff1f; 非也&#xff01; 对于简单的指令而言&#xff0c;绝大部分免费的 LLM API 还是能打的&#xff0c;本文就给大家介绍几款&#xff0…

22.缓存雪崩缓存击穿

定义 同一时段大量的缓存key同时失效或者redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案 1.给不同key的TTL添加随机值。 2.利用redis集群提高服务的可用性。 3.给缓存业务添加降级限流策略。 4.给业务添加多级缓存。 缓存击穿 缓…

Redis持久化方式、常见问题及解决方案

在现代电商交易系统中&#xff0c;Redis作为一种高性能的内存数据库&#xff0c;被广泛用于缓存和数据持久化。然而&#xff0c;Redis作为内存数据库&#xff0c;面临着数据持久化和数据与持久化存储如MySQL之间的一致性问题。本文将详细讲解Redis的持久化方式、常见问题及其解…

常见框架报错信息

一、报错信息&#xff08;不同类型转换&#xff09; 2024-08-28 14:57:15.450 ERROR 8272 --- [io-8080-exec-12] c.w.common.exception.RRExceptionHandler : class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer ar…

IO进程练习:请在linux 利用c语言编程实现两个线程按照顺序依次输出”ABABABAB......“

例如&#xff1a;a线程输出”A”之后b线程输出”B”&#xff0c;然后a线程输出“A”&#xff0c;再b线程输出”B”&#xff0c;之后往复循环。 【1】使用信号量实现 代码展示&#xff1a; #include <stdio.h> #include <pthread.h> #include <string.h> #inc…

Java 输入与输出之 NIO.2【AIO】【Path、Paths、Files】【walkFileTree接口】探索之【三】

在JDK 1.7 版本中对NIO进行了完善&#xff0c;推出了NIO.2&#xff0c;也称为AIO&#xff08;异步IO&#xff09;&#xff0c;在处理大量并发请求时具有优势&#xff0c;特别是在网络编程和高并发场景下&#xff0c;表现得更为出色。 对于输出流和输入流而言&#xff0c;操作的…

sipp模拟uas发送update

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 但是fs在处理update消息时候有BUG&#xff0c;为了复现问题&#xff0c;使用sipp模拟uas&#xff0c;发送update并发送DTMF码。 本文档记录sipp的配置方案。 环境 CentOS 7.9 freeswitch 1.10.7 sipp.3.6.2 问题描…

【Hexo系列】【6】NexT主题使用

本期将为大家讲解Hexo NexT主题的使用。 1. NexT介绍 NexT是Hexo的知名第三方主题&#xff0c;黑白极简风格四合一&#xff0c;有相当多的使用者&#xff0c;维护也相当给力&#xff0c;数年来一直都在频繁更新。 Next主题官网&#xff1a;https://github.com/next-theme/he…

Mysql基础练习题 584.寻找用户推荐人 (力扣)

找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 建表插入数据&#xff1a; Create table If Not Exists Customer (id int, name varchar(25), referee_id int) Truncate table Customer insert into Customer (id, name, referee_id) values (1, Will, None) insert int…

大模型技术如何重塑物流供应链

一、大模型技术与物流供应链的融合现状 在物流供应链领域&#xff0c;大模型技术正逐渐崭露头角&#xff0c;并在各个环节实现了初步渗透。在需求预测环节&#xff0c;大模型凭借其强大的数据处理和分析能力&#xff0c;能够整合多种复杂的数据源&#xff0c;如历史销售数据、…