找回密码
 注册
关于网站域名变更的通知
查看: 384|回复: 1
打印 上一主题 下一主题

Linux驱动移植——ENC28J60以太网控制器

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-5-27 16:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
开发板:E9(飞思卡尔的imx6q主控)
1 s7 K& ~  Z) |5 l8 f: Z
& W7 W2 @6 U( P+ t. K内核:Linux 3.0.35
1 D2 s: O. i6 \9 O
+ F. t$ j& Y9 @1 ~3 YPC OS:Ubuntu 11.04" Q& m# S) l. p

2 z7 m  x& o: j# M) q- E9 W' m
' A" T8 a/ k, `( j, i; N
: x% m, @5 X7 O( _1 f  g' |  ~本文对ENC28J60模块的驱动移植进行简单梳理。该模块购于淘宝。# z$ V, Q$ B" f- u- I; E" k& c# ?

  U1 q/ H# I1 r- P# b3 F3 F7 I9 v% t按照一般移植要素,有如下几个步骤:
+ _1 S$ s: Z: V9 f1 ?% u$ w. T. p9 n7 B( x, k5 {6 P, A0 e
1. 按照各引脚所对应的功能进行初始化操作。2 o% F" o1 z. ?: X* t
8 @( C6 k9 T4 F! d
2. 确定总线类型,在bsp中注册相应的主控制器信息。% U; s7 w& l+ \8 k0 T- f

( G' E6 m  ?$ c6 M3.在bsp中添加设备信息。9 D; [$ z+ Z3 `1 D4 n7 C5 R
: _" j2 \  l* t9 d9 G1 w8 m
4. 配置内核,打开设备配置选项。
/ Z9 ~9 T6 ^& S; I3 T$ `, ^0 H; h. j  I
  ^6 P" W' n4 m) N
  F9 ^4 d4 Z, k' e  B! E7 v
1. 硬件连线方式
0 @9 d8 ], P7 g+ {: l  Q    IMX6开发板                        ENC28J60
" w+ |! k" ?& g& Y* z
6 O2 i% t' \& s: C. eCSPI2_CLK        --->               SCK$ \' ^) ~8 V" N) y' L

+ g, q1 J" z) m( iCSPI2_MISO      <---                 SO" Y% C$ U: c* \' G& d& X
9 D- h* X/ p" K) S6 k
CSPI2_MOSI      --->                  SI
9 B" C' P5 p, G  \- u8 }+ E, A+ K* |8 m
CSPI_CS0          --->                 CS6 q: @2 T' F# f8 ^. [" N$ [

. C) {$ V! B8 aEIM_D21            <---                  INT
+ P: w0 O: E  s* w8 [2 x' }7 |* f8 C# J0 P
VCC  3.3v             --->                VCC
: e9 l  v$ f1 e8 c, q# _1 J7 n
+ r6 \6 c4 C  n8 b: R* zGND                     -->                 GND3 R+ @9 T, O/ C& o
# N% o4 Q1 u) ]

- }6 b4 b/ G) C* x6 l& ]/ X+ G+ Y0 G! ?+ X* z2 G9 T

3 o/ b$ w. y8 M0 L  Y; p2. 初始化引脚
9 r+ }5 i2 \- W/ U从硬件连线方式可以看出,SPI总线使用的是imx6的SPI2控制器,同时额外需要一个GPIO作为中断引脚。8 L8 D+ g) p3 K
; W4 O* u, p$ @, T* v! K
在原文件arch/ARM/mach-mx6/board-mx6q_sabrESD.h的数组mx6q_sabresd_pads数组中添加如下内容:7 F" A1 h; v$ f/ o% S" ]

/ O; u7 }! D' o, l/ L        /* ECSPI2*/4 I! @- k! K' }9 |7 D5 Y
        MX6Q_PAD_EIM_CS0__ECSPI2_SCLK,
! i* k; L2 z9 n+ R+ n) E        MX6Q_PAD_EIM_CS1__ECSPI2_MOSI,6 P) F: h+ z# U$ H( t0 b
        MX6Q_PAD_EIM_OE__ECSPI2_MISO,# W. N2 W0 W4 A0 A1 X1 a
        MX6Q_PAD_CSI0_DAT11__GPIO_5_29,       
' [( x% M3 L, V2 s$ B        //MX6Q_PAD_EIM_D17__GPIO_3_17,. ~7 O9 d4 {! c3 ?+ J9 J
8 p9 `9 _0 n9 C0 ~8 r6 _
        MX6Q_PAD_EIM_D21__GPIO_3_21,  /* gpio interrupt for enc2860j */
' k3 i" [0 H5 W2 t- I3 e/ [% c: `2 r; G  g+ t4 ~. G
3. 注册SPI控制器和SPI板级设备
: ?# d* s  x( p- ^( s6 w  c由于ENC28J60使用SPI总线,因此,在注册板级设备设备前,需要弄SPI的一些参数。
( e- g  Y# q: P1 U
- X% i7 t/ O9 P/ \ENC28J60使用SPI模式0进行传输,最大速率为10Mbps。0 E) e. a+ O8 J
0 ]1 p1 r  C( q2 a- P
在原文件arch/arm/mach-mx6/board-mx6q_sabresd.c中添加如下结构体的声明:
* o* M7 W; T4 V
+ J% _, ^0 _. ~5 F( t0 `/* Following is added by Jone Yim for enc28j60 */
. h$ v) v* C- w#define SABRESD_ECSPI2_CS0      IMX_GPIO_NR(5, 29)    /* CSPI2_CS0 */, ^2 `0 [' R$ q" w' k; f; V8 q
#define ENC28J60_INTERRUPT_GPIO IMX_GPIO_NR(3, 21)    /* EIM_D21 */. C# k3 O5 y) O. x" h+ f
4 y' ?  {0 Y5 v5 }
static int mx6q_sabresd_spi2_cs[] = {8 _5 m; }7 i4 ]8 b# p( ?
        SABRESD_ECSPI2_CS0,$ g: V; r( M/ `. ^
};
: K5 x$ I% X8 ?3 W# a& W- x  G1 a: s; K. y
static const struct spi_imx_master mx6q_sabresd_spi2_data __initconst = {8 D7 N( {* m/ c9 s/ v
        .chipselect     = mx6q_sabresd_spi2_cs,' a  A+ s8 {. Z* ^! _2 Y
        .num_chipselect = ARRAY_SIZE(mx6q_sabresd_spi2_cs),( d5 \7 h" l4 R2 j/ E: q% ?
};& F! d) I! p, B+ r

- J2 Y) M% S' _. l: V- Q- Wstatic struct spi_board_info mx6_sabresd_spi2_board[]={9 c" \' Y5 v/ j( d
   [0] = {) K& _6 Z4 @, r
             .modalias = "enc28j60",
6 T" g! ^7 @0 b             .bus_num = 1," d, B0 l( L% h- j' r6 C: E
             .chip_select = 0,. _  R- ~' ?5 ]) G" Z. ~
             .max_speed_hz = 5000 * 1000,
, l3 o" l8 D$ x+ S1 S             .mode = SPI_MODE_0,: \9 J: K$ h# R. q
    },9 M4 y$ |) H1 [" \) Y8 m
& r! a% _0 G- e; g7 W. |
};
4 R! A6 {2 v- }( w. M; k
: c+ c. G1 d" A  k* e: O/ G- ]1 @( J% Z* B- B( T5 H! w& l
首先通过宏定义了CS和INT所使用的引脚号,并定义了SPI板级设备。# C  ^1 A- d* `

+ h( ]4 q2 J. D) J4 }5 n3 |; k4 U接下来我们需要注册该SPI板级设备信息到内核中。
$ L3 H; @+ K' Z7 P" S- l" J
% G( B3 @+ T) m, k' u& U$ D' I  g在同一文件下的mx6_sabresd_board_init函数中添加如下代码:
3 q7 x( h- V2 v. x; @: U
8 i* i4 ~* f" e1 Z0 ?  N; u  C2 s/* Following is added by Jone Yim for enc28j60 */
( r8 {* W# M  |% \. L- g% B        imx6q_add_ecspi(1, &mx6q_sabresd_spi2_data); /*using ecspi2*/2 }8 Q7 o5 J4 g# @: {0 x" ]; F
        / z. H  ?1 W3 \% b5 p% m
        ret = gpio_request(ENC28J60_INTERRUPT_GPIO, "ENC28J60-int");2 b/ C# e7 S) t7 j) F
        if (ret) {) c, w. y/ w5 p; s; J$ D$ c
                printk(KERN_ERR"request ENC28J60-int error!!\n");
$ N' V9 W6 K/ D- ], }7 g0 o! u; F        }else{6 Y- P9 h# O- u* q  C( @
                gpio_direction_input(ENC28J60_INTERRUPT_GPIO);$ s. n9 e5 N/ ?
                $ e7 k2 v6 C8 \) q& j
                //printk("enc28j60 gpio %d irq %d\n", ENC28J60_INTERRUPT_GPIO, irq);
7 x; C* e- q4 N; |; G# E                irq = gpio_to_irq(ENC28J60_INTERRUPT_GPIO);
) _- f) D+ R/ r3 g, O                if(irq < 0){' e& W) e" Q9 `
                        printk(KERN_ERR"claim gpio irq error!!\n");
: l) w& w; m% o/ p8 E                }else{4 M! j& K8 C+ i% G) x- h" r6 r
                        printk("enc28j60 gpio %d irq %d\n", ENC28J60_INTERRUPT_GPIO, irq);
: c' Y. I. @5 t) b$ L1 D                        mx6_sabresd_spi2_board[0].irq = irq;. y% ^/ q) }' q8 K
                        irq_set_irq_type(irq, IRQ_TYPE_EDGE_FALLING);0 p5 r, k0 J0 B" }$ {6 K
                        spi_register_board_info(mx6_sabresd_spi2_board, ARRAY_SIZE(mx6_sabresd_spi2_board));2 Q1 g; K% \' K* R* S+ v1 ^2 H3 x
                }
1 [1 a0 o4 W1 Z6 G+ C7 a        }
8 O% E5 `2 h2 }1 C首先注册SPI2控制器,然后在调用spi_register_board_info注册SPI板级设备信息之前,我们向系统申请了用于中断的GPIO引脚,并获取了其irq号,并将该irq号保存到SPI板级设备信息。
  u( O' q7 y( U+ _2 o  }; d+ ?其次,我们需要设置GPIO的中断类型为下降沿中断,这跟datasheet里面描述的一致。这里提一句为什么要在这里设置中断类型,这是因为在ENC28J60驱动源码的probe方法中并未设置其中断类型,反而是有一段注释要求在bsp中设置中断类型。
. `; P( J# ~! i2 r
5 m$ A3 d; n( |; Y: Y一切就绪,最后spi_register_board_info调用注册SPI板级设备信息。
% \$ i* L! l- Z1 g$ n/ H
: T6 J2 r2 N, C2 r9 W- X3 G. t( P; I/ L- E

1 Y5 I/ f: `0 X2 K. x4.配置内核% `0 u' u- W& v! s$ ]* ]' f! b
( q' e9 K' d; h
0 h* L! z' j2 q1 W$ K0 H5 i7 A* v
配置完以后即可编译。" H  c9 l2 N" j2 P& o

1 Z, R8 x1 y: Y: i/ ]: q7 d& w0 T5 Q* m) n/ Y
9 F$ _# d8 M6 H9 H5 @
5.验证( U0 P( f4 i7 t# Y/ P
系统启动后执行如下命令:( L! o7 ^$ \+ X
$ q% P/ L+ L7 I: ?+ J' d, }$ I# m/ G
ifconfig eth0 down   //关闭原有的网口' G7 j! B8 `1 s' ~7 E

- w" `  H% A3 h7 n: cifconfig eth1 up 192.168.0.116   //打开ENC28J60对应的网口并设置IP地址
, n; ~' a, [$ R& t& a$ c
# N- H1 N9 ?5 r0 U4 v$ s/ ^! m
# i: j1 T+ t% N6 I- e
6 r; N  a- F! Q# F( q$ L然后ping以下虚拟机试试:$ ^3 S+ c/ o  l

7 B! @) n2 b& q4 l0 O% X, }2 G( F0 k7 P$ M( H
. O6 L( s$ C" Z" Y% s. A0 c0 B
ping通了,至此大功告成。- \6 U9 r4 w) A' [& q

3 s. V( t! @8 D- P( M/ b: l
4 c7 q6 X0 X  ?4 _: T% i3 ^/ s4 D
9 C8 A1 _  ~, x+ r* ?4 o; y( s- e

/ X6 u! z+ F: E2 R  n" x5 V/ S# R4 F' h0 S+ u2 K- R9 A: t! t% G

该用户从未签到

2#
发表于 2020-5-27 17:05 | 只看该作者
ENC28J60以太网控制器
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-26 04:36 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表