TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
F0 R+ ^: c( K& Z( P好,固化好u-boot之后就可以移植linux,直接在社区选一个linux的源码包下载下来,我之前一直用的都3.1版本的,实在linux在3.0时代开始后更新得太快了。1 d; a' s, @& r9 @, l) K
! f' {: x0 J; F' j
但是也是由于更新得快,在3.1版本惊奇地发现linux支持openrisc架构的CPU了,也就是支持开源开到底了~
: u; l/ r. M: _4 w8 [8 E/ Y- @+ M+ U1 S; c6 j* C: d2 a
下载好后扔进虚拟机里面解压好$ Z) E+ R3 U/ @# D" @2 ^ M3 g- k
' w \8 F1 Y4 H
, [* F& X- {! |, l( a# {, d
/ s1 M$ s: c$ k5 O( R4 k. o
然后又要稍微改改代码了~
9 {+ s r0 t; l( N+ h% M# v h2 r$ _9 Q6 o, ^/ z
openrisc-3.1\arch\openrisc\boot\dts5 p& A) v; q! G/ V! U/ l
C c) d' G( U$ F6 F. G
5 h) f; _ h" E" @5 Y
4 }4 u7 P; `2 P' L: f) @; a 打开吧,文件名字就懒得修改了
7 U+ U: \& s8 X) u5 l/ r! X
, l1 s+ M, [! O/ g0 I0 ^6 L( G 这个是or1200平台相关的device-tree文件,具体在附件上传宋宝华老师对device-tree文件的详细解释的一篇blog- u$ Y; j1 |% K* Y8 [0 C
. e" c, f* l7 ~# o3 l
; y1 ]1 v' m0 Y- i1 A
( {) E F/ ^* S' @4 F$ s 第8行,uart波特率,u-boot设置成什么这里就设什么吧,要不等u-boot启动完转到linux启动时波特率改了又得改串口工具的波特率,来回切换麻烦,而且关键我板子跑不了更高的速度了~
' R8 n. Q: C1 i, K3 l/ r% N0 [) c
( v9 C6 f' A4 m! r8 ^
$ k/ `4 M% X! R/ W5 [$ X! C. M' A, L/ G2 Z
! @7 M7 m- d, l6 j 12行,我在wishbone上SDRAM的地址是0,这里@0 D! ^) X) Y* H+ d& F& N" o# S
0 S% t/ M: |3 e
14行,因为我的SDRAM容量是128M,所以这里reg后面的值为0x1000000,对于自己板子RAM的容量要设置好,不然在linux启动内存检测的时候会爆掉6 R' ]1 u( p1 m5 m& P! l# l) o
- P. b! X9 w) `# f$ H2 x! F* s
: Z- K, m! q$ p# O* i! Y4 [5 \" R- w9 ?# R7 E* t& w% N
23行,CPU运行频率,在synthesize时的PLL或DLL的频率是多少就设置多少,我这里是40M
?8 M |" m N3 u
/ G, m* l. L! Y2 B) v( E | k; K
+ V( m' Z3 w! I
U6 ]! z% B6 J. c 38行,wishbone上UART的地址是0x90000000,所以这里@90000000, b5 p/ r! v; I
3 W, y7 x5 ~( i1 H5 x5 u t2 y 对应40行,UART16550用到的地址范围是0x90000000~0x91000000,具体这个device-tree文件如何去写在后面宋老师的blog中慢慢细读吧。- Z& J4 N" Y% j, J' x
0 M9 q6 y* j; h8 n n0 _
41行,UART使用的中断号,在rtl文件or1200_soc_defines.v中定义的
4 e6 ^& S9 ?2 p0 g; M" U- r; L/ b! H4 k9 a
7 e! s/ N; d6 ?2 q, D
. f8 n. C" \9 G5 Y 中断号,我UART使用的是2号中断。
7 e9 J! b8 }+ ^' l" g
* U$ Q) ~$ d" Q/ ~7 R 42行,UART的频率,我的是40M! v8 N: S8 Z# d3 W2 w0 r4 b
/ C4 \! x) b" [" P6 y* W) }* G
) T* B1 D8 f# C/ g/ y; |$ I
2 d+ i" e, ^3 W9 x' ~ 再下面的就是opencores社区ethmac_latest.tar.gz的描述,如果用的是这个ipcores来驱动网卡phy芯片的话,这里修改成自己soc中wishbone总线地址和ethernet使用中断号即可。
3 x0 i" D) \! l( E% B6 {& y3 b- _9 q. z1 d& }8 p, F$ o% e
% L1 |- n& Y1 W8 h9 D/ S4 `
) ?( r, _9 A6 p- D& \. n$ R1 G4 Y 再往下的在移植linux的时候先屏蔽掉,是gpio controller和i2c controller的描述,等成功移植好linux再回过头在soc上加入其它外设控制器,再把device-tree丰富起来~# T0 A8 O3 n8 k+ \+ U
/ ~( T4 D* p/ z! x$ u) L Device-tree简单地就修改到这里了~
; `( P: z2 j9 w5 x! b+ i
" n% l2 f3 @" Q Q 然后就轮到目录openrisc-3.1\arch\openrisc\mm下
6 |2 P% w2 m/ s7 N; Q9 W8 T+ T! @9 ]$ }- x6 M& O7 {- D( O; \
, s4 H% j. P6 s# ~5 M$ b
' U6 }# w- g5 b7 `& ]! `: m Open 之,
; X k5 Y7 a5 M+ v
7 ~1 g \0 E/ U* J2 V
& O+ i7 O5 \: h
3 ^; R; L( F& D 84行加入EXPORT_SYMBOL宏,要不在后面写驱动的时候加载模块会提示找不到__ioremap()函数。
0 |- W9 h- }4 Q5 m( Q- h; W' _. D/ K# t4 H( E; F$ y+ c
往下点, a3 U! @- @% e7 P' o
5 X1 ~1 a! y3 K8 B( A8 J
+ ~4 n7 r6 g5 I8 k7 ^' `
3 F+ E& R1 g$ ~7 `/ [9 ^ 111行,这里也加
% Z c. ?- `9 k- F6 q# i. ?/ E5 e! N% F. Q! [
OK!/ g1 w. P4 h& q
( ~ \2 {# q: q* F. c
继续,目录\openrisc-3.1\arch\openrisc\support\initramfs\etc\init.d下的rcS文件,修改这个脚本文件
% N4 g( U- W! v3 _7 a; t6 ^ K1 Q1 P
7 ?& h' h& {1 H4 P
9 J- U+ {7 A) X. O 在最后加上,为了查看自己编写的驱动模块信息时不报错,修改到此
1 W6 c. \3 o0 o c; J1 Z$ ~; H' d0 v0 [, m {! G
惯例,先在or1ksim上试试启动linux,在镜像的桌面Get_start.txt中有在or1ksim上仿真的流程。
" p% S' b3 s! F7 Z: C& i' @' X
# O$ c. R* a I. F# g: k
0 l) {& z8 b# c& w# h& h, x% o0 I. \# p y9 u' K- x% w
直接copy入终端一步步完成就OK啦,顺利就可以直接看到linux的booting messages
% Q z/ f6 N' Y9 S: g8 q& b" ?0 |
好了,or1ksim的仿真就不贴图了,然后回到我们修改过的linux源码目录来,打开terminal吧~8 N3 p/ v7 g1 u# a: c+ z* v
/ L% N: b Z0 ?" Q q' ~) k9 z, ?
, Y3 i4 t$ n6 s
5 Z: T1 C" q$ I% K: z cd进内核目录后先自行看看内核配置:make menuconfig ARCH=openrisc CROSS_COMPILE=or32-linux-
( [+ a( I( f( L2 f) S! @% [
. @( F7 X* i( x5 d# s# {/ P
& z$ M. y# `* r# \8 c& e! R
% a; ` O7 y1 x8 Q
这些都是linux3.1版本关于openrisc架构的内核配置,熟悉内核配置的话可以自己配置了,反正我是不怎么熟,要用到的时候还要去google选项的意义。) v- [& c# N# z8 E# X4 u
! B6 ?# _, T; V0 d" O8 I5 a5 L 其实现在可以什么都不动,后面添加别的外设控制器的时候再去配内核选项,然后exit。; L* {) h+ i$ l$ m8 `0 \2 Z! |
' p, O" i2 O: Y) [1 R4 ]
+ h) B. A) U1 w% m, u0 a
! `" @0 `- G1 a 退出来就可以直接make5 L/ [: q. K4 G# `: C0 @
! L8 n. [: [+ e& o2 M$ U
/ u8 \! z8 b* \) J) F. M6 ~( m
/ U( N' m& Z6 C' v' d+ @% R2 ~ 最后会生成vmlinux.bin文件,
8 d* _9 c) n+ F
0 a& g" H" o0 t9 E" ~3 D 然后就是用这个vmlinux.bin制作成u-boot识别的镜像。) |" v' p5 A- Y/ h7 a, R
0 j6 q9 |8 G6 Q' z/ q, \/ R
首先,在编译过的u-boot目录u-boot-XX.XX\tools中看能否找到mkimage这个文件" N' Y+ ]5 o; q. J4 Y; n
0 }# k2 ^8 ~. b# I
7 B7 C+ U% E$ X7 {/ c4 ?2 h( n$ B# d
+ `; w2 ?, c" z2 T. t 然后打开terminal中,将这个mkimage复制到/usr/bin中
/ c# m3 @' \- \- c0 t3 ^& S
# I$ t6 B; B0 \* W1 _6 N6 m
# _/ y& n; l+ y- z
h0 H; v9 f* r' Y# \8 B7 K 测试mkimage k( A! i2 W4 X7 u [8 B
A1 M9 q/ R9 |9 s% ^
6 o& }/ ~% b/ M- N
: E, m8 n3 |2 I! o3 }) O' u# z 一切正常!!!!!!
/ S& t! J' M, e, x* T0 a) c( ^/ V9 ]. `5 U
& M3 V% H! Z8 M+ `+ I
然后在镜像出输入相关的命令5 h* ~1 f ^7 p
1 y. i) _; w7 d
mkimage -A or1k -O linux -T kernel -C none -a 0x0 -e 0x100 -n 'Linux for OpenRISC' -d vmlinux.bin uImage
" l$ q* Q1 p! ^6 x7 V9 K- }4 n" {5 M; N0 w% z7 n- a; j
- [! i) a: V& g: @! w$ x) o7 \
. m6 h% \- _& I4 |% R
这样就可以利用u-boot去download并启动linux镜像了。6 J- g* F; t7 ?' m: d5 S; f+ \: g
2 m4 ?& n. ~, Y9 @8 m- R
现在把制作好的u-boot镜像uImage单独拉出来放着。7 P/ A+ H) A& P" ^" S* p+ W1 q% X/ h. |
+ e9 t3 q+ k9 c" Q 然后在windows用一个叫做tftp32的程序来提供tftp网络服务器
" o% d- a0 ~( }: w( [3 x
% I: @+ Z5 N6 `5 p
' T( p& r, f: d
6 t$ l! P2 b2 M
设置好本机IP和uImage路径,6 k+ u2 X* R4 A. H
3 k% b4 Y7 l5 i5 H# A1 u" Q/ @+ k# M
% M$ U! w* K) e6 P: |
6 A/ A* z% K0 [ x1 u 接下来就在u-boot上输出命令来load进uImage
( P: v1 s5 B4 k4 k$ J8 Z% l* {5 x' j( f/ g
4 ~! C' E3 {) T5 {( F7 O) z5 |
7 z4 c& {* A. |6 \; [4 q4 V 然后输出bootm,可以看到启动信息
# m5 W/ Q4 t& c9 a: h
5 n( C {6 e0 V9 |
. _' p4 U& f# J/ ` Y! y3 [" L
% O% r, \8 J9 C! I/ [: N4 g* o+ Q
5 L. X) s7 @0 U. s" c- n; X
7 v. b7 Z6 b3 R! r
) h8 e$ c9 }9 \( M9 a9 |# X# P5 M
5 a, |7 i V4 }$ ~
至此,基本上kernel是通的了。
" V* @" i( {% `2 Y4 E; X! R
' L' H5 O3 R* `: z* _
6 _6 g" v9 P: ]+ h 由于现在我的水平问题,理论基础不足的关系,还没得涉及到linux kernel方面的东西,所以现在也在继续恶补当中,想法是先从学习怎么去写设备驱动,然后回去再学习kernel. [. I8 ]6 ~) e: _
5 A3 @: b8 R5 t. h8 p$ U 然后在下一次我们回过头在SOC上添加gpio模块去,然后绑到板子上的LED灯去写第一个的GPIO字符驱动程序吧~
' X5 V& a& r8 L& x* L, H. f6 E9 Y) r5 F7 G" ~: x0 E
Blog写到这里差不多追上我现在学习到的东西了,所以还是要勉励自己多花时间去学~4 [; c$ T: P8 v7 G+ h
; `* K; O( c- {5 b$ O* L
介绍一下我现在在看的教材吧~
/ A U5 C9 X Y: n$ r8 }# l
# c2 W3 U+ X% H: p 《Linux设备驱动开发详解第2版》宋宝华,宋老师现在在编写第三版了,书出来的时候必须去买了~7 _& I3 f! S3 F5 o( o
5 h$ s* x2 q I/ a( |
《Linux设备驱动程序第三版》,传说中的LDD3,啃吧······! P! y- s. f" T0 q& R Z- K' R4 n
0 S! \% s# T* E3 Z0 P1 \2 c 《The_C_Programming_Language》,不断重复地看,加深C应用能力······) t' F+ n/ Y, s) m: J- {6 i+ X
+ O& \! _2 R) F1 m, b 《C Primer Plus》,巨厚巨经典的一本书,不解释,啃······
/ t. u. y/ ^3 `% L( Y# R
% Z6 ]2 d" c b 《操作系统精髓与设计原理第5版》,补充地看操作系统概念······6 ~& ?* z" E& x1 ^3 k! I3 N
* b1 Y0 f+ B8 V! O3 Z
希望大家还有更好的建议和好书推荐推荐~1 m+ r( J- W" F& ^
2 I4 T4 ]* u$ k# |
5 {5 x# x9 L# q9 B4 M
* j' w4 @9 z T s, c% M: x |
|