查看: 15088|回复: 30

自己改造的6410bootloader

 火..

0

主题

0

回帖

0

积分

s200661524 发表于 2011-4-10 12:01:52 | 显示全部楼层 |阅读模式
本帖最后由 s200661524 于 2011-4-17 19:33 编辑

myuboot.tar.gz (63.84 KB, 下载次数: 166, 售价: 1 贡献) u-boot有点大,看起来比较麻烦,这几天研究了bootloader的结构,在理解了其工作流程后自己改造了u-boot,所谓改造就是把u-boot中最基本的部分拿出来做一个最简洁的bootloader,实现最基本的功能,把自己从flash加载到内存中去并跳转到内存中的主函数中去。之前在网上想搜一个类似的版本,但是没有发现,可能是高手不愿意做这个,我们有很多新手又急于构建自己的系统,而不是整天浮在什么按照手册烧linux,烧android,烧成功了也许会惊喜一阵,但是冷静下来想想却什么都没学会,只是按照手册做了一遍(这里排除想在系统上做一些高级应用的人)。其实这些天看各大论坛上的留言,发现还是有很多人喜欢裸奔的,愿意一步一步的搭起自己的台子而不是靠u-boot等一些别人写好的东西,而想在这些程序里面加入自己的东西的话,如果没看懂其流程是很困难的。这是匆匆忙忙中做出来的第一个版本,刚才说了这个坂本只是一个基本功能,你可以在主函数里面加入自己的任何程序编译好了烧到flash中,程序会自动加载到SDRAM中去并跳转到SDRAM,你也可以在里面加入bootloader其他更复杂的东西从而构建自己的bootloader。也欢迎大虾为我们这些菜鸟加一些东西。
    因为看到了初步成功,比较激动,所以也没怎么整理一下程序就发上来的,如果你看过u-boot的源码你会发现这个很熟悉,因该说跟u-boot的初始化一模一样,就是复制过来的,只是把中间很多给删了,有些宏定义没用用到,有的是没来得及删,有的是想留着以后扩展。版权申明:任何人都可以传播下载,复制,改造,完善!只是要花您1个金币,呵呵 我想下论坛的东西但是没钱了所以捞点:lol 如果反映比较好求版主置顶,以后的版本会在本帖子中会免费发放的,敬请留意!


由于论坛附件大小限制,第二个版本的bootloader不能上传,有需要的可以加我QQ136687007,一般晚上在,白天不一定上
**************************************************************************************************************
第三个本版出来了,新加入了中断的支持,关键代码是开启mmu,将0x00映射到物理内存上去,比较一下u-boot会发现只是稍微的改变了一下映射表,代码如下:
mmu_table:
        .set __base,0x57e
        // 0x00映射到0x57e00000  也就是bootloader的起始地址,这样发生中断就可以跳转到中断向量表。
        .rept 0x02
        FL_SECTION_ENTRY __base,3,0,0,0
        .set __base,__base+1
        .endr

        .set __base,2
        // 1:1 mapping for debugging
        .rept 0xA00-0x02
        FL_SECTION_ENTRY __base,3,0,0,0
        .set __base,__base+1
        .endr

        // access is not allowed.
        .rept 0xC00 - 0xA00
        .word 0x00000000
        .endr

        // 128MB for SDRAM 0xC0000000 -> 0x50000000
        .set __base, 0x500
        .rept 0xC80 - 0xC00
        FL_SECTION_ENTRY __base,3,0,1,1
        .set __base,__base+1
        .endr

        // access is not allowed.
        .rept 0x1000 - 0xc80
        .word 0x00000000
        .endr
借鉴lpc的vic中断编程,写了一个统一的中断函数接口
int install_irq(unsigned char channel,unsigned char num,void (*pFunction)(),unsigned priority);
参数依次是VIC通道号(0或者1),中断通道号(0-31),中断处理函数句柄,中断优先级。

****************************************************************************************************************************
    第四个版本出来了,移植上ucos烧到flash完美启动,有图有真相 1.png
用arm-linux-gcc编译的,本来想找个gcc下移植的例子,无奈搜了很久都没找到,大部分都是在ads下做的移植(如果有人说都一样,自己随便找个例子做一下就知道区别在哪儿)而且用上了6410的向量中断功能,最开始的时候就想到要用上这个功能从而减少中断延迟时间,但是网上基本都是基于2410或者2440的没有向量中断控制器,lpc系列的有,但是看别人移植的时候说这个功能对移植ucos来说没什么用只说,所以他还是在统一的中断函数中查询是不是时钟中断。我就想试试这样到底能不能成功,毕竟不用软件查询中断肯定要快一点点。初步成功了,现在遇到的问题是时钟频率不能太快,否则就直接死机了,现在稳定的切换速度是30次/秒,而且这个现象没有规律,好像是随机发生一样,还在找原因,初步判断可能是在任务切换的时候发生了时钟中断。但是发生任务切换的时候中断因该是关着的,也许是中间那个指令用得不好,不过现在是能正确的进行任务切换,证明整体框架因该没有错的。明天继续找原因,今天调试了一天有点累。
回复

使用道具 举报

5

主题

13

回帖

8

积分

jnq123 发表于 2011-4-10 12:09:38 | 显示全部楼层
看来我是第一个,严重的顶起来!

0

主题

0

回帖

0

积分

楼主| s200661524 发表于 2011-4-10 12:10:17 | 显示全部楼层
回复 2# jnq123
呵呵!
cc0235 该用户已被删除
cc0235 发表于 2011-4-10 13:26:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

0

主题

0

回帖

0

积分

楼主| s200661524 发表于 2011-4-10 14:22:21 | 显示全部楼层
回复 4# cc0235
不好意思,linux下的拿出来好像除了点问题,我再传一个上去

0

主题

0

回帖

0

积分

楼主| s200661524 发表于 2011-4-10 14:31:37 | 显示全部楼层
刚才已经下载好的朋友对不住了,在里面里面拿出来的除了点问题汇编程序没有。现在又上传了一个 保证可以用
cc0235 该用户已被删除
cc0235 发表于 2011-4-10 16:45:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
glorin 该用户已被删除
glorin 发表于 2011-4-12 10:51:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

0

主题

0

回帖

0

积分

楼主| s200661524 发表于 2011-4-12 17:17:46 | 显示全部楼层
回复 1# s200661524

1.png
    mybootloader又进一步了,可以接受用户输入,昨天一直卡在printf函数和scanf函数上,gcc4.3.2的库中好像没有,我在stdio头文件中看到了snprintf函数,但是在写printf的时候调用编译提示这个函数未定义。在网上看了一大堆文章决定自己写一个printf函数,在参考了网上一份2440程序的基础中终于弄出来了,大虾不要激动,对于菜鸟来说很有成就感,但是就像网上说的这个库放进程序中一下就把整个程序搞大了,本来就一个简单的接受用户输入输出的函数编译完成后17K,注意编译的时候没开优化,怕出问题。烧到fash上完美启动,有图有真相,源程序整理了后传上来:lol

0

主题

0

回帖

0

积分

楼主| s200661524 发表于 2011-4-12 17:19:50 | 显示全部楼层
回复 8# glorin
谢谢支持,第一份中有个小bug,当时有点激动没改过来,这次一并改了等会整理后上传。
您需要登录后才可以回帖 登录 | 注册

本版积分规则