EDA365电子论坛网

标题: linux学习之路_or1200移植linux(续) [打印本页]

作者: mutougeda    时间: 2021-7-16 10:13
标题: linux学习之路_or1200移植linux(续)
' }/ i# @. g2 [* M
好,固化好u-boot之后就可以移植linux,直接在社区选一个linux的源码包下载下来,我之前一直用的都3.1版本的,实在linux在3.0时代开始后更新得太快了。- q# T; u1 B$ h" `# l" y
& y1 Z4 X0 g1 Y: j1 V1 H; w% j
       但是也是由于更新得快,在3.1版本惊奇地发现linux支持openrisc架构的CPU了,也就是支持开源开到底了~
9 Q# ~1 O" ~% V8 C  J2 ]; n
( e4 ]6 a$ v9 N       下载好后扔进虚拟机里面解压好5 C- i! i; A; s: t5 G
# F2 v7 |1 m# P1 |1 h

7 J$ j4 k  s4 o# f" Z6 F( {8 o5 Q( V; e% c1 `2 y7 S' r
        然后又要稍微改改代码了~
; y; Y" _( a3 _  |' [2 z$ n, N9 A/ ]( g) |
        openrisc-3.1\arch\openrisc\boot\dts1 N6 J( v! q) K: W6 d: y

% i# B" _3 k/ j, C1 q! ` 9 s: s! X1 V! n# v( ~  d+ J

- a- ]8 s: M) A0 o. M9 _6 i3 i        打开吧,文件名字就懒得修改了9 W1 K1 D. k* \, s6 F) D

! w: z" {! W8 w/ ?3 m        这个是or1200平台相关的device-tree文件,具体在附件上传宋宝华老师对device-tree文件的详细解释的一篇blog- x0 M5 L! t# A8 t# i, y

8 E/ M8 j6 o5 }; d. D0 |, I" c 0 Q. `3 R! J1 U

, V1 t, m. b' _' ]2 D        第8行,uart波特率,u-boot设置成什么这里就设什么吧,要不等u-boot启动完转到linux启动时波特率改了又得改串口工具的波特率,来回切换麻烦,而且关键我板子跑不了更高的速度了~" ?; p8 P& b5 y- {) `" |

1 l+ {  y: t/ l7 d8 P1 J! z( j
4 O* U1 |6 z5 [1 C6 ?/ ?9 T/ H3 d/ F7 n, O4 N5 z6 j% i- ?2 w

/ ?+ D5 }( Z) F  J. f6 v$ U        12行,我在wishbone上SDRAM的地址是0,这里@0
4 k7 g) W" B8 Q' |
, }" r# ^2 s9 E        14行,因为我的SDRAM容量是128M,所以这里reg后面的值为0x1000000,对于自己板子RAM的容量要设置好,不然在linux启动内存检测的时候会爆掉
( m2 |. g, u/ z( G, E* B. t" d* O& U; ?! i6 e: {/ v* A! Y% m7 V

4 b+ Q9 b$ K) i$ T3 X8 z
7 U8 w0 N& `( }9 y: U6 i         23行,CPU运行频率,在synthesize时的PLL或DLL的频率是多少就设置多少,我这里是40M
% M9 H+ d, V; ^% G- |+ ^; l  I3 b! F/ _) @0 y# @( o% p" }/ B

3 O& M$ U5 i7 A; b
! v% g/ K8 l. Y% \6 J. @" l        38行,wishbone上UART的地址是0x90000000,所以这里@90000000
8 z: ^; }- B. T7 ]2 H' ?" a
/ ~0 j+ |/ N: v  I# S5 |        对应40行,UART16550用到的地址范围是0x90000000~0x91000000,具体这个device-tree文件如何去写在后面宋老师的blog中慢慢细读吧。
3 M5 L0 b) s2 ]% a
# p! l; R3 K& E        41行,UART使用的中断号,在rtl文件or1200_soc_defines.v中定义的
$ b% ]; q$ e: `6 G7 I" J
0 }, w% l% k1 @- W
: Z. b5 }% p( x8 ~6 `: C" x: ^5 Y: C$ H  i
        中断号,我UART使用的是2号中断。
" ]5 B- o% S, W, H/ q0 F/ ]3 Q! N/ p
        42行,UART的频率,我的是40M. X# O4 M  M/ P; Q3 ?

6 X. B  I6 j) n$ F# F& } / N7 b" S- }4 v1 [

$ Y/ g# J  V! M6 r5 U: R- P# ^        再下面的就是opencores社区ethmac_latest.tar.gz的描述,如果用的是这个ipcores来驱动网卡phy芯片的话,这里修改成自己soc中wishbone总线地址和ethernet使用中断号即可。. g( h( Z* S; h. d* h
8 v: P+ |" M/ G7 }5 [) N* o

/ R' }. |1 T6 o) z7 T
1 e: C! v- ^- ~8 w        再往下的在移植linux的时候先屏蔽掉,是gpio controller和i2c controller的描述,等成功移植好linux再回过头在soc上加入其它外设控制器,再把device-tree丰富起来~
% q7 q: r" Z+ X0 s% Z3 m4 {% @' Z7 t: a: a. x) C9 a3 u
        Device-tree简单地就修改到这里了~( g- t/ M/ P6 I
; M& l+ d5 I7 ^: Z1 ?0 S& y
        然后就轮到目录openrisc-3.1\arch\openrisc\mm下
! \- T  Y: r: h: b1 Q! ~
" {: ?) e: ]& G  w% Y
4 b, ~; f7 s9 E$ N/ y0 {* n3 g" S1 S; V9 M) n( x* I
        Open 之,
- f8 T8 g* ~" v" w+ U3 |8 O# O) c+ W# C2 T9 K& \9 v& a
8 H' l4 p' L9 V3 _9 V0 l
  i7 ?* a+ q4 e
         84行加入EXPORT_SYMBOL宏,要不在后面写驱动的时候加载模块会提示找不到__ioremap()函数。) G5 W1 y- H/ H
' X  U/ q% o6 R) G0 U7 A4 [
        往下点
( E! a+ k4 r; v2 ?6 @: u3 I) [- Q2 f% R( \' h

  c2 k, X; G- {. c2 y( V# S* P: e9 A9 k
        111行,这里也加# l6 y( Z/ Z# m! _5 }

& y1 o0 q) \( O' a* O& B5 J1 X        OK!
1 A. V$ n! D8 R, d, \1 _+ m4 k0 J3 x  U; k: w9 {& F. n. r; Z
        继续,目录\openrisc-3.1\arch\openrisc\support\initramfs\etc\init.d下的rcS文件,修改这个脚本文件$ Z) Q5 e2 [# m# }6 l

. j5 W( d* j: T% k
/ `4 ]# Z9 s9 `& I& s4 O* ?
# o9 X% y- S+ U        在最后加上,为了查看自己编写的驱动模块信息时不报错,修改到此
# e' v  O5 i9 d  V: [
/ ^3 X5 M" U6 Y' ?  a7 m% E        惯例,先在or1ksim上试试启动linux,在镜像的桌面Get_start.txt中有在or1ksim上仿真的流程。) L/ L+ Y) G) f, y" A7 Y

