linux网卡驱动之CS8900A网卡驱动程序

news/2024/11/16 20:45:54/

文章目录

    • CS8900A芯片介绍
    • 以太网帧
    • CS8900A寄存器
    • 代码分析

CS8900A芯片介绍

CS8900芯片是Cirrus Logic公司生产的一种局域网处理芯片,在嵌入式领域中使用非常常见。它的封装是100-pin TQFP,内部集成了在片RAM、10BASE-T收发滤波器,并且提供8位和16位两种接口,一般在单片机中,使用了CS8900的8位接口模式。

该芯片突出特点:

  • 使用灵活
  • 其物理层接口、数据传输模式和工作模式等都能根据需要而动态调整
  • 通过内部寄存器的设置来适应不同的应用环境

以太网帧

在这里插入图片描述

CS8900A寄存器

(1)LINECTL 网卡状态设置
在这里插入图片描述
从上图看到,此寄存器的6,7位用于设置网卡的收发使能。8,9位用于设置网卡状态。是10BASE-T还是AUI。
如下图更详细介绍了8,9位如何设置:
在这里插入图片描述
驱动里给这个寄存器默认设置为0x00d3, 实际就是设置了网卡收发使能,并且状态设置为10BASE-T Only。

**(2) RxCTL 网卡数据包接收设置
在这里插入图片描述
驱动里默认设置为0x0d05,设置了网卡可以接收广播包。可以接收目的地址和本地地址一致的网络包。

(3) RxCFG 接收配置寄存器
在这里插入图片描述
驱动默认为0x0103即,设置第8位,当网卡正确的接收到一帧数据后,产生一个中断。

(4)BusCTL
在这里插入图片描述
驱动默认设置为0x8017,设置了第F位,打开了CS8900的中断开关。

(5)ISQ 中断状态寄存器
在这里插入图片描述
这个是只读寄存器,用来查询什么类型的中断发生。

(6)TxCMD 发送命令寄存器
在这里插入图片描述
如果写入数据00C0H,那么网卡芯片在全部数据写入后开始发送数据。

(7)PORT0
发送和接收数据时,CPU通过PORT0传递数据

(8)TXLENG 发送数据长度寄存器

发送 数据时,首先写入发送数据长度,然后将数据通过PORT0写入芯片

  • 系统工作时,应该首先对网卡芯片进行初始化,即写寄存器:LINECTL、RXCTL、RCCFG、BUSCT
  • 发数据时,写控制寄存器TXCMD,并将发送数据长度写入TXLENG,然后将数据依次写入PORT0口,网卡芯片将数据组织为链路层类型并添加填充位和CRC校验送到网络

代码分析

(1)模块注册

static int __init init_cs8900a_s3c6410(void)
{struct net_local *ip;int ret = 0;dev_cs89x0.irq = irq;dev_cs89x0.base_addr = ip;dev_cs89x0.init = cs90x0_probe;request_irq(dev_cs89x0.base_addr,NETCARD_IO_EXTENT,"cs8900a");if(register_netdev(&dev_cs89x0)!=0)......
}

(2)设备检测

static int __init cs89x0_probe(struct net_device *dev,int ioaddr)
{//get the chip typerev_type = readreg(dev,PRODUCT_ID_ADD);ip->chip_type = rev_type & ~REVISION_BITS;ip->chip_revision = ((rev_type & REVISION_BITS) >> 8) + 'A';if(ip->chip_type != CS8900){printk(FILE ":wrong device driver!\n");ret = -ENODEV;goto after_kmalloc;}dev->dev_addr[0] = 0x00;dev->dev_addr[1] = 0x00;dev->dev_addr[2] = 0xc0;dev->dev_addr[3] = 0xf0;dev->dev_addr[4] = 0xee;dev->dev_addr[5] = 0x08;set_mac_address(dev,dev->dev_addr);dev->irq = IRQ_LAN;printk(".IRQ %d",dev->irq);dev->open = net_open;dev->stop = net_colse;dev->tx_timeout = net_timeout;dev->watchdog_timeo = 3*HZ;dev->hard_start_xmit = net_send_packet;dev->get_stats = net_get_send_packet;dev->set_multicast_list = set_multicast_list;dev->set_mac_address = set_mac_address;//fill in the fields of the device structure with ethernet valuesether_setup(dev);	
}

(3)数据发送

