U-boot(七):U-boot移植

news2025/2/22 4:15:54

        本文主要探讨基于210官方U-boot源码移植。

移植基础

tar -jxvf android_uboot_smdkv210.tar.bz2

cd u-boot-samsung-dev

rm -rf onenand_ipl onenand_bl1 lib_avr32 lib_blackfin lib_i386 lib_m68k lib_mips lib_microblaze lib_nios lib_nios2 lib_ppc lib_sh lib_sparc

cd board

ls|grep  -v 'samsung'|xargs -I {}  rm -rf {}

cd samsung

ls|grep smdk|grep -v '110'|xargs -I {}  rm -rf {}

cd u-boot-samsung-dev/cpu

ls |grep -v 's5pc11x'|xargs -I {}  rm -rf {}

cd ../include

rm -rf asm-avr32、asm-blackfin、asm-i386、asm-m68k、asm-sh、asm-microblaze、asm-mips、asm-nios、asm-nios2、asm-ppc、asm-sparc

cd asm-arm 

ls|grep 'arch-'|grep -v 's5pc11x'|xargs -I {}  rm -rf {}


cd include/configs

ls |grep -v 'smdkv210'|xargs -I {}  rm -rf {}

cd u-boot-samsung-dev

vim mk

#!/bin/sh

make distclean

make smdkv210single_config

make -j4

chmod +x mk


vim Makfile

CROSS_COMPILE = /root/arm-2009q3/bin/arm-none-linux-gnueabi-

make smdkv210single_config ==>  include/configs/smdkv210single.h

./mk

        uboot移植异常,供电锁存正常,串口异常,分析low_level_init.S得到210的uboot无使用PMIC,注释PMIC初始化,编译移植

/* init PMIC chip */
//not use PMIC in 210 uboot
//bl PMIC_InitIp

编译移植结果:

修改行提示符(smdkv210single.h)

//#define CFG_PROMPT              "SMDKV210 # "   /* Monitor Command Prompt       */
#define CFG_PROMPT              "root # "   /* Monitor Command Prompt       */

修改uboot串口(默认串口2,无需修改,smdkv210single.h)

#define CONFIG_SERIAL3          1       /* we use UART2 on SMDKC110 */

        s5pv110.h依据smdkv210single.h中的串口宏开关,定义出串口2配置寄存器基地址,再依据偏移地址定义初始化串口配置

#if defined(CONFIG_SERIAL1)
#define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART0_OFFSET)
#elif defined(CONFIG_SERIAL2)
#define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART1_OFFSET)
#elif defined(CONFIG_SERIAL3)
#define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART2_OFFSET)
#elif defined(CONFIG_SERIAL4)
#define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART3_OFFSET)
#else
#define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART0_OFFSET)
#endif

 修改默认网络配置(smdkv210single.h)

/*#define CONFIG_BOOTARGS       "root=ramfs devfs=mount console=ttySA0,9600" */
#define CONFIG_ETHADDR          00:40:5c:26:0a:5b
#define CONFIG_NETMASK          255.255.255.0
#define CONFIG_IPADDR           192.168.100.27
#define CONFIG_SERVERIP         192.168.100.100
#define CONFIG_GATEWAYIP        192.168.100.1

        iNand已有环境变量则需清除,重启后才会首先使用代码中的环境变量
        

uboot:

mmc write 0 30000000 11# 32

        将DDR的0x30000000开头一段内存内容写入iNand的17扇区开始的32个扇区内(写入长度16KB)

DDR移植


        DDR时钟

                lowlevel_init.S中system_clock_init函数依据smdkv210single.h的宏开关对所有时钟做初始化(包含DDR,DDR时钟宏开关)

smdkv210single.h


/*-----------------------------------------------------------------------
 * Stack sizes
 *
 * The stack sizes are set up in start.S using the settings below
 */
#define CONFIG_STACKSIZE    0x40000        /* regular stack 256KB */
#ifdef CONFIG_USE_IRQ
#define CONFIG_STACKSIZE_IRQ    (4*1024)    /* IRQ stack */
#define CONFIG_STACKSIZE_FIQ    (4*1024)    /* FIQ stack */
#endif