9 }0 z1 a5 N& ?5 S+ f& M4 b2 m0 M- K * L- h5 D& u3 a. e4 W) u

& t& u, h8 Z! b/ d4 {2 W+ {/ ~        直接copy入终端一步步完成就OK啦,顺利就可以直接看到linux的booting messages/ `$ F4 C  n( E  }
) m. S& D  V% W7 R) [3 b
        好了,or1ksim的仿真就不贴图了,然后回到我们修改过的linux源码目录来,打开terminal吧~& I9 @& P6 B/ x' C/ l3 i, U5 K
3 G) u1 o' |9 S& {3 E) H& ~

7 I8 [* \& q! w2 X! X4 v* P% _5 c
3 K" @7 f7 Q' z4 ~( X8 ~4 \        cd进内核目录后先自行看看内核配置:make menuconfig ARCH=openrisc CROSS_COMPILE=or32-linux-2 B1 r# {7 L% A4 b2 f

/ }+ G8 I8 ?5 H8 c+ M% h( k 5 T# u4 i2 a% B# ^0 {
& W" h/ @) |! e" A4 w( B
        这些都是linux3.1版本关于openrisc架构的内核配置,熟悉内核配置的话可以自己配置了,反正我是不怎么熟,要用到的时候还要去google选项的意义。6 p8 ^- j" Y2 T: r& N3 h) K7 h

9 X8 u% J) Z* l        其实现在可以什么都不动,后面添加别的外设控制器的时候再去配内核选项,然后exit。
( h* q) C' p2 B% B1 n- U( S+ w% }* r: G/ L3 R
! I6 f, S) g: L+ s! ^) [
2 H% o$ I  i, [3 q$ p
        退出来就可以直接make
. R% z; D# D& ~1 }) ^/ D8 x. e1 Y- `+ H, O+ D; l
6 g. X( w1 [' U7 H- R* T  [$ N
' d9 P2 ^$ E+ c( H5 H# j
        最后会生成vmlinux.bin文件,
! q. b4 d+ D, X  L# Q, A! ?+ s
1 `/ O0 `6 M$ E4 e3 z        然后就是用这个vmlinux.bin制作成u-boot识别的镜像。
3 ^, y& u- M/ C: u. \
1 t$ b( Q) E* `* Z- S0 x        首先,在编译过的u-boot目录u-boot-XX.XX\tools中看能否找到mkimage这个文件# r1 b( ^+ H+ `" I
+ I, R4 Y0 h! E' F3 t) k! K

6 h8 X& T0 ^5 v+ x1 u$ u8 H3 W2 g" _; U9 d  [) W4 F- E* t0 k
        然后打开terminal中,将这个mkimage复制到/usr/bin中
# u+ F5 B, r" M+ ]+ Y/ C9 ]6 L6 ?' k
2 g! [/ Z" u, c* q
: l. J0 E4 l' A, L
        测试mkimage# j$ D( r' s* l  t* y

, q! }9 f3 \( E1 z) q: W# M 5 m! V2 s% s0 Q4 p' Z4 B; T% M
3 L/ S4 d0 b+ p
        一切正常!!!!!!
  h1 h) u9 H& x6 ^
: f  ]) d! V' e& l/ h" b: I# }* z      
  z, E/ f) _- |3 h+ ~        然后在镜像出输入相关的命令1 t! x' L8 {, G: J