static int net_send_packet(struct sk_buff *skb,struct net_device *dev)
{//停止发送队列,固定,发送数据时把发送队列停止netif_stop_queue(dev);//inititate a transmit sequencewriteword(dev,TX_CMD_PORT,ip->send_cmd);writeword(dev,TX_LEN_PORT,skb->len);//test to see if thr chip has allocated memory for the packetif((readreg(dev,PP_BusST) & READY_FOR_TX_NOW) == 0){spin_unlock_irq(ip->lock);DPRINTK(1,"cs89x0:Tx_buffer not free!\n");return 1;}//write the contents of the packetwriteblock(dev,skb->data,skb->len);return 0;
}

(4)中断

static void net_interrupt(int irq,void *dev_id,struct pt_regs *regs)
{while((status == readword(dev,ISQ_PORT))){switch(status & ISQ_EVENT_MASK){case ISQ_RECEIVER_EVENT://get a packetnet_rx(dev);break;case ISQ_IRANSMITTER_EVENT:ip->status.tx_packets;netif_wake_queue(dev); break;}}
}

(5)接收

static void net_rx(struct net_device *dev)
{stauts = inw(ioaddr + RX_FRAME_PORT);if((status & RX_OK) == O){count_rx_errors(status,ip);return ;}length = inw(ioaddr + RX_FRAME_PORT);//Malloc up new bufferskb = dev_alloc_skb(length+2);if(skb == NULL){ip->status.rx_droppe++;return;}skb_reserve(skb,2);//mac头是14个字节,一开始保留两个字节,主要是为了保证ip头的开始满足四字节对其(2+6+6+2)skb->len = length;skb->dev = dev;	readblock(dev,skb->data,skb->len);skb->protocol = eth_trans(skb,dev);netif_rx(skb);
}

http://www.ppmy.cn/news/249123.html

相关文章

STM32一键连接JQ8400-FLJQ8900语音模块程序分析

最近优化了一个项目 需要使用 语音模块 于是采用了JQ8400 语音模块 具体的数据手册 淘宝卖家提供 主要的是一线数据发送的协议格式 由于前期使用了RT-Thread 给自己挖了一个坑 为什么呢 我所移植的3.1.3版本的源码 没有提供 us级的延时函数 只有…

单片机语音模块JQ8900-16P的几种触发方式与源码配置

我先来讲一下这个模块方便在什么地方: (我没有做广告哈,有一说一) 1,有SPI-flash,USB的接口直接连电脑显示U盘,替换音频很方便 2,默认情况下有IO口按键触发,很方便播放…

JQ8900-16P语音模组硬件使用

资料阅读 1.模组特征 1. 支持 MP3 WAV 硬件解码1. 支持采样率(KHz):8/11.025/12/16/22.05/24/32/44.1/481. 多种控制模式:两线串口模式、一线串口控制、按键模式1. 支持上一曲,下一曲,播放、暂停、停止、选曲、等常用功能控制1. 支持播放曲目序号获取&…

JQ8900-16P语音模块(驱动及测试)

今天,给大家带来的是JQ8900语音模块,这是硬件图: VPP: 单线串口(就是接收脉冲信号的引进) BUSY: 播放指示灯 RX: 接收段 TX: 发送段 DC-5V: 5v供电 SPK-: 扬声器负极 SPK: 扬声器正极 IO1~IO7是触发输入口&…

EPSON RX8900SA/CE 时钟芯片开发笔记

文章资料来源:《Epson(爱普生) RX8900SA_RX8900CE实时时钟模块 应用手册》 一、模块简介 I2C总线接口实时时钟模块 RX8900 SA / CE 内置32.768 kHz DTCXO,稳定性高(Digital Temperature Compensated Xtal(crystal) O…

【RT-Thread】高精度RTC rx8900 驱动软件包

文章目录 1 介绍1.1 支持功能1.2 目录结构1.3 许可证1.4 依赖 2 实现功能2.1 rx8900驱动描述2.2 rx8900读寄存器接口2.3 rx8900写寄存器接口2.4 RT-Thread设备虚拟文件接口2.5 片内温度获取接口2.6 rtc设备注册rx8900设备注册rx8900私有信息初始化 3 获取 rx8900 软件包4 使用 …

玩转黑莓8900,不信你不会。超级实用

的问题 (有个别的游戏不能正常退出,我只好删除) 2、刷机 刷机教程 大家按照网上的来做就ok 但是网上的刷机教程我搜索了好几个都是7系bb的教程。其实大同小异。都是 1、安装desktop 2、安装rom 3、到C:/Program Files/Common Files/R…

JQ8900语音模块组合播放

实现按下按键4播报当前时间实验 本次作业实践性较强,代码其实比较简单,在JQ8900压缩包中也有相应实例 ,重点在于理解串口发送的相关知识 下面展示一些 关键函数的代码。这些代码直接使用即可,关键在于理解函数之间调用的返回结果…