//#define CONFIG_CLK_667_166_166_133
//#define CONFIG_CLK_533_133_100_100
//#define CONFIG_CLK_800_200_166_133
//#define CONFIG_CLK_800_100_166_133
#define CONFIG_CLK_1000_200_166_133
//#define CONFIG_CLK_400_200_166_133
//#define CONFIG_CLK_400_100_166_133


        DDR配置

DRAM:     1 GB

DRAM bank   = 0x00000000
-> start    = 0x20000000
-> size     = 0x20000000
DRAM bank   = 0x00000001
-> start    = 0x40000000
-> size     = 0x20000000


DRAM大小和DRAM bank 0/1 的起始地址和大小有误,修改显示为:

DRAM:     512MB

DRAM bank   = 0x00000000
-> start    = 0x30000000
-> size     = 0x10000000
DRAM bank   = 0x00000001
-> start    = 0x40000000
-> size     = 0x10000000


                修改DMC起始地址和大小(smdkv210single.h)

#define MEMORY_BASE_ADDRESS     0x30000000
#define CONFIG_NR_DRAM_BANKS    2          /* we have 2 bank of DRAM */
//#define SDRAM_BANK_SIZE       0x20000000    /* 512 MB */
#define SDRAM_BANK_SIZE         0x10000000    /* 256 MB */
#define PHYS_SDRAM_1            MEMORY_BASE_ADDRESS /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE       SDRAM_BANK_SIZE
//#define PHYS_SDRAM_2          (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */
#define PHYS_SDRAM_2            0x40000000 /* SDRAM Bank #2 */
#define PHYS_SDRAM_2_SIZE       SDRAM_BANK_SIZE

                        DMC0的起始地址修改需修改寄存器配置

#if defined(CONFIG_MCP_SINGLE)

//#define DMC0_MEMCONFIG_0      0x20E01323      // MemConfig0   256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
#define DMC0_MEMCONFIG_0        0x30F01323      // MemConfig0   256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
#define DMC0_MEMCONFIG_1        0x40F01323      // MemConfig1
#define DMC0_TIMINGA_REF        0x00000618      // TimingAref   7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4E)
#define DMC0_TIMING_ROW         0x28233287      // TimingRow    for @200MHz
#define DMC0_TIMING_DATA        0x23240304      // TimingData   CL=3
#define DMC0_TIMING_PWR         0x09C80232      // TimingPower

#define DMC1_MEMCONTROL         0x00202400      // MemControl   BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off
#define DMC1_MEMCONFIG_0        0x40C01323      // MemConfig0   512MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
#define DMC1_MEMCONFIG_1        0x00E01323      // MemConfig1
#define DMC1_TIMINGA_REF        0x00000618      // TimingAref   7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4
#define DMC1_TIMING_ROW         0x28233289      // TimingRow    for @200MHz
#define DMC1_TIMING_DATA        0x23240304      // TimingData   CL=3
#define DMC1_TIMING_PWR         0x08280232      // TimingPower


        修改MMU内存映射

                210的uboot做了MMU映射,故修改完DMC0的起始地址需要修改它对应的地址映射

修改(start.S): 
        //.set __base,0x200
        .set __base,0x300
        // 256MB for SDRAM with cacheable


依据(start.S):


/* Set the TTB register */
    ldr    r0, _mmu_table_base
    ldr    r1, =CFG_PHY_UBOOT_BASE
    ldr    r2, =0xfff00000
    bic    r0, r0, r2
    orr    r1, r0, r1
    mcr    p15, 0, r1, c2, c0, 0
修改(smdkc110.c):

#ifdef CONFIG_MCP_SINGLE
ulong virt_to_phy_smdkc110(ulong addr)
{
        if ((0xc0000000 <= addr) && (addr < 0xd0000000))
                //return (addr - 0xc0000000 + 0x20000000);
                return (addr - 0xc0000000 + 0x30000000);
        else
                printf("The input address don't need "\
                        "a virtual-to-physical translation : %08lx\n", addr);

        return addr;
}
#else
ulong virt_to_phy_smdkc110(ulong addr)
{
        if ((0xc0000000 <= addr) && (addr < 0xd0000000))
                return (addr - 0xc0000000 + 0x30000000);
        else if ((0x30000000 <= addr) && (addr < 0x50000000))
                return addr;
        else
                printf("The input address don't need "\
                        "a virtual-to-physical translation : %08lx\n", addr);

        return addr;
}
#endif




