自己改造的6410bootloader
本帖最后由 s200661524 于 2011-4-17 19:33 编辑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完美启动,有图有真相
用arm-linux-gcc编译的,本来想找个gcc下移植的例子,无奈搜了很久都没找到,大部分都是在ads下做的移植(如果有人说都一样,自己随便找个例子做一下就知道区别在哪儿)而且用上了6410的向量中断功能,最开始的时候就想到要用上这个功能从而减少中断延迟时间,但是网上基本都是基于2410或者2440的没有向量中断控制器,lpc系列的有,但是看别人移植的时候说这个功能对移植ucos来说没什么用只说,所以他还是在统一的中断函数中查询是不是时钟中断。我就想试试这样到底能不能成功,毕竟不用软件查询中断肯定要快一点点。初步成功了,现在遇到的问题是时钟频率不能太快,否则就直接死机了,现在稳定的切换速度是30次/秒,而且这个现象没有规律,好像是随机发生一样,还在找原因,初步判断可能是在任务切换的时候发生了时钟中断。但是发生任务切换的时候中断因该是关着的,也许是中间那个指令用得不好,不过现在是能正确的进行任务切换,证明整体框架因该没有错的。明天继续找原因,今天调试了一天有点累。 看来我是第一个,严重的顶起来! 回复 2# jnq123
呵呵! 回复 4# cc0235
不好意思,linux下的拿出来好像除了点问题,我再传一个上去 刚才已经下载好的朋友对不住了,在里面里面拿出来的除了点问题汇编程序没有。现在又上传了一个 保证可以用 回复 1# s200661524
mybootloader又进一步了,可以接受用户输入,昨天一直卡在printf函数和scanf函数上,gcc4.3.2的库中好像没有,我在stdio头文件中看到了snprintf函数,但是在写printf的时候调用编译提示这个函数未定义。在网上看了一大堆文章决定自己写一个printf函数,在参考了网上一份2440程序的基础中终于弄出来了,大虾不要激动,对于菜鸟来说很有成就感,但是就像网上说的这个库放进程序中一下就把整个程序搞大了,本来就一个简单的接受用户输入输出的函数编译完成后17K,注意编译的时候没开优化,怕出问题。烧到fash上完美启动,有图有真相,源程序整理了后传上来:lol 回复 8# glorin
谢谢支持,第一份中有个小bug,当时有点激动没改过来,这次一并改了等会整理后上传。 楼主,有钻研精神,赞一个
页:
[1]
2