OpenRisc-17-or1200移植linux

来源:互联网 发布:电脑声音剪辑软件 编辑:程序博客网 时间:2024/05/28 19:23
上节我们修改了适合自己开发板的u-boot代码,调试成功后我们就要固化我们的代码到flash上,我板子上的是nor flashu-boot上的信息是:


        这表明基本上flash是调通了,然后按照下载代码的流程将u-boot下载到SDRAM中先,然后再把SDRAMu-boot程序代码复制到flash中,其中用到几个命令,flinfoerasecpprotect······

        首先,我们将整片flash擦除干净,看看u-booterase命令如何用:


        直接地,erase all即可

        然后,我们下载u-boot主程序时的地址是0x100开始执行的,看看0x100处的代码都是什么。


        这些就是复位向量的二进制启动代码

        好,接下去

        我们要把flash芯片的写保护给去掉


        也是直接地,protect off all 即可

        再然后,就是要把在SDRAMu-boot主程序给copyflash上面了,现在回到之前一节我们修改的u-boot代码,可以把关于flash有关的选项打开了。

        首先是异常向量的relocate


        然后就是u-boot环境变量的存放位置,由之前的SDRAM换成flash


        好,妥妥的,重新编译,下载到板子的SDRAM

        然后,解除flash的写保护,protect off all

        接着,擦除flash的所有数据,erase all

        再来,看看flash的信息,flinfo,得到应该是所有的sections都没有RO标志

        再再然后,就是复制SDRAM的代码到flash上面了,用的是cp命令,这里注意一下了,由于我的板子的nor flash16bits的,所以使用cp命令的时候要以half-word的形式复制,如果flash8bits的话就要以byte的形式复制,32bitsword的形式啦。

        然后在编译u-boot的源码目录下打开u-boot.ldsSystem.mapu-boot.map


        看看u-boot是如何存放段信息的,然后编译出来的u-boot.bin


        只有186K,按照我板子的芯片来说


        8M64sections的话前4sections存放足够了,然后第5个存放环境变量,这也是在编写/include/configs/******.h自身开发板时头文件定义的环境变量位置。


        165行定义的是环境变量偏移量,170行就是用4sections存放u-boot代码。

        OK,现在就用u-bootcp命令copySDRAMflash复制代码了,u-bootcp命令如下:


        由于我的flash位宽是16bits,所以用cp.whalf-word地复制,然后是4sections,起始地址0xf0000000,结束地址0xf007ffff,范围是0x7ffff


        所以,命令是cp.w 0x0 0xf0000000 0x7ffff

        完了之后reset开发板就可以看到u-boot启动信息了。

        上次移植u-boot的后半段就码到这里了。休息一会,晚上把在u-boot起来之后将我download linux image的步骤贴上来。

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

        -----------------------------------------------割割割-----------------------------------------------

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

       好,固化好u-boot之后就可以移植linux,直接在社区选一个linux的源码包下载下来,我之前一直用的都3.1版本的,实在linux3.0时代开始后更新得太快了。

       但是也是由于更新得快,在3.1版本惊奇地发现linux支持openrisc架构的CPU了,也就是支持开源开到底了~

        http://git.openrisc.net/cgit.cgi/jonas/linux/refs/tags

       下载好后扔进虚拟机里面解压好


        然后又要稍微改改代码了~

        openrisc-3.1\arch\openrisc\boot\dts


        打开吧,文件名字就懒得修改了

        这个是or1200平台相关的device-tree文件,具体在附件上传宋宝华老师对device-tree文件的详细解释的一篇blog


        第8行,uart波特率,u-boot设置成什么这里就设什么吧,要不等u-boot启动完转到linux启动时波特率改了又得改串口工具的波特率,来回切换麻烦,而且关键我板子跑不了更高的速度了~


        12行,我在wishboneSDRAM的地址是0,这里@0

        14行,因为我的SDRAM容量是128M,所以这里reg后面的值为0x1000000,对于自己板子RAM的容量要设置好,不然在linux启动内存检测的时候会爆掉


         23行,CPU运行频率,在synthesize时的PLLDLL的频率是多少就设置多少,我这里是40M


        38行,wishboneUART的地址是0x90000000,所以这里@90000000

        对应40行,UART16550用到的地址范围是0x90000000~0x91000000,具体这个device-tree文件如何去写在后面宋老师的blog中慢慢细读吧。

        41行,UART使用的中断号,在rtl文件or1200_soc_defines.v中定义的


        中断号,我UART使用的是2号中断。

        42行,UART的频率,我的是40M


        再下面的就是opencores社区ethmac_latest.tar.gz的描述,如果用的是这个ipcores来驱动网卡phy芯片的话,这里修改成自己socwishbone总线地址和ethernet使用中断号即可。


        再往下的在移植linux的时候先屏蔽掉,是gpio controlleri2c controller的描述,等成功移植好linux再回过头在soc上加入其它外设控制器,再把device-tree丰富起来~

        Device-tree简单地就修改到这里了~

        然后就轮到目录openrisc-3.1\arch\openrisc\mm


        Open 之,


         84行加入EXPORT_SYMBOL宏,要不在后面写驱动的时候加载模块会提示找不到__ioremap()函数。

        往下点


        111行,这里也加

        OK

        继续,目录\openrisc-3.1\arch\openrisc\support\initramfs\etc\init.d下的rcS文件,修改这个脚本文件


        在最后加上,为了查看自己编写的驱动模块信息时不报错,修改到此

        惯例,先在or1ksim上试试启动linux,在镜像的桌面Get_start.txt中有在or1ksim上仿真的流程。


        直接copy入终端一步步完成就OK啦,顺利就可以直接看到linuxbooting messages

        好了,or1ksim的仿真就不贴图了,然后回到我们修改过的linux源码目录来,打开terminal~


        cd进内核目录后先自行看看内核配置:make menuconfig ARCH=openrisc CROSS_COMPILE=or32-linux-


        这些都是linux3.1版本关于openrisc架构的内核配置,熟悉内核配置的话可以自己配置了,反正我是不怎么熟,要用到的时候还要去google选项的意义。

        其实现在可以什么都不动,后面添加别的外设控制器的时候再去配内核选项,然后exit


        退出来就可以直接make


        最后会生成vmlinux.bin文件,

        然后,去看看社区有关制作u-boot镜像的教程http://opencores.org/or1k/U-Boot

        然后就是用这个vmlinux.bin制作成u-boot识别的镜像。

        首先,在编译过的u-boot目录u-boot-XX.XX\tools中看能否找到mkimage这个文件


        然后打开terminal中,将这个mkimage复制到/usr/bin


        测试mkimage


        一切正常!!!!!!

       

        然后在镜像出输入相关的命令

        mkimage -A or1k -O linux -T kernel -C none -a 0x0 -e 0x100 -n 'Linux for OpenRISC' -d vmlinux.bin uImage


        这样就可以利用u-bootdownload并启动linux镜像了。

        现在把制作好的u-boot镜像uImage单独拉出来放着。

        然后在windows用一个叫做tftp32的程序来提供tftp网络服务器


        设置好本机IPuImage路径,


        接下来就在u-boot上输出命令来loaduImage


        然后输出bootm,可以看到启动信息





        至此,基本上kernel是通的了。

    http://blog.csdn.net/21cnbao 宋宝华老师的blog,里面有介绍device-tree由来和如何分析和编写dts文件的详细说明,推荐看看~


        由于现在我的水平问题,理论基础不足的关系,还没得涉及到linux kernel方面的东西,所以现在也在继续恶补当中,想法是先从学习怎么去写设备驱动,然后回去再学习kernel

        然后在下一次我们回过头在SOC上添加gpio模块去,然后绑到板子上的LED灯去写第一个的GPIO字符驱动程序吧~

        Blog写到这里差不多追上我现在学习到的东西了,所以还是要勉励自己多花时间去学~

        介绍一下我现在在看的教材吧~

        《Linux设备驱动开发详解第2版》宋宝华,宋老师现在在编写第三版了,书出来的时候必须去买了~

        《Linux设备驱动程序第三版》,传说中的LDD3,啃吧······

        《The_C_Programming_Language》,不断重复地看,加深C应用能力······

        《C Primer Plus》,巨厚巨经典的一本书,不解释,啃······

        《操作系统精髓与设计原理第5版》,补充地看操作系统概念······

        ······CSDN上各位大神的blog······

        希望大家还有更好的建议和好书推荐推荐~

        如果到这里想回过头去研究or1200内部架构和数据流是怎样走的话可以参考kobe大神写的《openrisc那些事儿》系列博客,有空我也把kobe大神的博客上传上来~

        在这里也介绍一下最近接触到的国内一位牛人txj写的开源操作系统RAW-OS,现在是0.99X版本了,什么时候公布1.0版本就不得而知了,最近一段时间都在做推广和培训的工作,以后如果有能力的话或者大家有能力的写一个or1200的移植版本,开源到底,也当时学习学习的过程咯,也希望多多交流心得~

       好,今天到此为止了~今天周四,火影更新了~追动漫去~羡慕