依据(smdkv210single.h):


    #define CONFIG_ENABLE_MMU

    #ifdef CONFIG_ENABLE_MMU
    #define virt_to_phys(x)    virt_to_phy_smdkc110(x)
    #else
    #define virt_to_phys(x)    (x)
    #endif

        其他异常

SD/MMC:  unrecognised EXT_CSD structure version 7
unrecognised EXT_CSD structure version 7
Card init fail!

修改SD/MMC的大小,显示为

SD/MMC:  3776MB


                该异常是由于mmc驱动代码不支持该版本号的inand,修改mmc.c中对SD/mmc版本号的判别(inand为高版本sd卡)

  ext_csd_struct = ext_csd[EXT_CSD_REV];
        //if (ext_csd_struct > 5) {
        if (ext_csd_struct > 8) {
                printf("unrecognised EXT_CSD structure "
                        "version %d\n", ext_csd_struct);
                err = -1;
                goto out;
        }

网卡驱动移植

        DM9000基础

        SoC的SROM bank和网卡芯片的CS引脚连接,主机SoC访问SROM bank地址来访问网卡芯片内部寄存器
        网卡芯片内部寄存器使用相对地址访问,从00开始网卡芯片寄存器地址:SROM bank起始地址+网卡芯片内部寄存器相对地址
        主机SoC访问网卡芯片是总线式访问(IO与内存统一编址),无内置网卡控制器而Nand/SD接口需要时序来访问
        210的SROM控制器是8/16bit接口,实际使用16位接口,网线有8根,4根都是GND,发送2根(Tx-,Tx+),接收2根(Rx+,Rx-)
        网卡芯片CS引脚(片选信号),210每个SROM bank对应选信号CSn(n=0-5),210的DM9000接在CSn1(SROM bank1),DM9000总线地址基地址是0x88000000
        DM9000的CMD引脚接210的ADDR2引脚,数据线和地址线复用,CMD为高电平传输DATA,低电平传输INDEX(偏移地址)
        socket接口和网络mingling(ping,tftp...)是对网卡驱动的封装实现的

         DM9000移植(/drivers/net/dm9000x.c,dm9000x.h)

        网卡硬件配置

        网卡基地址:SROMC_BANK1(0x88000000) + 0x300(网卡芯片内部偏移(自带))

        网卡命令地址(CMD,DM9000_DATA):  网卡基地址 + 4,由于使用ADDR2(0b100)

/*
 * Hardware drivers
 */
#define DM9000_16BIT_DATA

#define CONFIG_DRIVER_DM9000    1

#ifdef CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE              (0x88000300)
#define DM9000_IO                       (CONFIG_DM9000_BASE)
#if defined(DM9000_16BIT_DATA)
#define DM9000_DATA                     (CONFIG_DM9000_BASE+4)
#else
#define DM9000_DATA                     (CONFIG_DM9000_BASE+1)
#endif
#endif

                网卡初始化在uboot二阶段init_sequences中进行网卡芯片初始化(board_init->dm9000_pre_init,软件初始化)

                设置CSn1(16位数据线,DATA线和SD线号对应:1)

                设置SROM_BC1 

                设置GPIO 

 

/*
 * Miscellaneous platform dependent initialisations
 */

static void dm9000_pre_init(void)
{
        unsigned int tmp;

#if defined(DM9000_16BIT_DATA)
        //SROM_BW_REG &= ~(0xf << 20);
        //SROM_BW_REG |= (0<<23) | (0<<22) | (0<<21) | (1<<20);
        SROM_BW_REG &= ~(0xf << 4);
        SROM_BW_REG |= (1<<7) | (1<<6) | (1<<5) | (1<<4);

#else
        SROM_BW_REG &= ~(0xf << 20);
        SROM_BW_REG |= (0<<19) | (0<<18) | (0<<16);
#endif
        //SROM_BC5_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));
        SROM_BC1_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));

        tmp = MP01CON_REG;
        tmp &=~(0xf<<20);
        tmp |=(2<<20);
        MP01CON_REG = tmp;
}
s5pv110.h

#define ELFIN_SROM_BASE                 0xE8000000

