第3天网卡触摸屏dm9000驱动分析_第1页
第3天网卡触摸屏dm9000驱动分析_第2页
第3天网卡触摸屏dm9000驱动分析_第3页
第3天网卡触摸屏dm9000驱动分析_第4页
第3天网卡触摸屏dm9000驱动分析_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

该资料归属国嵌(简称“国嵌”)所有,并保留。非经国嵌同意(录本手册部分或全部,违者追 CS8900A驱动(国嵌00d3H10BASE-T,并使能设备RXCFG控制CS8900接收到特定数据报后会接收中断。CS8900会产生一个接收中断。BUSCT可控制的I/O接口的一些操作。设置初始值ISQ是网卡的中断状态寄存器,内部映射接收中断状态然后将数据通过PORT0写入。系统工作时,应首先对网卡进行初始化,即写寄存TXCMD,并将发送数据长度写入TXLENG,然后将数据依次写入PORT0口,网卡将数据组织为链路层类型并添加填充位和CRC校验送到网络。模块static init{structnet_local*lp;intret=0;dev_cs89x0.irq=irq;dev_cs89x0.base_addr=io;dev_cs89x0.init=cs89x0_probe;NETCARD_IO_EXTENT,"cs8900a");if(register_netdev(&dev_cs89x0)!=}static initcs89x0_probe1(structnet_device*dev,int{/*getthechiptyperev_type=readreg(dev,PRODUCT_ID_ADD);lp->chip_type=rev_type&~REVISON_BITS;lp->chip_revision=((rev_type&REVISON_BITS)>>8)+if(lp->chip_type!={ ":wrongdevicedriver!\n");ret=-ENODEV;goto}dev->dev_addr[0]=0x00;dev->dev_addr[1]=0x00;dev->dev_addr[2]=0xc0;dev->dev_addr[3]=0xff;dev->dev_addr[4]=0xee;dev->dev_addr[5]=0x08;set_mac_address(dev,dev-dev->irq=IRQ_LAN;printk(",IRQ%d",dev->irq);dev- =dev- = =net_timeout;dev->watchdog_timeo=3*HZ;dev->hard_start_xmit=net_send_packet; =net_get_stats;dev->set_multicast_list=set_multicast_list; =set_mac_address;/*Fillinthefieldsofthedevicestructurewithethernetvalues.}staticintnet_send_packet(structsk_buff*skb,structnet_device{/*initiateatransmitsequencewriteword(dev,TX_LEN_PORT,skb->len);/*Testtoseeifthechiphasallocatedmemoryforthepacket*/if((readreg(dev,PP_BusST)&READY_FOR_TX_NOW)==0){spin_unlock_irq(&lp-DPRINTK(1,"cs89x0:Txbuffernot return1;}/*Writethecontentsofthepacketwriteblock(dev,skb->data,skb-return}中staticvoidnet_interrupt(intirq,void*dev_id,structpt_regs*{while((status=readword(dev,{switch(status&{case/*Gotapacket(s).*/caselp- /*Informupperlayers.*/}接staticvoidnet_rx(structnet_device*dev)status=inw(ioaddr+RX_FRAME_PORT);if((status&RX_OK)==0){count_rx_errors(status,}length=inw(ioaddr+/*Mallocupnewbuffer.skb=dev_alloc_skb(length+if(skb==NULL)lp-}skb_reserve(skb, mac头是14个字节,一开始保留两个字节,正是为了保证ip头skb->len=length;skb->dev=dev;readblock(dev,skb->data,skb-skb-}该资料归属国嵌(简称“国嵌”)所有,并保留。非经国嵌同意(录本手册部分或全部,违者追 DM9000驱动程序分static init{ CARDNAME,DRV_VERSION);return}staticstructtform_driverdm9000_driver=.driver= =.owner= = .suspend= =static dm9000_probe(structtform_device{structdm9000_t_data*pdata=pdev->dev.tform_data;structboard_info*db; /*Pointaboardinformationstructure*/structnet_device*ndev;constunsignedchar*mac_src;intret=0;intiosize;inti;u32/*Initnetworkdevicendev=alloc_etherdev(sizeof(structif(!ndev)dev_err(&pdev->dev,"couldnotallocatereturn-} &pdev-dev_dbg(&pdev->dev,/*setupboardinfostructure*/db=netdev_priv(ndev);memset(db,0,sizeof(*db));db->dev=&pdev->dev;db->ndev=ndev;INIT_DELAYED_WORK(&db- db->addr_res=tform_get_resource(pdev,IORESOURCE_MEM,db->data_res=tform_get_resource(pdev,IORESOURCE_MEM, =tform_get_resource(pdev,IORESOURCE_IRQ,if(db->addr_res==NULL||db->data_res==NULL||db->irq_res==NULL){ret=-ENOENT;goto}iosize=res_size(db- pdev-if(db->addr_req==NULL)dev_err(db->dev,"cannotclaimaddressregarea\n");ret=-EIO;goto}if(db->io_addr==NULL)dev_err(db->dev,"failedtoioremapaddressreg\n");ret=-EINVAL;goto}iosize=res_size(db-db->data_req=request_mem_region(db->data_res->start,iosize,if(db->data_req==NULL)dev_err(db->dev,"cannotclaimdataregret=-goto}db->io_data=ioremap(db->data_res->start,if(db->io_data==NULL)dev_err(db->dev,"failedtoioremapdatareg\n");ret=-EINVAL;goto}/*fillinparametersfornet-devstructure*/ndev->base_addr=(unsignedlong)db->io_addr;ndev->irq=db->irq_res->start;/*ensureatleastwehaveadefaultsetofIOroutines*/dm9000_set_io(db,iosize);/*checktoseeifanythingisbeingover-riddenif(pdata!=NULL)/*checktoseeifthedriverwantstoover-ride*defaultIOwidthdm9000_set_io(db,1);dm9000_set_io(db,2);dm9000_set_io(db,4);/*checktoseeifthereareanyIO*over-ridesif(pdata->inblk!=db->inblk=pdata-if(pdata->outblk!=db->outblk=pdata-if(pdata->dumpblk!=db->dumpblk=pdata-db->flags=pdata-}#ifdefCONFIG_DM9000_/*trymultipletimes,DM9000sometimesgetsthereadwrong*/for(i=0;i<8;i++){id_val=ior(db,id_val|=(u32)ior(db,DM9000_VIDH)<<8;id_val|=(u32)ior(db,DM9000_PIDL)<<16;id_val|=(u32)ior(db,DM9000_PIDH)<<24;if(id_val==DM9000_ID)dev_err(db->dev,"readwrongid0x%08x\n",}if(id_val!=DM9000_ID)dev_err(db->dev,"wrongid:0x%08x\n",id_val);ret=-ENODEV;goto}/*IdentifywhattypeofDM9000weareworkingonid_val=ior(db,dev_dbg(db->dev,"dm9000revision0x%02x\n",switch(id_val)casedb->type=casedb->type=TYPE_DM9000B;dev_dbg(db->dev,"ID%02x=>defaultingtoDM9000E\n",db->type=}/*fromthispointweassumethatwehavefoundaDM9000/*driversystemfunction*/ndev- = =&dm9000_start_xmit; =&dm9000_timeout;ndev->watchdog_timeo=msecs_to_jiffies(watchdog); =&dm9000_stop; =&dm9000_ethtool_ops; =&dm9000_ioctl;#ifdef =NETIF_MSG_LINK; =0x1f;db->mii.reg_num_mask=0x1f; =0; =0;db- = =dm9000_phy_read;db- =mac_src=/*tryreadingthenodeaddressfromtheattachedEEPROMfor(i=0;i<6;i+=dm9000_read_eeprom(db,i/2,ndev-if(!is_valid_ether_addr(ndev->dev_addr)&&pdata!={mac_src="tformmemcpy(ndev->dev_addr,pdata->dev_addr,}if(!is_valid_ether_addr(ndev->dev_addr))/*tryreadingfrommacmac_src="chip";for(i=0;i<6;i++)ndev->dev_addr[i]=ior(db,} (!is_valid_ether_addr(ndev-dev_warn(db- Please"setusingifconfig\n",ndev-tform_set_drvdata(pdev,ret=if(ret==printk(KERN_INFO"%s:dm9000%cat%p,%pIRQ%dMAC:%pM(%s)\n",ndev->name,dm9000_type_to_char(db->type),db->io_addr,db->io_data,ndev->irq,ndev->dev_addr,returndev_err(db->dev,"notfound(%d).\n",dm9000_release_board(pdev,return}staticintdm9000_open(structnet_device{board_info_t*db= ifdev_dbg(db->dev,"enabling%s\n",dev-/*IfthereisnoIRQtypespecified,defaulttosomething*maywork, ltheuserthatthisisaproblemif(irqflags== irqflags|= dev->name,dev))return-/*InitializeDM9000board*//*Initdrivervariable*/ t=0;mii_check_media(&db->mii,netif_msg_link(db),1);return}staticintdm9000_start_xmit(structsk_buff*skb,struct{unsignedlongboard_info_t*db=dm9000_dbg(db,3, if(db-> t>1)return1;spin_lock_irqsave(&db- /*MovedatatoDM9000TXRAM*/writeb(DM9000_MWCMD,db->io_addr);(db->outblk)(db->io_data,skb->data,skb->len);dev->stats.tx_bytes+=skb->len;db- /*TXcontrol:Firstpacketimmedia ysend,secondpacketqueue*/if(db-> t==1){/*SetTXlengthtoDM9000*/iow(db,DM9000_TXPLL,skb->len);iow(db,DM9000_TXPLH,skb->len>>/*IssueTXpollingcommandiow(db,DM9000_TCR,TCR_TXREQ); complete*/dev->trans_start= /*savethetimestamp}else/*Secondpacketdb->queue_pkt_len=skb->len;}spin_unlock_irqrestore(&db- thisSKB*/return}staticirqreturn_tdm9000_interrupt(intirq,void{structnet_device*dev=dev_id;board_info_t*db=netdev_priv(dev);intint_status;unsignedlongflags;u8reg_save;dm9000_dbg(db,3,"entering /*Arealinterruptcoming/*holdersofdb->lockmustalwaysblockIRQs*/spin_lock_irqsave(&db->lock,flags);/*Savepreviousregisteraddress*/reg_save=readb(db->io_addr);/*Disableallinterruptsiow(db,DM9000_IMR,/*GotDM9000interruptstatusint_status=ior(db,DM9000_ISR);/*GotISRiow(db,DM9000_ISR,int_status);/*ClearISRstatusifdev_dbg(db->dev,"interruptstatus%02x\n",/*Receivedthecomingpacket*/if(int_status&ISR_PRS)/*TrnasmitInterruptcheck*/if(int_status&ISR_PTS)dm9000_tx_done(dev,if(db->type!=TYPE_DM9000E)if(int_status&ISR_LNKCHNG)/*firealink-changerequest*/schedule_delayed_work(&db->phy_poll,1);}}/*Re-enableinterruptmask*/iow(db,DM9000_IMR,db->imr_all);/*Restorepreviousregisteraddresswriteb(reg_save,db-spin_unlock_irqrestore(&db- return}staticdm9000_rx(structnet_device{board_info_t*db=netdev_priv(dev);structdm9000_rxhdrrxhdr;structsk_buff*skb;u8rxbyte,*rdptr;boolGoodPacket;intRxLen;/*Checkpacketreadyornot*/do{ior(db, /*Dummyread/*Getmostupdateddata*/rxbyte=readb(db->io_data);/*Statuscheck:thisbytemustbe0or1*/if(rxbyte>DM9000_PKT_RDY){dev_warn(db->dev,"statuscheckfail:%d\n",rxbyte);iow(db,DM9000_RCR,0x00);/*StopDevice*/iow(db,DM9000_ISR,IMR_PAR);/*StopINTrequest}if(rxbyte!=DM9000_PKT_RDY)/*Apacketreadynow &Getstatus/length*/GoodPacket=true;writeb(DM9000_MRCMD,db->io_a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论