TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
V! M2 z* V% F, ]好,固化好u-boot之后就可以移植linux,直接在社区选一个linux的源码包下载下来,我之前一直用的都3.1版本的,实在linux在3.0时代开始后更新得太快了。
2 d- n6 Q. X3 N$ g6 F' e
# a, _& i, ?; A7 t 但是也是由于更新得快,在3.1版本惊奇地发现linux支持openrisc架构的CPU了,也就是支持开源开到底了~8 Y% e6 y: {. l/ w
# t0 n' w# p" n1 w G8 a" B 下载好后扔进虚拟机里面解压好, L; _! U5 i$ i% V9 w; a3 t
) e! ?2 d `: U1 h7 d
! d5 R9 g/ Y: S+ X- ?0 R0 B% k# \% U4 N4 b" D% H3 L
然后又要稍微改改代码了~
0 J' u* e+ e( m4 Q; t9 v( h; `# r( ?- P. n! T$ \2 I. Z
openrisc-3.1\arch\openrisc\boot\dts
$ M: u5 u# E" [8 l% Y2 K& Q" ]7 T: q: p* a- e3 Y
/ ?9 J: R# o/ A5 K# R: B
* ~7 _/ i9 M) e6 { 打开吧,文件名字就懒得修改了
. H; k s6 P$ p0 c; w1 ]$ d
8 k: d. E% J5 [6 ?" E 这个是or1200平台相关的device-tree文件,具体在附件上传宋宝华老师对device-tree文件的详细解释的一篇blog
& o% [& @6 y9 W4 f0 A6 S, F
# q- o: o! g8 ^9 v" t6 A) q8 j
0 M+ I, C0 ?' ~& S! d
' {+ O( K# T9 }, j* E5 q 第8行,uart波特率,u-boot设置成什么这里就设什么吧,要不等u-boot启动完转到linux启动时波特率改了又得改串口工具的波特率,来回切换麻烦,而且关键我板子跑不了更高的速度了~9 D& L0 l* C) P7 P. X& L
# J. `7 v, }9 C# ]; m
" _; M% G$ b& @, |
+ O3 }4 F+ Z; A
. I9 F2 X$ ~5 `7 Z( g1 B7 G, H 12行,我在wishbone上SDRAM的地址是0,这里@0
: j1 h0 _1 r( R( K# [7 F% D( ~% \+ S! H. r$ c
14行,因为我的SDRAM容量是128M,所以这里reg后面的值为0x1000000,对于自己板子RAM的容量要设置好,不然在linux启动内存检测的时候会爆掉
4 U8 v ^; Z% k7 h" U
Q/ |8 V0 L' H6 V3 A# F) @
8 N. a2 `( n _, t( [ @/ q$ l* R2 a( ~" R
23行,CPU运行频率,在synthesize时的PLL或DLL的频率是多少就设置多少,我这里是40M* n/ G3 ~! M1 C' B$ N9 A
% g b! z0 h' [
3 j6 {# \2 C2 n5 r8 ?
$ E `% K, q l4 C6 X/ y" f 38行,wishbone上UART的地址是0x90000000,所以这里@90000000( c n& O, H6 F& b
) N( A, ^( j1 |
对应40行,UART16550用到的地址范围是0x90000000~0x91000000,具体这个device-tree文件如何去写在后面宋老师的blog中慢慢细读吧。
4 c7 w) b' {! r- J2 \
5 C8 j1 {' k0 V% K 41行,UART使用的中断号,在rtl文件or1200_soc_defines.v中定义的9 u$ B; V2 Y `# u4 j7 {2 ]) P
/ M1 H# M- N6 i8 N8 C
# P: v- m5 W. x6 v+ q5 E
8 L: I6 K1 ?" P7 H! |! x 中断号,我UART使用的是2号中断。0 s% t+ c/ s2 ]5 H. Y
% X D8 G: e4 Z0 t* V( Q 42行,UART的频率,我的是40M
3 n0 ~; A% h r, ?4 N% G" E# f5 I8 h6 o% S; N' x
( h U" ~0 w* }+ {8 l, }8 `0 h) U& y
再下面的就是opencores社区ethmac_latest.tar.gz的描述,如果用的是这个ipcores来驱动网卡phy芯片的话,这里修改成自己soc中wishbone总线地址和ethernet使用中断号即可。/ P0 a! W1 [8 W6 I8 Y
. l: T0 w: D/ C# p% C
# G3 u. [4 \/ h) z$ K+ |
' @% E; w0 u1 }3 n; G4 R1 v, e0 z 再往下的在移植linux的时候先屏蔽掉,是gpio controller和i2c controller的描述,等成功移植好linux再回过头在soc上加入其它外设控制器,再把device-tree丰富起来~: d& ^; T, L0 t! j7 t4 j0 k
. q0 ? y V4 b: j8 U Device-tree简单地就修改到这里了~
4 \' ~6 ^, p* i/ }& V' |8 E8 ^4 k4 M
然后就轮到目录openrisc-3.1\arch\openrisc\mm下
$ Y) N! E d+ W7 W4 }1 y
. Z) g0 I. G0 I1 r
3 N; X- ]$ r8 b1 P- Y" p
' q% a1 t& ?4 t7 x1 ?7 L0 L6 V$ L Open 之,
4 X) y# N9 M, r6 g9 J8 @+ \5 T# r/ K2 d! `8 r, s ?
$ M u5 A& ?- b4 x. a1 {$ r
7 F5 v0 V$ J9 R& l4 Q; Q 84行加入EXPORT_SYMBOL宏,要不在后面写驱动的时候加载模块会提示找不到__ioremap()函数。
& t+ l c& o, s# H
. I, N" k) y; k, w6 l7 _8 D9 X" d- C 往下点/ _1 m, ?6 Y9 w$ W
* x: Q, O5 g7 _% N1 p ? u1 g
$ A6 \+ g6 F: N) ]! {$ d
6 l, C- c* i% u 111行,这里也加
" x. Y" y" d6 s- l! ^& i& ^& U1 x' d: c7 B4 \. B
OK!1 N0 ?; ?# a9 g0 g2 k$ ^0 o
& j( v+ ]: ?. O) e c
继续,目录\openrisc-3.1\arch\openrisc\support\initramfs\etc\init.d下的rcS文件,修改这个脚本文件
( p0 F# |- j0 @% I5 k `' h5 X* T- M
: }1 t, g9 ]: }% g O8 k
$ q+ |4 l6 O3 t" m I2 e7 }% `: T& @5 B* {
在最后加上,为了查看自己编写的驱动模块信息时不报错,修改到此 C2 n8 P! N5 K( v
$ P& K" T% n7 h6 h4 M# W 惯例,先在or1ksim上试试启动linux,在镜像的桌面Get_start.txt中有在or1ksim上仿真的流程。) s8 R: f: ^" g
! C C. V; [ w
: V) f0 C. L# a' E
2 W# O; I9 D8 o9 i/ u0 a9 R
直接copy入终端一步步完成就OK啦,顺利就可以直接看到linux的booting messages, r0 p/ E N1 m" n/ ]5 L
. w( }9 { V9 `* R3 K
好了,or1ksim的仿真就不贴图了,然后回到我们修改过的linux源码目录来,打开terminal吧~3 i# j/ ]' `# ~+ G' [. ?* N
" Z9 U% Y6 b( z+ V1 v& m9 B* n
( M& q" J$ h( |
5 ^. r% X, k* p& T- D cd进内核目录后先自行看看内核配置:make menuconfig ARCH=openrisc CROSS_COMPILE=or32-linux-1 z/ p# k1 f5 q# L3 K; W
! r. e X9 Q6 C) w, r) Q3 O
* H" U2 i L J- U* C
" k& ]; ]7 C+ ^6 V+ v' x 这些都是linux3.1版本关于openrisc架构的内核配置,熟悉内核配置的话可以自己配置了,反正我是不怎么熟,要用到的时候还要去google选项的意义。+ U! [' M! i' D9 z
" {. ^# Z: f- t 其实现在可以什么都不动,后面添加别的外设控制器的时候再去配内核选项,然后exit。1 N8 ~# `/ e) s+ \8 S
4 i' b; p+ B( m0 Q& f% ]% c
* n$ }- ~- o, O! E3 Z0 }9 X- F6 ]$ z
5 D9 m$ {' ]( h0 g3 S8 Q( Z9 ~
退出来就可以直接make' ~9 I" O8 g4 |. W# d4 q
( P; r5 s: _3 {3 H+ L! z4 k- R! b
; g/ r5 ^% n1 h3 v6 X6 n2 a' h8 v) d% ?+ M/ X$ G6 A1 C
最后会生成vmlinux.bin文件,: d8 o( i* b' x' W3 V( \: ~4 v
s3 [ H* U! _; y5 s- ~ 然后就是用这个vmlinux.bin制作成u-boot识别的镜像。3 t) H: v: o: X4 Q# K& V0 g" N; H4 `& a
# Y: G5 s9 ]4 i* x! X1 k7 n 首先,在编译过的u-boot目录u-boot-XX.XX\tools中看能否找到mkimage这个文件
. ~' M0 |" o1 h l
* F; a# Y& @3 p4 G- \
/ \+ j# Z7 p/ K5 B$ z0 O+ A! _
0 M$ ]4 l; Z0 ]% s 然后打开terminal中,将这个mkimage复制到/usr/bin中
0 P7 j! A, a# [1 u% H0 }
) x" S% Z3 i0 J
& m a) O. w3 u$ N% ^: S9 U9 j; y& R9 n" E A, B
测试mkimage' V0 v# n0 G6 C! ?) Q8 i+ Z
2 H5 s& r: N. O t/ X
: m- ?# u$ z, w5 D
+ h$ g% y% c8 p/ x, A
一切正常!!!!!!# U6 v5 O! O7 `- X _3 E
8 x/ { x- h! B0 q ! q9 a4 v6 P$ B3 r) L1 B
然后在镜像出输入相关的命令6 l# N! J# U+ N
+ t1 l5 W0 i [( A0 s. Z; R mkimage -A or1k -O linux -T kernel -C none -a 0x0 -e 0x100 -n 'Linux for OpenRISC' -d vmlinux.bin uImage% B+ C$ R: E2 E3 j7 \7 ^
2 W8 Y/ K& Y9 Q0 Z
, |2 n- \6 l: X6 k, w
) d, f. I8 P) h% @; j1 Y. @3 l# } 这样就可以利用u-boot去download并启动linux镜像了。
1 r4 F2 l: c! e4 ~/ n7 D" d2 M2 ?* o& E- k) E
现在把制作好的u-boot镜像uImage单独拉出来放着。
2 I2 ]+ O5 A/ h- q0 W
( C5 N# e5 ?2 G H 然后在windows用一个叫做tftp32的程序来提供tftp网络服务器8 u3 V+ l& m& f- Y
, t' f, g) P; P
( M- W% o: O( B$ n7 f6 P0 r' r
1 V) {3 D0 f# U8 f3 Y5 A1 {' v3 X
设置好本机IP和uImage路径,7 a7 A% P6 H5 X0 C" ?. l9 I
3 L3 U4 Q9 E( S+ j; Z3 F$ V
( ^ @! w# h* x2 r8 ?, _/ i' k% H! i
接下来就在u-boot上输出命令来load进uImage
/ ~) I" h9 G2 l' n5 D
2 T0 ]1 k* n! U1 f: d2 L3 o
4 _4 a2 c F. Z
: f) `/ x1 u# H/ @" h' E5 U
然后输出bootm,可以看到启动信息 g. ~* X' I2 j" x+ @5 t4 c( x
; Z% O+ |8 x c6 Z4 a3 }7 C
& P- u. D( j4 e- M" ^5 K% o5 J
( d3 V$ ^$ b' l" v/ b4 H" C
' X! b. o3 Q' j
4 u4 K) Y: x; j7 ? N1 p9 a7 O& _5 s1 d
) p/ F: F/ Z& i6 g2 @
至此,基本上kernel是通的了。5 \) v- \6 B* q9 ?, a$ V1 y
* ?$ N+ |0 L; y @ O9 u* P
( g: b1 s: D0 z" {$ z$ m 由于现在我的水平问题,理论基础不足的关系,还没得涉及到linux kernel方面的东西,所以现在也在继续恶补当中,想法是先从学习怎么去写设备驱动,然后回去再学习kernel9 b) I/ w& @: I* N% f1 Y
4 r' s7 ?5 W7 I8 o" b4 j 然后在下一次我们回过头在SOC上添加gpio模块去,然后绑到板子上的LED灯去写第一个的GPIO字符驱动程序吧~
6 N, T# ~6 u5 A6 p
: R: D$ H, c9 ]4 |; X$ j) A( G Blog写到这里差不多追上我现在学习到的东西了,所以还是要勉励自己多花时间去学~ n; U! h F& V
% q+ o g$ u7 g4 {/ B R' K! k Q( U
介绍一下我现在在看的教材吧~4 D# M" B9 N0 r$ V( z/ I$ Q4 h \
& f' ^ a: |4 ]6 @- b1 Y. k6 j9 |2 ?! |
《Linux设备驱动开发详解第2版》宋宝华,宋老师现在在编写第三版了,书出来的时候必须去买了~" i: T W; R( z8 ` A7 X0 K* N: ?
3 O5 M/ T- V5 ^; b# [2 | 《Linux设备驱动程序第三版》,传说中的LDD3,啃吧······# p2 S/ i) m; v- v
( @" Y: m$ X) k1 f 《The_C_Programming_Language》,不断重复地看,加深C应用能力······& s' n( k3 ^ s
! B }" H6 c2 c$ W9 g 《C Primer Plus》,巨厚巨经典的一本书,不解释,啃······( a9 v" {+ K7 k; m2 P8 u7 S1 c
/ ~5 a* a1 _" Y5 u+ o& R, A3 M 《操作系统精髓与设计原理第5版》,补充地看操作系统概念······
# K' C5 K. V2 s/ x. g2 ]' j8 E
) J# i+ y6 w# p2 Q2 g7 a 希望大家还有更好的建议和好书推荐推荐~
1 Q" w' W, v5 G+ l$ `
- t# e! z1 H: Q! R# w4 H0 c8 J) h. L. R0 c+ i
# r% q$ |; _( ^ |
|