#define SROM_BW_REG                     __REG(ELFIN_SROM_BASE+0x0)

#define SROM_BC1_REG                    __REG(ELFIN_SROM_BASE+0x8)



#define ELFIN_GPIO_BASE                 0xE0200000

#define MP01CON_OFFSET                  0x2E0

#define MP01CON_REG                     __REG(ELFIN_GPIO_BASE + MP01CON_OFFSET)

重新编译,移植uboot,启动内核

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

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

相关文章

Ubuntu防止休眠和挂起(笔记)

目录 1 动机2 禁用休眠3 解除休眠 1 动机 我要将 饿啊人制作成 noah-mp 的区域运行强迫&#xff0c;但是跑的慢&#xff0c;一晚上两天。后来发现是因为电脑自动 supend 了。Ubuntu 在电源那里最多只能设置 2 小时的防止休眠&#xff0c;2小时候又自动休眠&#xff0c;严重影响…

mongodb基本操作命令

mongodb快速搭建及使用 1.mongodb安装1.1 docker安装启动mongodb 2.mongo shell常用命令2.1 插入文档2.1.1 插入单个文档2.1.2 插入多个文档2.1.3 用脚本批量插入 2.2 查询文档 前言&#xff1a;本篇默认你是对nongodb的基础概念有了了解&#xff0c;操作是非常基础的。但是与关…

Opencv手势控制音量!附源码!

效果演示&#xff1a; 废话不多说&#xff01;直接上源码&#xff01;下面写有所有代码注释&#xff01;&#xff01; import cv2 import mediapipe as mp #它包含了各种预训练的机器学习模型&#xff0c;可以用于姿势估计、手势识别等任务 from ctypes import cast, POINTE…

P8649 [蓝桥杯 2017 省 B] k 倍区间(前缀和+优化(桶分类))

分析&#xff1a; &#xff08;1&#xff09;任意连续子序列可用两个前缀和的差来表示 &#xff08;2&#xff09;判断该子序列是否为k的倍数 p1-p2 模 0 (mod k) 等价于&#xff1a;前缀和模 k 是否同余 &#xff08;3&#xff09;同余的任意两前缀和组合的序列均满足…

[React] 2023年最新面试题

[React] 2023年最新面试题 1. class 组件与函数组件的区别2. react 18 新特性有那些?新增 createRoot API自动批处理过渡更新新的Hook 3. redux 和 react-redux 的区别4. redux 中间件的原理5. setState 发生了什么 &#xff0c;render 函数做了什么6. 虚拟DOM&#xff0c; Fi…

【面试】typescript

目录 为什么用TypeScript&#xff1f; TS和JS的区别 控制类成员可见性的访问关键字&#xff1f; public protected&#xff09;&#xff0c;该类及其子类都可以访问它们。 但是该类的实例无法访问。 私有&#xff08;private&#xff09;&#xff0c;只有类的成员可以访问…

JSON.stringify方法详解 后端接受JSON数据格式

1、方法定义&#xff1a;JSON.stringify(value, replacer, space) 参数说明&#xff1a; value&#xff1a;js对象 replacer&#xff1a;替换对象&#xff0c;可以是一个方法、对象或数组&#xff0c;将value按照替换规则展示。 space&#xff1a;填充参数&#xff0c;可以是数…

LVS+Keepalived实验

实验前准备 主DR服务器&#xff1a;(ens33)192.168.188.11 ipvsadm、keepalived (ens33:0)192.168.188.188 备DR服务器&#xff1a;(ens33)192.168.188.12 ipvsadm、keepalived (ens33:0)192.168.188.188 Wbe服务器1&#xff1a;(ens33)192.168.188.13 (lo:0)192.168.188.188 W…

selenium使用记录

本文记录python环境下使用selenium的一些步骤 Step1&#xff1a;安装并配置驱动 pip install selenium # 使用pip在对应python中安装selenium包为了让selenium能调用指定的浏览器&#xff0c;需要下载对应浏览器的驱动程序&#xff08;这里以edge为例子&#xff09; #Firefo…

【Openstack Train安装】四、MariaDB/RabbitMQ 安装

