TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
/ ^; _' x' ]0 A' W* K; V' S6 h
好,固化好u-boot之后就可以移植linux,直接在社区选一个linux的源码包下载下来,我之前一直用的都3.1版本的,实在linux在3.0时代开始后更新得太快了。6 x! j* M6 p/ P7 @- i' L
* x8 x% a3 d3 ]
但是也是由于更新得快,在3.1版本惊奇地发现linux支持openrisc架构的CPU了,也就是支持开源开到底了~
/ t3 g1 s2 u, p7 a, k4 R+ u# G, q, D- u) l4 i
下载好后扔进虚拟机里面解压好3 S" u( g+ b5 d& y% i( v1 ]
* v9 W6 u& x/ W2 d* K' j" \" S& z
, k# C* r* U. D8 J; S: f* j* T3 x& k9 E
然后又要稍微改改代码了~
3 P' r% \& M; \1 E) L2 i* |6 Q8 B8 q$ \2 I; K- J1 H: W* ^, f
openrisc-3.1\arch\openrisc\boot\dts
; O+ S5 z! E+ `1 L/ D5 n8 `5 }
. v n2 K+ m9 y( X6 `
- G1 s/ [' k. G e5 D- }; Y) ^7 k. e3 g A% t: \8 x. j2 K5 Y
打开吧,文件名字就懒得修改了
) d5 _4 O& Y: X, v3 N6 y0 ^( C
& d m2 `. H' r) R, I 这个是or1200平台相关的device-tree文件,具体在附件上传宋宝华老师对device-tree文件的详细解释的一篇blog( ~1 D5 M" j0 B7 P9 j9 ~/ I
6 `" R7 }2 B+ l5 D
9 [/ Z& m# f: |: c$ b0 z
# l6 T' [/ J& R2 D* Z0 R' g
第8行,uart波特率,u-boot设置成什么这里就设什么吧,要不等u-boot启动完转到linux启动时波特率改了又得改串口工具的波特率,来回切换麻烦,而且关键我板子跑不了更高的速度了~6 I0 d* k+ v& D/ A
" {5 p& v; E' @5 P
" M& E/ l% G2 L) T" }" u0 _
6 p% q& J* U2 W2 m/ ]$ p+ s& C1 Z! H! y J. J9 e0 J5 [
12行,我在wishbone上SDRAM的地址是0,这里@0
- W; r2 ?& ]1 l6 X7 [
j6 J7 O5 v: u! b6 k 14行,因为我的SDRAM容量是128M,所以这里reg后面的值为0x1000000,对于自己板子RAM的容量要设置好,不然在linux启动内存检测的时候会爆掉
& R% u, L- s* u1 e# k3 _: `3 x. Y6 ]3 R( T5 F9 z, G
1 X' |& o* l' M
* Y4 U7 J: a7 G2 W
23行,CPU运行频率,在synthesize时的PLL或DLL的频率是多少就设置多少,我这里是40M
' B! |3 p/ v' ]5 {1 Z) y% l0 p1 |* U
: }1 n) w0 @9 J9 g
7 |. |* v. C2 j* G; P
38行,wishbone上UART的地址是0x90000000,所以这里@90000000
7 N# O* w5 n7 i _1 z1 J; R
: i! b+ n! ]3 L7 a* K 对应40行,UART16550用到的地址范围是0x90000000~0x91000000,具体这个device-tree文件如何去写在后面宋老师的blog中慢慢细读吧。/ z' o/ W# h$ C0 i& Q. \4 Q" z
# C! \* H! K9 P7 x/ ~( F1 `* R
41行,UART使用的中断号,在rtl文件or1200_soc_defines.v中定义的
1 E- u& z! R" ?
) z8 Z0 @/ D q0 [& r
' y" O3 N& ^& z6 H6 S" W* Z
4 X, K& g( p( w: z4 \* Z* Q6 n 中断号,我UART使用的是2号中断。: J6 D. z" \& H. A' V
! p7 e9 r5 \3 y8 G8 t
42行,UART的频率,我的是40M7 `9 k9 {$ ~7 V8 \7 `% k! G
# {1 @4 e) [! d+ M( T
6 F2 C; y3 n; W* U( ~( j' {% k" ?
# Z( n4 B2 w& T, Q4 P2 ~ 再下面的就是opencores社区ethmac_latest.tar.gz的描述,如果用的是这个ipcores来驱动网卡phy芯片的话,这里修改成自己soc中wishbone总线地址和ethernet使用中断号即可。; i* y2 D0 P( M% \. D
1 S" q U: k' j) P7 J9 R! m# a
1 i' l8 w, Y: ]* O0 u) l* X, J3 Q" O6 K2 T$ B- F2 ^6 [
再往下的在移植linux的时候先屏蔽掉,是gpio controller和i2c controller的描述,等成功移植好linux再回过头在soc上加入其它外设控制器,再把device-tree丰富起来~: z( J$ B& a1 D/ `6 l( @
9 p. ]3 l5 }& x. p& j Device-tree简单地就修改到这里了~ F% X, ]) A! k7 O' {! N& o
5 D d# M" |; N b% U
然后就轮到目录openrisc-3.1\arch\openrisc\mm下
7 F) o1 C7 {( S: ~# b3 @8 O0 {. R! A ]' u9 \, [5 F2 c6 Q e
! O; h9 ^6 W* S' ?7 _
6 c$ F: {/ t4 L Open 之,) w( c3 @! j" ?1 b- K0 K
; r$ I7 ^6 I& ]% C0 _- ^. Y. i, J
' v2 y6 p' B1 ~* \- Z, M, d
# T* T; ]1 ~; ~* a/ @. R* {( |: {
84行加入EXPORT_SYMBOL宏,要不在后面写驱动的时候加载模块会提示找不到__ioremap()函数。! G* Q- |9 a) q
0 D' a1 P' @' V' B, O 往下点
( h; C$ p3 Z1 u
' w9 {* O* s! d- H& z! v# N
4 ^# t+ K }9 d* U+ a7 ~) r; S9 x7 s5 l6 }: B" z
111行,这里也加
& j4 O; ~, V3 k+ M3 a6 A9 G' ~
) U" @7 ?1 b- O. k2 m OK!
- k0 x* M* F! R! t; g+ S
8 B$ @/ [7 ^$ Q" w/ R 继续,目录\openrisc-3.1\arch\openrisc\support\initramfs\etc\init.d下的rcS文件,修改这个脚本文件
& R* M4 ~2 V" d! b, G9 o" u) V [6 ^. P' T5 E# c; t
8 i2 N. ^1 M u, w; h
+ s2 N3 f0 M8 |/ f& z* L 在最后加上,为了查看自己编写的驱动模块信息时不报错,修改到此. v* o& ?8 X" P# q; K. C0 K
0 K9 u" @0 c4 M: K0 \* } 惯例,先在or1ksim上试试启动linux,在镜像的桌面Get_start.txt中有在or1ksim上仿真的流程。
6 I G, |0 q- W d+ N1 t/ e
1 _9 Y, m7 x8 f! {/ ~1 \( v. I
# B5 ?0 W; s. p- F# s" t
H* r: F* s8 q, [1 `5 Q 直接copy入终端一步步完成就OK啦,顺利就可以直接看到linux的booting messages r( D1 [6 {# C
/ k* x- k; \/ m! f2 v
好了,or1ksim的仿真就不贴图了,然后回到我们修改过的linux源码目录来,打开terminal吧~. q+ j; K2 {( E9 K- ]
1 X4 d/ K. w) [7 z! s& q8 x
! q( p W# ~# V/ O& L3 n1 i& Z, X% R
* k& ?: B; V& k8 i0 ] cd进内核目录后先自行看看内核配置:make menuconfig ARCH=openrisc CROSS_COMPILE=or32-linux-5 X: c3 _! ]% B+ E7 z: R
- W- c7 x( b* a
d# t3 }' r8 G0 w5 Y+ b. P" g7 N& n
; m3 b, s" n5 Y$ J3 {+ o. @
这些都是linux3.1版本关于openrisc架构的内核配置,熟悉内核配置的话可以自己配置了,反正我是不怎么熟,要用到的时候还要去google选项的意义。
) ?9 I0 Q! t4 J& Y- m+ f9 i2 d7 _- k
0 N: J- B* h% ?/ `/ U6 ]. m2 o: P 其实现在可以什么都不动,后面添加别的外设控制器的时候再去配内核选项,然后exit。" C+ Q! J0 X% N `. L" J: y8 j
* f" e3 u' ?& m2 ~/ G; [+ b
/ u8 O& d, o# b" R: n
( y0 q+ P/ R. A' H) t* D
退出来就可以直接make! n8 a8 k# t% P6 q5 n2 {8 G
$ _1 B, {+ V$ k4 |! |6 D: ~; {
) i8 a) E" J( M2 F# B X- V2 \
' ?, @! d; T1 z3 }1 n7 L 最后会生成vmlinux.bin文件,) H1 S6 Q( x. ^" [! c
1 I+ b1 n( t7 M: E9 f6 u' d
然后就是用这个vmlinux.bin制作成u-boot识别的镜像。
6 B: C5 r/ o: b+ A8 ^5 _* V9 E: k% z, O8 P: E9 `
首先,在编译过的u-boot目录u-boot-XX.XX\tools中看能否找到mkimage这个文件
$ m& {( ^1 l% {5 o w0 ]
) K/ D. j1 D3 P3 G% [+ E" r
7 U; o/ K9 r2 A" Y7 K
- L1 Q$ w e3 V' W, z1 k
然后打开terminal中,将这个mkimage复制到/usr/bin中" o- W+ c/ A+ z2 d' _5 g
# P- n% X, v: g. _
7 Y1 I3 h, h2 M
3 Y8 [$ x" ?- }9 C( z- z+ {! w
测试mkimage
; ]7 @* b' X' Q: B& B1 I+ U* x8 h% f; I% @$ b$ Y. ~
* }) D+ e$ b: l! E$ h R4 K! |% X
" q( U6 N$ { { 一切正常!!!!!! P" b1 R5 ]3 m. \: d: R( S2 p
) y4 g( j- b$ D; [% M
5 f* t2 y6 ^ v/ V4 v; [0 { 然后在镜像出输入相关的命令
2 N. B9 o! b: [$ t
% E( p3 P% f( q" @ mkimage -A or1k -O linux -T kernel -C none -a 0x0 -e 0x100 -n 'Linux for OpenRISC' -d vmlinux.bin uImage' j4 V- q* k {6 t
* k; E0 A; Y- X' h+ P! M
% {, B. r7 k! H
) t0 h# W6 L* X: G, s+ R1 h7 i 这样就可以利用u-boot去download并启动linux镜像了。
1 e6 c9 P1 I. }5 S7 L( r2 l" Y7 S, R' l& R3 }; m: m( O
现在把制作好的u-boot镜像uImage单独拉出来放着。
" m3 b/ ]+ v$ M d( m$ r! B0 P& T, w. V, X
然后在windows用一个叫做tftp32的程序来提供tftp网络服务器
3 M1 z. E6 i" k7 Z, z4 ~& Y+ E3 C* S( b5 Z0 L5 K; d
+ e# E8 ^# R7 ~9 f" p# A* Y
# [1 n; q5 U6 h- N1 Z. } 设置好本机IP和uImage路径,
/ q, e* F, B* |+ Q% K: A- N+ L- v( D) e- b
; v# \+ |) a0 V' F
! r( H% t+ I* N$ x+ _3 i2 n
接下来就在u-boot上输出命令来load进uImage
, y+ Z( R: E9 {# {0 t0 n* k! m. p8 ^% f1 l. U+ F% O0 t' ]
! w' }9 v# \6 f, {3 ^) q8 D
" A% t, i, p* Z: @$ g+ c G 然后输出bootm,可以看到启动信息( G# K+ e; V* Y7 Z+ b6 _
0 N8 Z7 m5 I! b1 n) K
! E$ P3 K3 `( `- r" e' z0 j
3 K' Z8 X& U0 M" W
" m5 w: v s, Z0 l* y, t
; x/ q2 C+ }1 |7 ?- g" |" {0 l1 u6 T, i B
: W9 ~3 E X/ [0 z- B& u) e 至此,基本上kernel是通的了。1 ~( @0 A( w" u$ @" P
9 b/ P; ~# m+ g4 ~% o! x
* j, f0 v9 G% Y: l3 J 由于现在我的水平问题,理论基础不足的关系,还没得涉及到linux kernel方面的东西,所以现在也在继续恶补当中,想法是先从学习怎么去写设备驱动,然后回去再学习kernel( Z* Z3 \, L( W* a, v) V0 H
1 j0 D1 K4 S$ ~7 { E! y
然后在下一次我们回过头在SOC上添加gpio模块去,然后绑到板子上的LED灯去写第一个的GPIO字符驱动程序吧~$ I5 i: V9 c) m/ V8 p5 ~
9 v/ Q8 }' B: a
Blog写到这里差不多追上我现在学习到的东西了,所以还是要勉励自己多花时间去学~
+ i( z! u" P% `1 Z; q
" |: t" Q# ?9 f' l4 p 介绍一下我现在在看的教材吧~
3 K5 A* Y% T" \5 s; h9 }- x
' @. r# Q* L' {, K0 V: P9 F. F1 _ 《Linux设备驱动开发详解第2版》宋宝华,宋老师现在在编写第三版了,书出来的时候必须去买了~
/ R7 D! t- I& A% d( `
1 @0 w6 R: G; D! P9 ^# b7 q5 c 《Linux设备驱动程序第三版》,传说中的LDD3,啃吧······7 d- d/ k; b5 _" g0 R
1 }6 f% B" f; n 《The_C_Programming_Language》,不断重复地看,加深C应用能力······
. k" v- I( F( `7 j$ w3 |3 w* l" g! @5 B0 P2 q7 ?
《C Primer Plus》,巨厚巨经典的一本书,不解释,啃······
) M8 u2 l& `: {" e- x3 f! T( G) b) _& o5 ~6 o" }
《操作系统精髓与设计原理第5版》,补充地看操作系统概念······3 t" H1 S' m5 H
" e1 n) s( ~7 m+ @) r1 q
希望大家还有更好的建议和好书推荐推荐~- C5 J/ A: D& J- O6 U1 {3 @
( W; o1 o5 v1 B% [. S0 i) a
5 ^7 L. O: u5 c4 L2 |/ D3 q
j' N6 T% t; r |
|