TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
4 t( F- c: X+ r3 I* Z好,固化好u-boot之后就可以移植linux,直接在社区选一个linux的源码包下载下来,我之前一直用的都3.1版本的,实在linux在3.0时代开始后更新得太快了。8 U* V: ] g$ f4 Y( m1 k n
+ f! r+ L \# |% E8 z' w
但是也是由于更新得快,在3.1版本惊奇地发现linux支持openrisc架构的CPU了,也就是支持开源开到底了~
4 d% x+ e0 q1 E# o$ @7 S3 X2 A' {9 O% {4 L! t+ p! d3 w
下载好后扔进虚拟机里面解压好
6 S2 Y2 \$ b) i% _- d% t( M2 b7 y K/ S# Y6 f3 G/ u
$ e+ L& P# H' w$ B
/ c) I0 u4 }3 d! \ 然后又要稍微改改代码了~
+ ^# [- b% U! T# T
2 v0 j! t- }. S* N8 f openrisc-3.1\arch\openrisc\boot\dts
$ F* w `; | r. `1 A1 ?& n* _, Q
# F$ a$ D2 p# W4 V
* }* V7 Z7 u! ?$ [
, H o& i B5 w& Q. o 打开吧,文件名字就懒得修改了
+ c: g# X* X" n( b T% b/ @ {. f# }* v& \
这个是or1200平台相关的device-tree文件,具体在附件上传宋宝华老师对device-tree文件的详细解释的一篇blog
$ ?% d7 J$ r6 G5 r r6 e5 T
: ]3 P% A1 d5 c L& u& R1 Y+ e# o! s
1 e, v* H5 T* {0 u- R* B
0 J) ?- _" B. h3 N5 A! B v 第8行,uart波特率,u-boot设置成什么这里就设什么吧,要不等u-boot启动完转到linux启动时波特率改了又得改串口工具的波特率,来回切换麻烦,而且关键我板子跑不了更高的速度了~+ B: r+ J) c. p( C! s- H, V K3 b7 L
3 D+ K/ f- I/ i) H+ A2 r& [1 ^
* m, P( |4 n4 [( B1 D t! {- o- _6 G1 x- o$ X% x' S
P; P, f% t, n2 _+ ~5 O 12行,我在wishbone上SDRAM的地址是0,这里@0
' \# b8 [3 \6 G- @" D, D$ v8 ?# F+ }) H( p, t4 y
14行,因为我的SDRAM容量是128M,所以这里reg后面的值为0x1000000,对于自己板子RAM的容量要设置好,不然在linux启动内存检测的时候会爆掉6 h7 I0 P' s) u( b* T: ?
" G6 h A6 J- H) M) S
0 i: [) ]3 Y* R$ E7 w4 E! s+ V& [8 e" x: ]" w( {: ^6 g
23行,CPU运行频率,在synthesize时的PLL或DLL的频率是多少就设置多少,我这里是40M, M" q: s! V7 c7 \
! }. r% |* H/ w8 b5 c; p& d
" E- x7 _# V0 X3 j, n
2 n/ r4 R2 C5 W! ^( f& a. f
38行,wishbone上UART的地址是0x90000000,所以这里@90000000
4 D' e2 W& K5 M; s" d: {
6 E7 m3 ]- ?3 r2 J& N( o 对应40行,UART16550用到的地址范围是0x90000000~0x91000000,具体这个device-tree文件如何去写在后面宋老师的blog中慢慢细读吧。* T, C5 h& B& {. E
4 @( s/ H& Y9 {3 I9 m! O
41行,UART使用的中断号,在rtl文件or1200_soc_defines.v中定义的
* |; y* v& n2 h+ F6 A0 |0 [: N% [6 g( ?) k% b7 s, u s
# q& i: z6 q# x+ M( n2 V7 p
/ U' ^+ w3 \( M% {8 |( J7 C 中断号,我UART使用的是2号中断。
: L) z! C1 {, M
/ h* S' H( s: D) t. c+ T# [2 | 42行,UART的频率,我的是40M
+ L' e* _5 F* {
& {& x, @: t$ Y: ]
% `2 X/ i1 {; S0 n" e/ C
4 r% @. I+ I4 h& k. m 再下面的就是opencores社区ethmac_latest.tar.gz的描述,如果用的是这个ipcores来驱动网卡phy芯片的话,这里修改成自己soc中wishbone总线地址和ethernet使用中断号即可。
) K# o. t7 l& ]1 Y2 r* B: C9 S6 |8 {) J p- p+ K
7 D7 t" L' |9 |; g
; |3 d; K4 O! E; p6 ?. d: T4 J
再往下的在移植linux的时候先屏蔽掉,是gpio controller和i2c controller的描述,等成功移植好linux再回过头在soc上加入其它外设控制器,再把device-tree丰富起来~
8 X' }3 Y$ a7 S) C/ Y, ]. L& d" w' I! ?! H: K2 O) k- p8 ]2 c- w
Device-tree简单地就修改到这里了~
- x1 ^0 L' W( X/ G" C3 f
( w" X: X# k! L 然后就轮到目录openrisc-3.1\arch\openrisc\mm下
/ ]+ K$ v& L m# D- d4 w# B. U9 ]! r6 B6 j
+ d5 k; K$ j. U4 \+ z/ w: P
0 p5 J$ G6 h9 X: h
Open 之,, K' J' ?1 O: n9 I; Y& s
' X; h8 `& S5 e' {) e3 Y% o) u
( i8 ?! z! O) T: P N4 \' [. i
$ n! K- J& f" j& k 84行加入EXPORT_SYMBOL宏,要不在后面写驱动的时候加载模块会提示找不到__ioremap()函数。
. @' {0 U5 z& ]. ?1 H* o2 @- V1 F! P' Y6 M9 R- ^
往下点
' y; s% G; R6 j4 f o( L) |+ J" Y# O+ r% P) @
/ e, L' h7 B1 s
: s( \% h) B1 D 111行,这里也加
; v B# c" ]9 v. I. ?
" y2 z1 p* ^, N OK!
/ w3 T1 h. y( r h- o3 d' x; f- j2 Q9 z0 w$ [6 c- ~3 C4 N( n
继续,目录\openrisc-3.1\arch\openrisc\support\initramfs\etc\init.d下的rcS文件,修改这个脚本文件5 ?) Y' r1 P- S+ I
1 F: F) G9 d) k8 q
K& `% X; z8 v3 H/ Y8 z
' Q {' L! |5 D6 ` 在最后加上,为了查看自己编写的驱动模块信息时不报错,修改到此0 z; o- @, _& J/ e1 N
$ `! Y* m F! q# Y5 d 惯例,先在or1ksim上试试启动linux,在镜像的桌面Get_start.txt中有在or1ksim上仿真的流程。
& j! B, b3 k/ J( U- q" c% D5 y
' Y( Z' B* w6 \
5 ]/ z6 D: B) V8 j& r; P& W7 f5 K+ q9 J2 ~0 _
直接copy入终端一步步完成就OK啦,顺利就可以直接看到linux的booting messages
& I* p( P* X. o6 y5 U4 l6 M
& j- R$ [; ^9 D. P& a 好了,or1ksim的仿真就不贴图了,然后回到我们修改过的linux源码目录来,打开terminal吧~" S4 m, {# B- h# K' q! Y
' R0 o$ g7 A+ U, f, s# l
0 a. ]- U* z8 ]$ x
' T( r6 Y8 g+ @/ | cd进内核目录后先自行看看内核配置:make menuconfig ARCH=openrisc CROSS_COMPILE=or32-linux-
1 S* `7 w+ g5 ~# U) H; R$ j% H
1 j$ O, R2 d9 ]- d9 q0 _
1 ^& {" o" b$ M2 a5 V
1 e. }0 y4 M8 @
这些都是linux3.1版本关于openrisc架构的内核配置,熟悉内核配置的话可以自己配置了,反正我是不怎么熟,要用到的时候还要去google选项的意义。7 Y% B* A) S+ y6 C+ \
9 ^5 q8 w+ j8 @
其实现在可以什么都不动,后面添加别的外设控制器的时候再去配内核选项,然后exit。
* R6 a; @ Y! l" J" C3 O, i
7 m& G: {1 @/ S6 v) O" u) h
& w0 a$ O1 p0 z/ o1 V( H
2 F' e9 }5 t$ y7 ^0 C' x2 J# W; k& X/ m 退出来就可以直接make
4 } w( M2 n0 R
; k/ t7 ?7 J3 k, q
- _" Y1 Q n6 O0 i" Z5 C3 Y
0 A& Q7 d9 G. Z* @8 m. a 最后会生成vmlinux.bin文件,
7 x( q; l* [/ U( e1 s! T7 E6 v5 D6 \) W0 x6 S3 e5 @7 I+ [
然后就是用这个vmlinux.bin制作成u-boot识别的镜像。8 q1 y% h: |# {- t$ }; X; {! [
. p# V8 h- j$ X 首先,在编译过的u-boot目录u-boot-XX.XX\tools中看能否找到mkimage这个文件
4 T" ]8 q1 r3 { J# m
S0 ]/ I, T& [; J9 Y3 [5 e8 v5 |; n
9 ^- j8 A, H) Z Z j
% J$ C( L+ v% z7 K L8 z 然后打开terminal中,将这个mkimage复制到/usr/bin中
5 e, w! r, R2 W* ?' e3 s# F( x8 s, Y5 T6 C
: H. Z2 _4 W, o# w
* x' \' s# X' y$ t; [) n- e( k+ W
测试mkimage5 `, f5 f3 N w: @/ J
* R! E, y0 v9 f2 ]- q q7 P% E5 L
* ^) M% R( v" y0 o
# L- c7 Z# E2 R, n' j. e5 o 一切正常!!!!!!' u9 }3 w0 l9 }1 p2 U; a1 L8 C8 ?
: Y- n0 R; n6 [
/ F) q8 C( g: m- }9 G' } 然后在镜像出输入相关的命令7 Y; k- ^0 b4 F2 d: I w- p7 e, ^
) C( n. U" _5 v
mkimage -A or1k -O linux -T kernel -C none -a 0x0 -e 0x100 -n 'Linux for OpenRISC' -d vmlinux.bin uImage2 v# \/ V+ W% Q# e. \9 ^7 i/ v( Z
' {6 x& y! h i; P
# ]5 ~4 t k2 j# T! O+ Q2 g2 C1 ]# m: Z2 M `3 ~) `
这样就可以利用u-boot去download并启动linux镜像了。
( Y+ T7 U. w% v/ p) B @2 b9 U+ T
1 y: B1 c+ ~" A0 U3 a$ |" v 现在把制作好的u-boot镜像uImage单独拉出来放着。
7 t- e7 k7 @. `( H. N! ~. |* F; j# h+ V3 T3 s
然后在windows用一个叫做tftp32的程序来提供tftp网络服务器
$ d- j$ y1 Q B% G" e* E; |# u- Y5 s. G/ R" [5 I5 z
y T( H5 w3 X- p5 {! k4 ]
) {) w/ L# q4 Q! x- M, | 设置好本机IP和uImage路径,
7 Y1 S# f- z( F' s5 e0 k) L5 s& n4 o g# R4 w; ^
1 @- L9 G* ^9 s u( h0 S
% B9 ]/ G E; t, Y8 ^ 接下来就在u-boot上输出命令来load进uImage
- y+ u. a! |6 S7 Q M( g* J! q( {0 i, R: O$ N; P
. Q6 ~1 z: p4 M2 n
6 q* k# S8 W( [. v 然后输出bootm,可以看到启动信息
: d4 H8 y5 r8 V' x5 N P1 e+ {+ G3 Z) r# w
1 @# L& P9 l. B8 x3 ~
' S! l8 N' e$ x! A0 L. R- h
' ]' f( w2 }! S3 J8 R+ O2 J& x
: f) q: l" g0 C, w- b$ o! B
# D+ y2 n& V, T1 B) I" e* H# I/ n7 ~" ~: `
至此,基本上kernel是通的了。
9 o, s% }) |1 D- @4 y+ J ]; l) X5 z# Y1 T" j' B5 W. f4 W
: o" I! s6 s5 S# A. L( i, I
由于现在我的水平问题,理论基础不足的关系,还没得涉及到linux kernel方面的东西,所以现在也在继续恶补当中,想法是先从学习怎么去写设备驱动,然后回去再学习kernel
* X* c% Z& _, b z2 G& {4 S, S: \" G1 ^2 L& V: }' E0 u: h, ]8 b$ ^
然后在下一次我们回过头在SOC上添加gpio模块去,然后绑到板子上的LED灯去写第一个的GPIO字符驱动程序吧~$ c- g) E( }/ ^( C0 \
7 @! _# \ r8 f4 h Blog写到这里差不多追上我现在学习到的东西了,所以还是要勉励自己多花时间去学~
U" L+ d( q" F9 s6 L: K& J- W6 e/ E$ D9 C
介绍一下我现在在看的教材吧~0 u1 {) \2 Y' q3 k
, o3 O: {+ [: J0 C0 Q9 | 《Linux设备驱动开发详解第2版》宋宝华,宋老师现在在编写第三版了,书出来的时候必须去买了~" i9 ]6 m( ~! \' n6 Q9 H; M
: k% }7 }: M( h6 j1 e9 ~! Q
《Linux设备驱动程序第三版》,传说中的LDD3,啃吧······7 {8 q ~$ \5 l w7 R( R6 b n0 t
0 p7 Y9 s! q; _0 Z- x* B& t. P 《The_C_Programming_Language》,不断重复地看,加深C应用能力······
' k. E4 h( _* z6 D: O$ E. `( p7 J( G6 t4 H. d# [& p! h# F
《C Primer Plus》,巨厚巨经典的一本书,不解释,啃······
6 o) c5 d6 C- r2 x0 P8 u3 A9 y% i
+ ^" L3 H9 B0 P( W8 f0 Y0 H 《操作系统精髓与设计原理第5版》,补充地看操作系统概念······
- i( T7 w: V0 U8 }( L' `
% [) l2 _; s d7 r4 i3 {$ Q# l. t- ] 希望大家还有更好的建议和好书推荐推荐~
- G! E8 J! m) G' d3 y+ v) W( {
. O( X) {$ I/ h: j9 k: W! `( k- p1 M, Y
2 r( e1 g* G {3 F
|
|