本章介绍了MariaDB/RabbitMQ的安装步骤&#xff0c;MariaDB/RabbitMQ仅需要在控制节点安装。 在安装MariaDB/RabbitMQ前&#xff0c;请确保您按照以下教程进行了相关配置&#xff1a; 【Openstack Train安装】一、虚拟机创建 【Openstack Train安装】二、NTP安装 【Opensta…

改善厦门城市内涝积水问题,实时监测城市易涝积水点

近年来&#xff0c;城市内涝积水问题已成为中国许多城市面临的严峻挑战。特别是在厦门这样的海滨城市&#xff0c;由于其特殊的地理环境和气候条件&#xff0c;内涝问题尤为突出。传统的解决方法主要依赖于人工排查&#xff0c;然而&#xff0c;这种方式存在许多缺陷。 WITBEE万…

BEVFormer【人工智能】

BEVFormer 是一篇今年中稿 ECCV 2022 的论文&#xff0c;其中提出了一种纯视觉&#xff08;camera&#xff09;感知任务的算法模型&#xff0c;用于实现3D目标检测和地图分割任务。该算法通过提取环视相机&#xff08;Bird’s Eye View Camera&#xff09;采集到的图像特征&…

【产品设计】SaaS产品数据分析之指标与标签

数据分析能够应用到各个领域和岗位&#xff0c;那么在SaaS产品中的应用会是如何&#xff1f;本文将探索SaaS产品在数据分析中的应用&#xff0c;并对其指标与标签的设计进行总结分析&#xff0c;一起来看看吧。 数据分析是业务开展过程中&#xff0c;收集记录各种行为产生的数据…

vue2+element-ui npm run build打包后,在服务器打开报错

报错 页面的图标也显示不出来&#xff0c;如下 解决&#xff1a; 在build->utils.js文件里面加上publicPath: ../../&#xff0c;再打包发布一下就可以了 // Extract CSS when that option is specified// (which is the case during production build)if (options.extrac…

数据挖掘之时间序列分析

一、 概念 时间序列&#xff08;Time Series&#xff09; 时间序列是指同一统计指标的数值按其发生的时间先后顺序排列而成的数列&#xff08;是均匀时间间隔上的观测值序列&#xff09;。 时间序列分析的主要目的是根据已有的历史数据对未来进行预测。 时间序列分析主要包…

re:Invent 构建未来:云计算生成式 AI 诞生科技新局面

文章目录 前言什么是云计算云计算类型亚马逊云科技云计算最多的功能最大的客户和合作伙伴社区最安全最快的创新速度最成熟的运营专业能力 什么是生成式 AI如何使用生成式 AI后记 前言 在科技发展的滚滚浪潮中&#xff0c;我们见证了云计算的崛起和生成式 AI 的突破&#xff0c…

客服管理者如何有效管理客服团队,有哪些高效方式?

在如今的市场竞争中&#xff0c;客户服务是企业成功的关键因素之一。因此&#xff0c;客服团队的有效管理至关重要。客服管理者需要了解如何有效地管理客服团队&#xff0c;以确保客户的满意度和忠诚度&#xff0c;从而提高企业的竞争力。 以下是客服管理者如何有效管理客服团队…

【AI】Segment-Anything本地部署

Segment-Anything是Meta开源的图像分割模型&#xff0c;顾名思义&#xff0c;可以分割所有东西&#xff0c;感觉这东西可以用于遥感影像分割&#xff0c;于是找来源码测试一下。 项目地址&#xff1a;https://github.com/facebookresearch/segment-anything 1. 构建环境 首先…

论文笔记:Confidential Assets

Confidential Assets 描述了一种称为“保密交易”的方案&#xff0c;该方案模糊了所有UTXO的金额&#xff0c;同时保持了不创建或销毁硬币的公共可验证性。进一步将此方案扩展到“保密资产”&#xff0c;一种单一的基于区块链的分类帐可以跟踪多种资产类型的方案。将保密交易扩…

VSCode编译多个文件

打开tasks.json文件&#xff0c;找到"$ {file}“这一行。然后在其后面添加你想要编译的文件即可。 比如我这里是想要编译当前文件夹下的所有.cpp文件&#xff0c;那么我就直接把”$ {file}"给注释掉了&#xff0c;然后再使用通配符来代表所有.cpp文件。 最后解释以下…