首页 > 范文大全 > 正文

嵌入式Linux系统在S3C2440A的移植及网络设备驱动开发

开篇:润墨网以专业的文秘视角,为您筛选了一篇嵌入式Linux系统在S3C2440A的移植及网络设备驱动开发范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:文章以网络设备发展的新方向为出发点,设计了在S3C2440A硬件平台上,嵌入式linux内核的裁剪、移植以及网络设备的驱动开发,并实现了自制开发板与Intemet接入的主要功能。文章中系统的设计及实践能够为不具备网络通讯功能的嵌入式设备进行智能化改造提供一定的借鉴。

关键词:嵌入式;Linux;驱动开发;ARM

中图分类号:TP316文献标识码:A文章编号:1009-3044(2010)10-2407-02

Embedded Linux System Transplanted and Network Equipment Driven Development in the s3c2440a

ZHANG Shan-xiang, LI Xun

(Inner Mongolia University of Technology, Hohhot 010051, China)

Abstract: Article for a new direction for the development of network equipment as the starting point, designed Embedded Linux kernel cutting, transplant, and network equipment-driven development in the S3C2440A hardware platform, and to achieve main functions Intemet access the self-development board. System design and practice of the article can provide a reference for embedded equipment intelligently transform which do not have the Network Communication Function.

Key words: Embedded; Linux; driven development; ARM

随着嵌入式处理器应用的越来越广泛, Linux操作系统由于其源代码的开放性而长足发展,嵌入式领域的变化日新月异,尤其在当今网络已普及到社会的方方面面,以至于大多数的行业在无互联网的环境中举步维艰。环视现今市场上的网络设备,不难发现互联网还大部分应用于计算机与计算机之间。然而互联网应用的范围绝不局限于此,若能够为类似在仪器仪表、工业生产的数据采集与控制的环节甚至家电设备中增加互联网接入设备,则会为微电子和互联网创造更为广阔的发展前景。

1 系统平台简介

本设计的目标是在嵌入式硬件平台上,基于Linux2.6.29内核开发DM90000驱动,实现自制开发板与Intemet的接入功能。软件开发平台为基于Vmware的Fedora9系统。 硬件平台为自制实验板,其中主要部件有:Samsung S3C2440A(最高主频533Mhz)、64M SDRAM、128M Nand Flash、DM90000,在软件上选用Linux2.6.29内核,具有源代码开放,且稳定性与安全性较高的优点。整个系统软件由启动引导程(bootloader)、设备驱动、嵌入式Linux2.6.29内核、文件系统(yaff2s)及应用程序组成。系统平台结构如图1所示。

2 建立交叉编译环境

在Linux平台下,为开发板编译内核、bootloader及应用程序,需交叉编译工具链。设计中交叉编译器用Arm-Linux-Gcc-4.3.2,安装设置如下:首先,将arm-linux-gcc-4.3.2.tgz复制到tmp\目录下,然后进入到该目录并执行解压命令:

#cd \tmp

#tar xvzf arm-linux-gcc-4.3.2.tgz CC /

# cd arm-linux-gcc

#cp arm-linux-gcc /usr/loca/arm/4.3.2

设置编译器的搜索路径:

#export PATH=$PATH:/usr/local/arm/4.3.2/bin

3 网络设备驱动程序设计

Linux驱动程序的加载方式有两种:一种是静态地编译进内核,内核启动时自动加载;另一种是编写为内核模块,运用insmod命令将模块动态加载到正在运行的内核,不须要时可用rmmod命令将模块卸载。在嵌入式系统驱动开发时,常常将驱动程序编写为内核模块,方便开发调试。调试完毕后,就可以将驱动模块编译进内核,并重新编译出支撑特定物理设备的Linux内核。

3.1 Linux网络设备工作原理

Linux网络设备驱动程序,位于TCP/IP网络体系结构的网络接口层,实现上层协议栈与网络设备的数据交换,Linux网络驱动程序的体系结构可以分为4个层次,如图2。

网络设备驱动程序的主要工作是完成设备驱动功能层的相应代码,根据底层具体的硬件特性,定义网络设备接口struct net_device类型的结构体变量,实现其中相应的操作函数及中断处理程序,是整个网络驱动结构的核心。

3.2 网络驱动的设计与实现

网络设备驱动程序包括:初始化函数、数据包发送函数和数据包接受函数。实现模式流程如图3。

3.2.1 网络设备初始化

内核加载网络设备DM9000驱动程序模块,首先调用初始化模块。其主要工作有:调用内核中通用接口函数ether_setup()配置以太网、调用check_mem_region()检测I/O地址空间,然后调用request_mem_region()申请以dev->base_addr为起始地址的16个连续的 I/O地址空间、通过DM9000_read()探测网卡DM9000,读取ID信息、配置 DM9000的中断信号输出引脚、将MAC地址写入DM9000的IA寄存器中、通过register_netdev()将DM9000注册到Linux全局网络设备链表中,完成设备初始化。

3.2.2 网络数据包的发送

数据包的发送和接收是网络驱动程序中实现的两个最主要的任务。当网络设备被激活时,net_device结构中的open被调用,它负责打开设备并调用net_device结构中的hard_header函数指针建立硬件帧头信息。通过函数dev_queue_xmit()来调用net_device结构中hard_start_xmit,把存放在sk_buff中的数据发送到网络物理设备。若发送成功,则在hard_start_xmit中释放sk_buff并返回0;若硬件设备忙暂时无法处理,则返回1。网络硬件在发送完数据包后会产生中断,dev->tbusy置0,通知系统可以再次发送。网络设备数据发送函数DM9000_send_start(),该函数实现把数据发送到以太网上。

3.2.3 网络数据包的接收和中断处理

网络设备是异步接收外来的数据包并且主动的“请求”将硬件取得的数据包压入内核。网络设备接收数据包是通过中断实现的。对于网络接口,接收到新数据包,发送完成或者报告错误信息及连接状态等都会触发中断,通常中断处理程序通过检测硬件状态寄存器判断是哪种情况。