Professional Documents
Culture Documents
009
第 29 卷 第 23 期 计算机工程与设计 2008 年 12 月
Vol. 29 No. 23 Computer Engineering and Design Dec. 2008
Design and implementation of embedded Linux network device driver based on SPI bus
ZHANG Xiao-lei1, CHEN Xiang-ning1, GUO Jian2
(1. Safe Communication Research Lab, Nanjing University, Nanjing 210093, China;
2. Nanjing Research Center, Rainbow Qiangxin (Tianjin) Technologies Corporation, Nanjing 210093, China )
Abstract:The network device based on SPI bus is a new class of network device, however, the design of its driver isn’ t analyzed
generally. The embedded Linux network device driver architecture based on SPI is discussed originally and how to write a new network
device driver based on SPI for embedded Linux is explained.
Key words:SPI bus; network device driver; embedded Linux; ENC29J60
收稿日期:2007-12-02 E-mail:cnlunwen@163.com
作者简介:张晓雷 (1983-),男,河南信阳人,硕士研究生,研究方向为嵌入式操作系统和计算机通信; 陈相宁 (1967-),男,江苏镇江人,
博士,副教授,研究方向为无线通信网、接入网技术、网络信息安全及信息论、信息处理; 郭剑 (1978-),男,湖南永州人,硕士,研究方向
为嵌入式操作系统和数据通信。
- 6003 -
SCK
计;②通用网络驱动程序接口的设计;③网络芯片的控制设计。
主控制 MCU MOSI SPI 总线 驱动位于 网络驱动的 最底层,直 接控制芯 片与
MISO MCU 的数据 包和控制命 令等的交互 ,它不考虑 传输数据 的具
被控制器 1 被控制器 2 被控制器 n 体含 义,只是 每次简单的 接收或发 送 8 比特数据 (或称为 一个
SS1 SS2 SSn
octet)。这一部分 设计的好坏 直接关系 驱动体系是 否可用。
通用网络 驱动接口的 设计的主 要工作为驱 动设备的 net_
图1 SPI 总线的构成 device 结构的初始化与注册,该结构由嵌入式 Linux 内核定义。
其中 初始化过程 将 1、3 步骤针对 网络芯片量 身定做的驱 动函
时,必须使用每 片的允许控 制端,这可通 过 MCU 的 I/O 端 口输
数映 射到 net_device 结构中,并作为接 口函数提供 给系统,这
出 线来实现。 但应特别注 意这些串行 I/O 芯片 的输入输 出特
些接 口包括 open()、stop()、hard_start_xmit()以及请求中断 函数,
性 :首先是 输入芯片的 串行数据输 出是否有三 态控制端 。平
注册 仅仅是通 过调用系统 提供的 register_netdev () 函数将 已初
时 未选中芯片 时,输出端 应处于高阻 态。若没 有三态控制 端,
始化 的设备告 知系统。
则 应外加三态 门。否则 MCU 的 MISO 端只能 连接 1 个输 入芯
网络芯片 的控制主要 根据芯片 的 datasheet 为驱动函 数量
片 。其次是输 出芯片的串 行数据输 入是否有允 许控制端。因
身定 做,并通过 调用 SPI 驱动接口在 网络芯片与 MCU 之 间传
此只有 在此芯片允许时,SCK 脉冲才把串行数据移入 该芯片;
递控 制命令与 数据包。
在 禁止时,SCK 对芯片 无影响。若没 有允许控 制端,则应 在外
围用门电路对 SCK 进行控制,然后再加到芯片的时钟输入端; 2 实 例
当 然,也可以只 在 SPI 总线上连 接 1 个芯片 ,而 不再连接 其它
S3C2410 包含两个 SPI 总 线接口,每 个都单独拥 有 8bit 的
输 入或输出芯 片。
移位 寄存器用 于传输和接 收数据,我们在工程 中采用新 型的
1.2 Linux 中 基于 SPI 总 线的 网络驱 动体 系结 构
采用 SPI 接口的 ENC28J60 以太网 控制芯片作 为外部网 络芯
Linux 内 核基于 SPI 总线的 网络驱动体 系结构如 图 2 所
片 用于 对系 统 进行 控制 。ENC28J60 是全 球目 前 最小 封装 的
示 ,驱动工作 模式的设 计包括 3 个方 面:①SPI 总线驱动 的设
以太网控制器,在此之前,嵌入式设 计人员在为远程控制或监
dev_queue_xmit () netif_rx () 控提供应 用接入时可选的以太网控制器都是专为 个人计算系
上层下传数据 sk_buff 向上层传输数据
统设 计的,既复杂、又占空间 ,且比 较昂贵。目 前市场上 大部
网络设备驱动接口 分以太网控制器采用的封装均超过 80 引脚,而符合 IEEE 802.3
协议 的 ENC28J60 只有 28 引脚 ,就能既提供 相应的功能,又可
3.3V RJ-45
TPOUT+ 50 Ferrite 1
I/O CS 1% Bead( 1)
SCK SCK 2
50 0.01 F
SDO SI
1% 1: 1 CT 3
SDI SO TPOUT-
TPIN+ 4
MCU 5.0V←3.3V ENC28J60 50
Level 1%
Shift 0.01 F 5
50
Logic (2) 1% 1: 1
TPIN- 6
INT0 INT
INT1 WOL 7
VCAP LEDA LEDB RBIAS 8
2K
1% . 001 F
10 F
2kV
- 6004 -
要 通过读写 其中被 选取使 用的一组 寄存器 来完成。另外,
系统配置调用 dev_queue_xmit (), netif_rx ()
S3C2410 还 提供了一对 SPI 总线 中断信号线 EINTn,我们 使用
的 是 EINT1,申请的中断 号为 1。所 有上述寄存 器都必须 通过 ENC28J60
PhyWrite (), PhyRead () Xmit (), Interrupt () 驱动接口
GPI/O 控制 寄存器单独 设定。
下面将在 嵌入式 Linux 2.4 内核和 S3C2410 开发系统 中实
现 基于 SPI 总线的 ENC28J60 的网 络驱动程序 。同上文 介绍 Write (), Read ()
- 6005 -