EDA365电子论坛网

标题: linux学习之路_编写ipcore 的linux driver,然后run helloworld [打印本页]

作者: mutougeda    时间: 2021-3-2 17:40
标题: linux学习之路_编写ipcore 的linux driver,然后run helloworld

) l% \- c  c; y8 B/ h3 x. b引言% u/ X7 J) Q& a$ l) s

0 z- S4 G/ |8 i" t9 {我觉得ORPSoC的关键在于‘P’,即programmable。SoC的有优势就在于只要是满足总线interface的ip,可以实现plug & work。
% o7 {" X" E$ m: d
$ c, \4 R0 @6 b" M. Z$ `所以一旦完成前面的工作之后,添加属于自己的ip core到ORPSoC的wishbone总线上,并编写它对应的驱动就成为非常关键的一步。
  F+ j! X- U% N8 ^
, f2 j4 _3 y5 T# V) `2 _5 r本小节就做一个简单的例子,来说明需要完成的工作步骤及其中遇到的问题和对应的解决方法。
/ \5 H( b; ]/ q9 k9 A7 P  k/ d, [# k5 i+ c. P8 x$ d3 g4 }

6 P% }! r, o0 `: Y' {% ^+ O" G# \- S2 |3 P; c
11.1 编写wishbone为interface的ip core(ip_mkg)1 a  [, C0 d- T) j0 ^9 q2 w) R

: M8 {+ H% N% R) Q1》这一步请参考:. b" g; t) o% t" _
4 ?' y7 h; ~0 g8 n
linux学习之路_wishbone实验5 Y  s1 U% b. [$ ]& X# }- r% o
, |/ _( x5 z# |  G. p
2》将其中的my_slave_module链接到ORPSoC的wishbone上。+ n9 h6 O, U4 m4 `- ?

% p" L* ]. i& m! Y# C
1 `# g0 a7 }" t8 W# t( F1 E( |2 r; D$ j3 B% U
11.2 编写linux下的driver module4 }# |. t: \/ {

% F6 ~* z# i. g; n代码及makefile如下:
6 Z. H! F/ S, @
. C9 _$ t- |$ K1》ip_mkg.c
; i7 \/ [: u- n+ _# ]7 s, s7 g
- |- @' y4 G* c0 a" f' `. P
* w. ~- Z. z# v- z6 @" v8 C! a0 S9 Q# N
                    4 B3 w3 `0 e3 P! h( A
! {: z) F9 t# Y" {" Y

6 e: z& e8 T0 w6 M, h  e* z; n2》ip_mkg.h,需要注意的是ip core的基地址是在写verilog HDL时指定的。
5 p) q6 {/ H) m- g. e* o  _) K( A5 c" x8 Z) q
      ( E- a5 ^+ n: W3 Z7 g* A

4 @$ g% a& `+ {' r. V% }. T; ~% y( D8 R% y
3》Makefile1 s0 g# u8 p/ e! `! k5 ~2 n+ Q
, T- s# C- V) O% g
      
- ]1 s# T% k/ F: q( U7 S
9 z; l- ^0 d7 L1 o2 W& d1 S" S- q
2 n2 Z3 @2 T% R: H* [9 S11.3 遇到的问题
1 V6 g  k8 J" ~6 G5 M/ o# F& r
: W$ R( Z7 u* \" H1 X# X, p1》当在执行make时会遇到如下警告:__ioremap undefined。
9 t$ b+ t, r' \( k2 Y; v% i# {, _0 \

& i" L' q- F- A0 S  a
! t3 m$ [$ j# G; W2 r4 ]+ m
% ^+ s* k2 \, K4 U
, H! x; g( R7 H; T& S) E& c2》在板子上insmod时会遇到如下error:unknown symbol __ioremap。% w& Y1 m0 x! I
' c1 ^- x( i! S

" ^  _' u! c' n% q$ a/ t# \- W
2 F/ y# H# u+ `: Q6 K9 E4 c+ u8 b4 o: i& k3 {/ j7 @, P" ]
+ |3 L; o% A$ F* e, m$ `
11.4 解决方法
( \# C8 ?9 z6 y4 Q* \" ]
- X. K) D/ F( Z- j) x2 x3 r在arch/openrisc/mm/ioremap.c中添加如下代码:并重新编译kernel。
* Z8 l% H& g4 K- S* w# t4 Z2 W! ?+ x8 i0 b

" M  C5 h& H; u* T6 w
$ \0 R$ u9 W' }5 q1 o( v; ~; q, J' h3 z) U6 ^% v; l
11.5 小结
) I7 u8 c& a! S) P
  z( P: m0 {0 ?3 j1 e实验步骤
& z# q7 A8 ]% e0 y
7 a/ m4 q; Y4 |- Y1 J+ _: d8 g! d0》virtualbox虚拟机unbuntu上安装nfs服务
" w5 m9 r  V! _, L
3 m* d: g, E" L+ Y* u" G; L0.0>确保virtualbox能上网
* g% N5 s2 p0 s7 Q3 [  h* ]: r. q1 @3 {( X7 L. o( f
0.1> apt-get install nfs-kernel-server2 X+ f; L+ P" {' [1 Y
4 x  X$ w# T; L  R. ~2 E& `
0.2>创建nfs共享目录:mkdir /home/openrisc/nfs5 Q: G' t/ V5 Q& G

9 ?- \. x8 F; J5 M9 X0.3>vim /etc/exports,添加如下内容
2 {/ Q0 P+ ^/ j
9 k1 I* ^: M* K2 |5 {0 ]) r/home/openrisc/nfs  *(rw,sync)
' H3 G7 h' i" b; k. [3 C* p3 t' o, m2 z2 c& A" ]7 U8 A
0.4>重启nfs服务3 L2 H' ?; P  {; }' h

  t6 Q0 O* x; vsudo /etc/init.d/nfs-kernel-server restart
3 z& R' F/ \; h9 T, L+ X( P! V/ h4 `0 }8 ?) r5 `/ m( f
1》修改arch/openrisc/mm/ioremap.c
+ ]: ^% s0 G9 N( l" E+ c+ b9 P2 ?  O# j: c2 M. m
2》cd /home/openrisc/soc-design/linux* t5 ~0 J- V$ b6 Y; m. ~: Z0 \; M
8 c; ^/ K0 |) c+ N
3》make ARCH=openrisc defconfig;make生成vmlinux# A5 n$ y: x  |. l6 k
5 p/ i& y2 C9 ?# [4 d" k) r
4》cd 到ip_mkg下,make生成ip_mkg.ko模块文件
7 U8 Q% d( x: j0 F0 p
# m# o0 L$ G: d3 h) J* Q5》在FPGA板子上运行linux(刚刚生成的vmlinux文件)2 l  q. H) ?) o% V! z; j8 W

2 J- \+ I; R* ~; i! z6》配置virtualbox的ip
& W, C6 L( W. \5 S( c8 ?7 ?- }% g% R8 C) T9 S0 ~! i$ U4 F, \$ ^' c
sudo ifconfig eth8 192.168.1.101 broadcast 192.168.1.255
# S& B/ i0 b6 L8 v/ T% K
' i3 H1 V$ i2 m% U3 g7》配置PC机的ip为192.168.1.102/ J6 `5 `- y5 e
# N9 B- v- H! k) A0 I3 |0 U  n
8》板子起来后默认的ip为192.168.1.100,如果不是,则需要配置为同一网段。确保板子能ping通virtualbox。别忘了将板子和PC用网线连起来。
0 _; Z$ j: Y' R
5 q- k0 C. m' A$ ~9》板子上执行mkdir nfs,创建本地nfs共享目录, m! ^  Q) |3 L% [( U3 D8 A0 H

6 E! c! t: Z; Z10》挂载NFS:mount -t nfs -o nolock 192.168.1.101:/home/openrisc/nfs /nfs6 R/ y' W& \9 V5 H
# M% b4 y$ p" j- R& ]2 }/ B! T
11》在virtualbox里将ip_mkg.ko copy到nfs共享目录
5 R& y4 r. R7 \8 P# B: R! E) X- \# ]. x3 c$ ]4 ?; `+ m
12》板子上cd nfs
8 Z& J* ^6 C0 U0 m# w- L0 ^& b. |# o8 S; y
13》执行insmod ip_mkg.ko加载模块,可以通过lsmod检查一下
: Z8 y. p+ J0 e7 h) U9 Y: F/ v* Y# m  f* n
14》创建设备节点:mknod /dev/ip_mkg c 102 0
. Y7 N; I# r; ]- U! v0 o& W6 K0 C: T2 g7 F( H
15》测试:cat /dev/ip_mkg,看到如下结果:
8 ^( X$ {% o! B: f; N7 k  J# g' K
, s( b7 W8 w/ r# X16》上面的命令确实有些多,如果不想在每次板子起来后手动敲键盘,可以修改一下rootfs的启动脚本文件,这样就不用每次手动输入了,文件路径如下" W6 n2 {( l7 R; a* H1 r9 p
9 _9 w# Q' W; E; X
soc-design/linux/arch/openrisc/support/initramfs/etc/init.d/rcS& z9 T7 x7 r1 z, O) a
; z4 @% F  [. @4 X! ^2 h
\soc-design\linux\arch\openrisc\support\initramfs\这个目录就是用busybox制作的rootfs的源。 3 j5 M4 X7 K; V1 U1 d

" ]) r! a0 _& B6 m, X& F3 Q/ [ 7 r* [- @2 W! ^" m0 K0 I
# F% Q* d0 h* W# [& f# @) W

/ D4 @  y9 s; Q5 P- t" H5 l  W- C4 o' Y2 m
16》运行helloworld: j0 i' e% v  K! {$ F

) ^% `* M1 U: j! w# O" I+ o16.1>编写hello.c7 [# u) A) d' {0 P' d( P

- Q4 ]; p# t: [9 g5 L * K. j! k( G7 W+ B

/ I! E/ N5 d9 o6 i/ X1 O( x1 c: W$ v# Q# ~
16.2>编译: or2-linux-gcc hello.c -o hello
. s7 s# t+ v7 Z  @  [" k
9 {& H; M, D' _* q3 r16.3>copy到板子上:cp hello /home/openrisc/nfs* N+ |% s5 o1 w6 [' |, k) o" S3 F6 N
+ [* r2 K& ?3 o% N  K6 U: M( O
16.4>在板子上cd到/nfs,然后ls可以看到刚copy来的hello文件,最后运行:./hello,可以看到输出:
0 O& G: O! L% c' _# k: P" F6 j
! G' [2 K4 C) W3 O8 v& }
6 j; p; o% l3 D7 V  m
- U2 `, h, J1 [" ]: Y: q
作者: zawq    时间: 2021-3-2 18:11
每天学习一个小技巧




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2