TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
0 n" A& N9 d& K$ ]& F, k9 s% h7 J
好,固化好u-boot之后就可以移植linux,直接在社区选一个linux的源码包下载下来,我之前一直用的都3.1版本的,实在linux在3.0时代开始后更新得太快了。7 ~% \ ^8 R: `( C
5 l6 l5 q+ }9 c' v
但是也是由于更新得快,在3.1版本惊奇地发现linux支持openrisc架构的CPU了,也就是支持开源开到底了~/ r0 G# i: P! |* E; }
4 M+ S. ~- Q7 R- S9 b8 m
下载好后扔进虚拟机里面解压好- @2 {' T0 K# l+ r; l: N
7 @1 t8 I# y" [4 n8 s
5 l! E4 _, c# r( A: ^* M
: V7 o( H9 ]; T7 p 然后又要稍微改改代码了~
' D3 ]) _( Y C r* q5 `& D
8 C `" R; Y6 E+ p% q* L9 {+ q openrisc-3.1\arch\openrisc\boot\dts" I# m0 L: v" r! z" _( s* s
0 y: n+ }" d% V4 s& R, }
% r1 |4 e* y5 b; d
+ U; Z5 w5 f0 n( t% {' A0 S* | 打开吧,文件名字就懒得修改了' i" ]" O7 T y
# n, W# z" v4 K1 Z
这个是or1200平台相关的device-tree文件,具体在附件上传宋宝华老师对device-tree文件的详细解释的一篇blog
6 h' m8 @4 o, E8 a/ _! g: y/ `" S" _1 \ \, K
" L! ~+ u* p7 p6 E0 ?
7 z, z2 `8 _! p
第8行,uart波特率,u-boot设置成什么这里就设什么吧,要不等u-boot启动完转到linux启动时波特率改了又得改串口工具的波特率,来回切换麻烦,而且关键我板子跑不了更高的速度了~
7 N3 ?1 J0 ^! o7 k7 ]; S8 a% Q
& G5 {7 U8 {- S$ q
# i5 t1 f6 ~6 r7 a* ]
! i. X1 E, g% b
+ r ~2 [! {/ Y0 i, s; X 12行,我在wishbone上SDRAM的地址是0,这里@0
- n- k5 u& N# `4 I( j! J7 o) e0 o+ o3 E, \; t
14行,因为我的SDRAM容量是128M,所以这里reg后面的值为0x1000000,对于自己板子RAM的容量要设置好,不然在linux启动内存检测的时候会爆掉
" {: C9 c8 c- a6 d3 j9 u# ~' t
% T2 y7 z! [$ A- A- j
p& K" f! v+ q( l, g* `
3 ?9 i# Y I9 J; e! z 23行,CPU运行频率,在synthesize时的PLL或DLL的频率是多少就设置多少,我这里是40M) {7 V5 e1 ~# a! D1 X
- [2 R) {5 K* e& @2 o6 d$ U4 X3 c
2 r/ T% P* K+ \1 R
: `& Y' o' e1 m" e! {# u0 ~6 i% c 38行,wishbone上UART的地址是0x90000000,所以这里@90000000
# ~/ v0 D6 o2 q Y7 Q. W% b2 R% @) k9 @( N
对应40行,UART16550用到的地址范围是0x90000000~0x91000000,具体这个device-tree文件如何去写在后面宋老师的blog中慢慢细读吧。
) z9 u8 I& \% \0 K7 p. S+ P! X7 L) g
# F2 n& w+ O7 r! d. n 41行,UART使用的中断号,在rtl文件or1200_soc_defines.v中定义的
1 Y# L0 f) A6 J( ~
! J: G' W1 S5 S. g
" i, D2 q2 |7 U& d8 y# K- F
) z- H( O& Q6 ]4 b# B) R/ r 中断号,我UART使用的是2号中断。
. M K" x% g7 }& b- C) S& b
, B- E1 h0 H- v: @ 42行,UART的频率,我的是40M/ A0 k: O" s+ M- q8 j5 S
" a9 [- j {$ h
& I, G! R5 n4 m! w+ i% H
& r/ S1 b) z; i: X. g) J 再下面的就是opencores社区ethmac_latest.tar.gz的描述,如果用的是这个ipcores来驱动网卡phy芯片的话,这里修改成自己soc中wishbone总线地址和ethernet使用中断号即可。# ~6 b+ j* T7 w' @8 x8 Q& Q& D
5 N$ E d/ F2 H$ M. h! U
) ?0 R% I- U! D! ?$ G0 C
, w* a' }2 A& g" c7 g& c 再往下的在移植linux的时候先屏蔽掉,是gpio controller和i2c controller的描述,等成功移植好linux再回过头在soc上加入其它外设控制器,再把device-tree丰富起来~
2 V' I0 ?; O" h0 E& A. o& p3 [! ?7 Q3 n2 _" C) S
Device-tree简单地就修改到这里了~! G$ U* K7 C( c" h
. g2 B/ R& A! I. G 然后就轮到目录openrisc-3.1\arch\openrisc\mm下
6 G4 C: e& \4 A& _, ]0 x1 R+ y0 o& u0 j8 A' w) U
" x+ J b7 A M# m$ S2 P3 l- ^
2 f, J. Y" Q( M: E( J/ x( m
Open 之, v' t' ^2 T- W' x. [
S+ Q+ E: Q: D) l( J# [$ H) l8 E1 N
$ [0 _9 b2 x. Q0 y; \ R6 r" ~% N7 C) _' j9 b0 P
84行加入EXPORT_SYMBOL宏,要不在后面写驱动的时候加载模块会提示找不到__ioremap()函数。: \+ t# ~( Q/ d* S/ e
- T0 c" c/ h8 y0 E
往下点" ]% s, Z0 A% z# i! I1 t
) A6 F* J6 u9 ^2 o0 c
3 k$ E% V5 {9 Z; P
8 t6 R' @, w W7 Z( D+ N) \( R4 m0 S 111行,这里也加) R% ]0 z' _7 o5 F7 Z
! R' ~2 t0 _ L* ~
OK!' R2 C$ e( b5 _7 ~
7 E2 g5 r0 ?' `- Q; {2 Y+ Z, q
继续,目录\openrisc-3.1\arch\openrisc\support\initramfs\etc\init.d下的rcS文件,修改这个脚本文件
7 C. f R8 @% [7 V, [% W
& c0 ?# c* Y$ u& r7 H$ A/ o
/ _) _' S2 [. s0 A) h1 {, \6 K3 m. p/ L3 c
在最后加上,为了查看自己编写的驱动模块信息时不报错,修改到此( z4 `* B4 l0 O& u
; c8 _' {- H* b/ X$ s
惯例,先在or1ksim上试试启动linux,在镜像的桌面Get_start.txt中有在or1ksim上仿真的流程。- r0 h- ?. ^2 E# S! I7 A' {
- y2 y/ c; _8 f2 h; f$ F3 w
$ u/ n( L; O! M! G# R
- y' ~; Y4 a0 t
直接copy入终端一步步完成就OK啦,顺利就可以直接看到linux的booting messages
5 w) b( Z+ g9 b3 H' W. G
) k# n4 m/ X# n 好了,or1ksim的仿真就不贴图了,然后回到我们修改过的linux源码目录来,打开terminal吧~' k* F+ @& f8 n8 a( d5 _ E4 T& ^
1 b8 p9 s: Q; i
, B* [2 V, q/ z6 }9 z9 n) \" g
% K% q$ a# q, b3 D/ S/ k+ C cd进内核目录后先自行看看内核配置:make menuconfig ARCH=openrisc CROSS_COMPILE=or32-linux-1 [& W1 r: Q5 b _
8 k' D* C& Z. h6 S% W
1 a; f" Q/ \+ E" o' L$ b3 C0 x' b: x" N, I; e
这些都是linux3.1版本关于openrisc架构的内核配置,熟悉内核配置的话可以自己配置了,反正我是不怎么熟,要用到的时候还要去google选项的意义。
2 R# T Q% x4 \7 C( O. O% Y& K: U+ s. r. G! ]) C4 e
其实现在可以什么都不动,后面添加别的外设控制器的时候再去配内核选项,然后exit。
* }4 K+ ?# F; [. o! ^4 |2 ]! N; L9 j9 q0 o; y' Z/ ~ ~
! H- ]5 ~% Z" h/ w8 u# o
/ x% b" p& r* p* I4 {# t
退出来就可以直接make
0 M1 D1 E8 z# S6 f2 r& _
5 x- y* u3 |7 o7 p8 t+ A
4 {; z7 Z4 ]1 P, ?2 Y
0 r/ h! c- W4 H& j$ { 最后会生成vmlinux.bin文件,
1 |# B' l+ Q) b( t9 y( S" ^3 {9 i# f: A2 r* h
然后就是用这个vmlinux.bin制作成u-boot识别的镜像。' Y. C; w: l* i1 L V
: K% i: P" l& g9 e7 U1 G( q 首先,在编译过的u-boot目录u-boot-XX.XX\tools中看能否找到mkimage这个文件2 ~. I8 i* T$ o/ U( l
! G" Y1 H- ?2 M- a& A. [$ y% ^
$ c" f$ `/ }# ~: \. l) p
7 s0 v \9 m; G1 @ @! d 然后打开terminal中,将这个mkimage复制到/usr/bin中3 O( s0 Q$ M, r9 q; M
+ S; I3 G- `4 k( e1 r, [+ _
& T" s5 X% g, J% Y) @) n* n: [
* h n$ u* }7 H/ e; i
测试mkimage! x; r0 F7 O! e" ]
9 u- Z; l! Z6 b+ A: d! o3 _
6 [$ i: @, V" d" | U7 e
! m. [- X9 T7 K. d 一切正常!!!!!!% C" S# ]6 J) z* ?; N: D2 r; C
: P/ |4 R' k5 T$ I 6 r y# _$ E1 h
然后在镜像出输入相关的命令
- P5 c f: {6 W1 g/ t3 O
" s+ L8 d$ i: E mkimage -A or1k -O linux -T kernel -C none -a 0x0 -e 0x100 -n 'Linux for OpenRISC' -d vmlinux.bin uImage# {) c r9 O2 z( T, B3 K
2 v* Y9 Z1 M1 E0 @
- z A4 ^% [% B0 e
6 b! F q- O5 y& T 这样就可以利用u-boot去download并启动linux镜像了。
1 v( ]* Z! k3 Y! J$ ^# Y8 _4 g1 }/ p# Z7 q S. W( {# e
现在把制作好的u-boot镜像uImage单独拉出来放着。
" n7 ]) P/ I9 x) a8 K- D3 \4 j( W7 c7 y O' i& g$ y
然后在windows用一个叫做tftp32的程序来提供tftp网络服务器% M5 B, c* X0 b+ n8 s6 {3 W
) m% B$ G) S8 v% m
% e( S |( j2 u& B$ Q
* u8 p: c$ t% [9 z6 t* n$ o1 o: m 设置好本机IP和uImage路径,
% y2 Y+ ~' A9 d# E" E, n5 C6 z4 Y9 P& W( m! Z: _0 K
3 u* {5 M3 _0 G6 Q* u
: H+ ~0 L6 i; x3 _! ]* O: B: j" \ 接下来就在u-boot上输出命令来load进uImage7 ^+ O2 P7 Z( {/ L3 m
! z; V" |0 x1 M& ^/ d6 A
4 Z- N2 H+ E: l6 T( ]& W' d9 Z4 ?0 Z' Z+ P, G8 `
然后输出bootm,可以看到启动信息) |$ `# S% d$ X6 @3 ]
8 L3 |+ x9 [2 n0 m0 @- _8 d
( z2 C8 Z5 S" X, {
% K7 @9 U/ X* n2 M
+ s( y' ]( L9 c2 h# J& E
Q# {1 _% n5 E. W7 e, z* c7 N$ J5 ]5 {& ^- c- k+ B# A
9 j1 D! \: ]5 d, S- g: w: c 至此,基本上kernel是通的了。
9 R' {" }+ m- O( g2 S+ y4 s$ z6 t# C# e
% w+ ^9 f. b4 U- w$ Q P2 J 由于现在我的水平问题,理论基础不足的关系,还没得涉及到linux kernel方面的东西,所以现在也在继续恶补当中,想法是先从学习怎么去写设备驱动,然后回去再学习kernel
3 ^0 N$ s, c% j) Y7 ~# Q% z/ l4 S7 r9 ^
然后在下一次我们回过头在SOC上添加gpio模块去,然后绑到板子上的LED灯去写第一个的GPIO字符驱动程序吧~
( L) J6 j/ l" y1 d5 ^
( B! N% Y6 U5 b- {8 X! O Blog写到这里差不多追上我现在学习到的东西了,所以还是要勉励自己多花时间去学~) d! @4 P) @; c$ ~
5 q* X6 v+ p0 i; L5 K9 B 介绍一下我现在在看的教材吧~5 ?& m% X: I# E& h5 B
2 M* d/ m9 k0 ?0 x1 I' Y 《Linux设备驱动开发详解第2版》宋宝华,宋老师现在在编写第三版了,书出来的时候必须去买了~+ f7 I$ O: w1 R, _
2 N2 ~1 K- W$ K: g
《Linux设备驱动程序第三版》,传说中的LDD3,啃吧······1 e @2 h2 i$ v! y) u
! T( V) L$ Z1 N- e8 I4 Z. v# n
《The_C_Programming_Language》,不断重复地看,加深C应用能力······
: j' E5 @( `3 J0 m0 M6 h8 }6 s* w. j8 ] D* b, z
《C Primer Plus》,巨厚巨经典的一本书,不解释,啃······( D- [( T3 i. X
1 C" e l; l3 v6 [+ m% ~ 《操作系统精髓与设计原理第5版》,补充地看操作系统概念······6 N1 }( C# n- M& M" [ _5 k1 `: g
$ s* b! _4 S! \$ u: D& x 希望大家还有更好的建议和好书推荐推荐~; @' a( y8 T4 g9 h" _' w
; c& J: }/ H3 a+ J* S% d0 w$ n. H, [
8 [: p' ?: s. T5 R2 h |
|