码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • x210项目重新回顾之八自己写启动代码


    这是对朱老师x210裸机课程补充:
    视频链接:朱老师x210课程补充--拷贝bootload从SD卡到ddr_哔哩哔哩_bilibili
    
    1.前半部分为代码重定位到内存
    代码在news5pv210/noOS/sdram_relocate at master · jimingkang/news5pv210 · GitHub
    注意:
    A) 链接地址0x20000000
    B)代码重定位到20000000:
             adr r0, _start
             ldr r1, =_start         
            ldr r2, =bss_start      
            cmp r0, r1                     
            beq clean_bss                                                                                                       
    copy_loop:
            ldr r3, [r0], #4    
            str r3, [r1], #4       
            cmp r1, r2                      
            bne copy_loop
       
    clean_bss:
            ldr r0, =bss_start
            ldr r1, =bss_end
            cmp r0, r1                              
            beq run_on_dram                 
            mov r2, #0
    clear_loop:
            str r2, [r0], #4                
            cmp r0, r1                              
            bne clear_loop
    C)跳转:
    	mov lr,pc
           ldr pc, =main
    	mov lr,pc
           ldr pc, =buzzer_on
    
    
    2.后半部分为拷贝mynoos.bin从SD卡到ddr(没用分散加载,而是模拟uboot方式)
    代码在news5pv210/noOS/ddrinandmmc at master · jimingkang/news5pv210 · GitHub
    注意:
    A) 链接地址0x20000000
    C)sd_relocate.c中 SD_BLOCK_CNT=50(因为我的mynoos.bin大于16k,32块)
    #define SD_START_BLOCK 	45
    #define SD_BLOCK_CNT	50
    
    #define DDR_START_ADDR	0x20000000
    typedef unsigned int bool;
    // 通道号:0,或者2
    // 开始扇区号:45
    // 读取扇区个数:32
    // 读取后放入内存地址:0x23E00000
    // with_init:0
    typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);
    typedef void (*pBL2Type)(void);
    // 从SD卡第45扇区开始,复制32个扇区内容到DDR的0x23E00000,然后跳转到23E00000去执行
    void copy_bl2_2_ddr(void)
    {
    	// 第一步,读取SD卡扇区到DDR中
    
    	pCopySDMMC2Mem p1 = (pCopySDMMC2Mem)(*(unsigned int *)0xD0037F98);
    	p1(2, SD_START_BLOCK, SD_BLOCK_CNT, (unsigned int *)DDR_START_ADDR, 0);		// 读取SD卡到DDR中
    	// 第二步,跳转到DDR中的BL2去执行
    	//pBL2Type p2 = (pBL2Type)DDR_START_ADDR;
    	//p2();
    	 //main();
    }
    D)writesd中:210.bin由mynoos.bin经mk210制作而来,内容一样
    #!/bin/sh
    sudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1
    sudo dd iflag=dsync oflag=dsync if=mynoos.bin of=/dev/sdb seek=45
    E)也可以用sd_fusing.sh 烧写,但是bl2开始块必须和sd_relocate.c中SD_START_BLOCK一致
    
    F)必须用sd拨码启动,而不是用go d0020010启动
    G)go d0020010只能适用于手动代码重定位(见第一部分),不能适用sd到ddr拷贝方式;sd到ddr拷贝方式也不能结合手动代码重定位。二者只能其一。
    
  • 相关阅读:
    代理和多级代理
    最新ChatGPT程序源码+AI系统+详细图文部署教程/支持GPT4.0/支持Midjourney绘画/Prompt知识库
    Flutter笔记:聊一聊依赖注入(上)
    ATF源码篇(一):起始
    2-1、IOC思想以及实现
    CIFAR-10 数据集简介
    如何简单上手清华AutoGPT并搭建到本地环境
    10.docker exec -it /bin/bash报错解决、sh与bash区别
    [.NET学习] EFCore学习之旅 -3 一些其他的迁移命令
    GAN实现mnist生成
  • 原文地址:https://blog.csdn.net/conjimmy/article/details/126067042
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号