2 r% g/ p- _  T        mkimage -A or1k -O linux -T kernel -C none -a 0x0 -e 0x100 -n 'Linux for OpenRISC' -d vmlinux.bin uImage
$ ~- u2 d7 D3 p  \
' v" w- z# ~( @( a9 g* z4 U , W) l7 W/ y$ R( _2 A  x3 C
5 W6 ^1 R' R  l* w; d
        这样就可以利用u-boot去download并启动linux镜像了。: w, D, }) W3 A& N  M+ W
' a8 n7 D9 {# c6 u
        现在把制作好的u-boot镜像uImage单独拉出来放着。& i  t% x! Q* V1 i$ E+ @1 P6 x7 P6 T
& \4 I- z0 D6 O7 s$ `4 K- b
        然后在windows用一个叫做tftp32的程序来提供tftp网络服务器
# _. Q; N7 T) Y3 o' s) i2 }
: \" V: d7 {' l6 [7 q* m 1 A4 `+ o. d/ T, m

! r% v  L- h, d! R" a" D8 ?! u1 Q2 V        设置好本机IP和uImage路径,
7 k, \: _" F$ p# v
6 d# h9 F1 a3 @ ) z3 ?- ?3 h. q3 G# y3 `, F  Y: r
( p5 d4 W5 L' P  _/ E6 X
        接下来就在u-boot上输出命令来load进uImage
2 N. q8 d8 w" l! A+ g* Q+ S0 s
. m6 F  x5 H: K$ L0 k/ L
% @5 B9 s) w8 V+ ]/ x( c
2 T; w! H+ \' `5 K: N        然后输出bootm,可以看到启动信息  c" r4 C2 I* R5 `( W. k( Y

0 z3 O4 @  a$ u9 \
* q3 D3 v, A1 T+ M! h5 |. m
9 ]2 G7 E; {, y8 B: D4 L: Y' i7 l0 v& j+ K: }

/ L& H/ n1 m# E$ f9 P- H
; O9 b2 a* a; j  u- s0 L- j7 V. u: N$ ]$ H7 U+ I- b* k: ]7 j
        至此,基本上kernel是通的了。
! \& c  I! ^- J/ B5 t, t; O% H6 r( Q4 {, W6 V( b3 u

) p" S6 L6 j1 B4 v  K# O/ U- |        由于现在我的水平问题,理论基础不足的关系,还没得涉及到linux kernel方面的东西,所以现在也在继续恶补当中,想法是先从学习怎么去写设备驱动,然后回去再学习kernel* k1 S" a( w2 H/ `# }8 `+ @6 ]+ {
4 K- }. j; t0 _8 t5 d; E! U- s8 M
        然后在下一次我们回过头在SOC上添加gpio模块去,然后绑到板子上的LED灯去写第一个的GPIO字符驱动程序吧~
9 A. ~+ ^4 P2 ]% l7 M9 {9 W
, I8 d& q' y- K  }9 c. _        Blog写到这里差不多追上我现在学习到的东西了,所以还是要勉励自己多花时间去学~& T3 z' H' i2 A" n1 z, _3 N7 t9 g# A
' S8 G9 X8 @- A& H
        介绍一下我现在在看的教材吧~8 h- `  A( {1 a* a

& ~2 C; H) O7 h. W/ V        《Linux设备驱动开发详解第2版》宋宝华,宋老师现在在编写第三版了,书出来的时候必须去买了~
* g7 U1 z2 t) r5 |1 S) E+ Z- g  ?, L
        《Linux设备驱动程序第三版》,传说中的LDD3,啃吧······6 \. G: a$ u3 Q8 }- ^' i/ c

4 w: F% t+ h; s( b' l" L& B' y        《The_C_Programming_Language》,不断重复地看,加深C应用能力······' l- L8 E2 H7 F2 E3 P+ U) H6 y
9 a2 E9 c  K3 B" E, Q
        《C Primer Plus》,巨厚巨经典的一本书,不解释,啃······8 h3 {# t4 o5 W  U/ V; ~5 l

) M9 P/ F9 E/ Z/ |+ X5 x: w        《操作系统精髓与设计原理第5版》,补充地看操作系统概念······: I* Z6 E2 A6 g9 b
8 A/ p5 C! a4 N) K
        希望大家还有更好的建议和好书推荐推荐~0 m5 y" m( r- h
# r# ~5 O+ s# w! A2 f1 L3 X
' G4 L& R0 ~- |+ v- f2 D# T

+ q: o7 v1 h8 l
作者: Lindberge4    时间: 2021-7-16 13:40
or1200移植linux
作者: CCxiaom    时间: 2021-7-16 13:41
or1200移植linux
作者: Hello_Mr.li    时间: 2021-7-16 13:43
or1200移植linux




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2