最近更换mpc8313的phy芯片,由原来的lxt972Phy更换为DP83849I,在此记录下本人在驱动开发过程中的点滴记录,以备日后查询,基于vxbus的网络驱动,vxBus驱动的注册遵循一致的方法,驱动接口为:

 device_method_t dp83849PhyMethods[] ={DEVMETHOD(miiModeGet,      dp83849PhyModeGet),DEVMETHOD(miiModeSet,      dp83849PhyModeSet),DEVMETHOD(vxbDrvUnlink,    dp83849PhyInstUnlink),{ 0, 0 }};struct drvBusFuncs dp83849PhyFuncs ={dp83849PhyDevInstInit,      /* devInstanceInit */dp83849PhyDevInstInit2,     /* devInstanceInit2 */dp83849PhyDevInstConnect    /* devInstanceConnect */};struct vxbDevRegInfo dp83849PhyDevRegistration ={NULL,               /* pNext */VXB_DEVID_DEVICE,   /* devID */VXB_BUSID_MII,      /* busID = MII Bus */VXBUS_VERSION_3,      /* busVer */"dp83849Phy",        /* drvName */&dp83849PhyFuncs,       /* pDrvBusFuncs */dp83849PhyMethods,      /* pMethods */dp83849PhyProbe         /* devProbe */};void dp83849PhyRegister(void){vxbDevRegister (&dp83849PhyDevRegistration);return;}

要编写驱动,主要去实现上面模块中的相关功能,首先编写dp83849PhyProbe,在函数中识别flash的ID,编写其他相关的函数,接下来在sysLib.c中注册系统驱动

#include "Dp83849Phy.c"
void sysHwInit (void)
{dp83849PhyRegister();
}

接下来,在系统硬件配置hwconf.c中更改phyAddr地址,具体地址参照phy芯片硬件设计


const struct hcfResource motEtsecHEnd0Resources[] = {{ "regBase",    HCF_RES_INT,    { (void *)(CCSBAR + 0x24000) } },{ "intr0",      HCF_RES_INT,    { (void *)INUM_TSEC1_TX} },{ "intr0Level", HCF_RES_INT,    { (void *)INUM_TSEC1_TX } },{ "intr1",      HCF_RES_INT,    { (void *)INUM_TSEC1_RX } },{ "intr1Level", HCF_RES_INT,    { (void *)INUM_TSEC1_RX } },{ "intr2",      HCF_RES_INT,    { (void *)INUM_TSEC1_ERR } },{ "intr2Level", HCF_RES_INT,    { (void *)INUM_TSEC1_ERR } },{ "phyAddr",    HCF_RES_INT,    { (void *)14 }},{ "miiIfName",  HCF_RES_STRING, { (void *)"tsecMdio" } },{ "miiIfUnit",  HCF_RES_INT,    { (void *)0 } }};

接下来,由于本次硬件设计采用RMII接口,所以在config.h中更改硬件配置字

/* RMII */#define HRCW_HIGH_BYTE2     0x24 

接下来更改系统MAC寄存器,在vxbEtsecEnd.c中修改下列函数,根据系统硬件配置字设置ETSEC_ECNTRL寄存器的ETSEC_ECNTRL_R100M

LOCAL STATUS etsecLinkUpdate(VXB_DEVICE_ID pDev)
{switch (IFM_SUBTYPE(pDrvCtrl->etsecCurMedia)){case IFM_1000_T:case IFM_1000_SX:CSR_SETBIT_4(pDev, ETSEC_MACCFG2, ETSEC_IFMODE_GMII_TBI);/* R100M is "don't care" for gigE, but clear it anyway */CSR_CLRBIT_4(pDev, ETSEC_ECNTRL, ETSEC_ECNTRL_R100M);pDrvCtrl->etsecEndObj.mib2Tbl.ifSpeed = 1000000000;break;case IFM_100_TX:CSR_SETBIT_4(pDev, ETSEC_MACCFG2, ETSEC_IFMODE_MII);//CSR_SETBIT_4(pDev, ETSEC_MACCFG2, ETSEC_MACCFG2_PREAMBLE_LEN | ETSEC_IFMODE_MII | ETSEC_MACCFG2_PADCRC | ETSEC_MACCFG2_FULL_DUPLEX);/* Set R100M bit if configured for reduced pin mode RMII */if (CSR_READ_4(pDev, ETSEC_ECNTRL) & ETSEC_ECNTRL_RMM)CSR_SETBIT_4(pDev, ETSEC_ECNTRL, ETSEC_ECNTRL_R100M);//printf("100M ccfg2 = %08x ecntrl = %08x\n", CSR_READ_4(pDev, ETSEC_MACCFG2), CSR_READ_4(pDev, ETSEC_ECNTRL));pDrvCtrl->etsecEndObj.mib2Tbl.ifSpeed = 100000000;break;case IFM_10_T:CSR_SETBIT_4(pDev, ETSEC_MACCFG2, ETSEC_IFMODE_MII);//CSR_SETBIT_4(pDev, ETSEC_MACCFG2, ETSEC_MACCFG2_PREAMBLE_LEN | ETSEC_IFMODE_MII | ETSEC_MACCFG2_PADCRC | ETSEC_MACCFG2_FULL_DUPLEX);/* The R100M bit is always 0 for 10Mbps operation. */if(CSR_READ_4(pDev, ETSEC_ECNTRL) & ETSEC_ECNTRL_RMM)CSR_CLRBIT_4(pDev, ETSEC_ECNTRL, ETSEC_ECNTRL_R100M);//printf("10M ccfg2 = %08x ecntrl = %08x\n", CSR_READ_4(pDev, ETSEC_MACCFG2), CSR_READ_4(pDev, ETSEC_ECNTRL));pDrvCtrl->etsecEndObj.mib2Tbl.ifSpeed = 10000000;break;default:break;}}

值此基本上已经完成驱动程序的修改,由于网络不通,无法加载系统镜像,无法调试,本人的解决办法是,先把vxWorks.bin通过仿真器烧写到flash固定位置,boot上电运行时,再从flash加载到RAM_LOW_ADDR地址处开始运行,这样在网络不通的情况下,可以加载系统镜像进行调试,所以修改bootsehll.c程序,并在autoboot函数中调用:

/*启动时从norflash中拷贝系统镜像到VXWORKS启动地址,然后转到此处执行zhb_2020.12.23*/
void copyVxToRam(void)
{char *pVxRamAddr = RAM_LOW_ADRS;char* pVxFlashAddr = FLASH_BASE_ADRS + 0x400000;int i = 0;int* pEnterAddr;FUNCPTR absEntry;for (i = 0; i < 0x300000; i++)pVxRamAddr[i] = pVxFlashAddr[i];pEnterAddr = (int*)pVxRamAddr;printf("start Vxworks at %08x.....\n", pEnterAddr);absEntry = pEnterAddr;(absEntry)();
}

编译boot程序和系统镜像,用仿真器烧写到flash中运行,下面就可以进行调试了。对于phy芯片的调用,可以利用vxBusShow查看设备pDev,然后在shell中用MII_READ,MII_WRITE进行测试

-> vxBusShow
Registered Bus Types:MII_Bus @ 0x00208d60Local_Bus @ 0x00206138Registered Device Drivers:ppcIntCtlr at 0x00207904 on bus Local_Bus, funcs @ 0x002078f8VxBus version 2quiccIntCtlr at 0x00208a2c on bus Local_Bus, funcs @ 0x002089f8quiccTimerDev at 0x002068ec on bus Local_Bus, funcs @ 0x002068d0VxBus version 2motetsec at 0x002026b0 on bus Local_Bus, funcs @ 0x00202584ns16550 at 0x0020734c on bus Local_Bus, funcs @ 0x002072dcns16550 at 0x00207304 on bus PCI_Bus, funcs @ 0x002072dcppcDecTimerDev at 0x00208f00 on bus Local_Bus, funcs @ 0x00208ee4tsecMdio at 0x00208ea4 on bus Local_Bus, funcs @ 0x00208e78mv88E1x11Phy at 0x00208e38 on bus MII_Bus, funcs @ 0x00208e08lxt972Phy at 0x00207250 on bus MII_Bus, funcs @ 0x00207244bcm54xxPhy at 0x00208da8 on bus MII_Bus, funcs @ 0x00208d9cmiiBus at 0x00208d18 on bus PCI_Bus, funcs @ 0x00208cbcmiiBus at 0x00208cd8 on bus Local_Bus, funcs @ 0x00208cbcplbCtlr at 0x00206160 on bus Local_Bus, funcs @ 0x00206154dp83849Phy at 0x00202544 on bus MII_Bus, funcs @ 0x00202538Busses and Devices Present:Local_Bus @ 0x0023f848 with bridge @ 0x002061a0Device Instances:quiccIntCtlr unit 0 on Local_Bus @ 0x00240808 with busInfo 0x00000000ppcIntCtlr unit 0 on Local_Bus @ 0x00240908 with busInfo 0x00000000tsecMdio unit 0 on Local_Bus @ 0x00240a08 with busInfo 0x00000000motetsec unit 0 on Local_Bus @ 0x00240b08 with busInfo 0x00000000motetsec unit 1 on Local_Bus @ 0x00240c08 with busInfo 0x00000000ppcDecTimerDev unit 0 on Local_Bus @ 0x00240d08 with busInfo 0x00000000quiccTimerDev unit 0 on Local_Bus @ 0x00240e08 with busInfo 0x00000000quiccTimerDev unit 1 on Local_Bus @ 0x00240f08 with busInfo 0x00000000ns16550 unit 0 on Local_Bus @ 0x00241008 with busInfo 0x00000000ns16550 unit 1 on Local_Bus @ 0x00241208 with busInfo 0x00000000miiBus unit 0 on Local_Bus @ 0x00241708 with busInfo 0x0023ff08miiBus unit 1 on Local_Bus @ 0x00245b08 with busInfo 0x0023ff48Orphan Devices:legacy unit 0 on Local_Bus @ 0x00241408 with busInfo 0x00000000MII_Bus @ 0x0023ff08 with bridge @ 0x00241708Device Instances:dp83849Phy unit 0 on MII_Bus @ 0x00245908 with busInfo 0x00000000Orphan Devices:MII_Bus @ 0x0023ff48 with bridge @ 0x00245b08Device Instances:dp83849Phy unit 1 on MII_Bus @ 0x00245d08 with busInfo 0x00000000Orphan Devices:value = 1 = 0x1

对于以太网报文的测试,我们可以增加测试程序,从中断中捕获报文分析,测试以太网发送报文


LOCAL int etsecEndEncap(ETSEC_DRV_CTRL * pDrvCtrl,M_BLK_ID pMblk){ETSEC_DESC * pDesc = NULL, * pFirst;ETSEC_TX_FCB * pFcb;M_BLK_ID pCurr, pStart;UINT32 firstIdx, lastIdx = 0;struct ether_header * eh;int used = 0, i;int j = 0;// printf("send net data ......\n");//for (j = 0; j < pMblk->mBlkHdr.mLen; j++)//   printf("%02x ", pMblk->mBlkHdr.mData[j]);// printf("\n");
}

测试以太网接收报文

void usrPrintNet(ST_INT port, ST_VOID* pM)
{char gsBuf[L2_DATA_MSG_SIZE];int i = 0;M_BLK_ID pMblk = (M_BLK_ID)pM;memcpy(gsBuf, pMblk->mBlkHdr.mData, pMblk->mBlkHdr.mLen);if (g_debug_net == 1){printf("revCnt = %d\n", gsvEthInfo[port].allPacketCount);for (i = 0; i < pMblk->mBlkHdr.mLen; i++)printf("%02x ", gsBuf[i]);printf("\n");}
}
LOCAL void etsecEndRxHandle(void * pArg)
{usrPrintNet(pDrvCtrl->etsecDev->unitNumber,pMblk);
}

注意:如果你的驱动程序在boot和系统镜像中存在两份,务必保持驱动程序的一致性,否则可能出现奇怪的现象,调试中发现以太网发送中断不能进,最后发现是boot和vxWorks中的驱动程序不一致导致的,折腾了两天,我也是醉了。。。。。

vxWorks6.6下基于vxBus的以太网驱动开发相关推荐

  1. vxWorks6.6下基于VxBus架构的Can控制器(sja1000t)驱动编写

    vxWorks6.6下基于VxBus架构的Can控制器驱动编写 目录 1       VxBus下驱动的架构...1 1.1        WorkBench3.0的认识...1 1.2        ...

  2. 基于MTD的NAND驱动开发(二)

    基于MTD的NAND驱动开发(二) 基于MTD的NAND驱动开发(三) http://blog.csdn.net/leibniz_zsu/article/details/4977853 http:// ...

  3. 基于V4L2的视频驱动开发(2) 华清远见 刘洪涛

    基于V4L2的视频驱动开发(2) 华清远见 刘洪涛 三.            V4L2 API及数据结构 V4L2是V4L的升级版本,为linux下视频设备程序提供了一套接口规范.包括一套数据结构和 ...

  4. 基于V4L2的视频驱动开发

    基于V4L2的视频驱动开发 编写基于V4L2视频驱动主要涉及到以下几个知识点: ●摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法.各种参数的配置方法.信号输出类型等. ●Camera解码 ...

  5. 分享自清客 《基于MTD的NAND驱动开发(完) (转)》

    url:http://blog.csdn.net/mianyy/article/details/6712631 六.NAND驱动中的坏块管理 由 于NAND Flash的现有工艺不能保证NAND的Me ...

  6. C++:Windows环境下基于Eclipse配置C/C++开发环境

    C++:Windows环境下基于Eclipse配置C/C++开发环境 目录 Windows下的MinGW下载.安装和配置 1.MinGW下载 2.MinGW安装与配置 3.基于Eclipse配置 Wi ...

  7. linux 内核 scsi底层驱动程序,Linux系统下基于SCST的SCSI_Target驱动设计.doc

    Linux系统下基于SCST的SCSI target驱动设计 摘要 随着信息数字化的深入发展,数据存储的需求日益增长.存储虚拟化带给我们最直接的益处就是,提高存储利用率,降低成本,简化存储管理,而基于 ...

  8. Win10下VS2015(WDK10)驱动开发环境配置

    1.     概述 微软在"WDK7600"以后就不再提供独立的内核驱动开发包了,而是必须首先安装微软集成开发环境VisualStudio,然后再从微软官网下载集成的WDK开发包. ...

  9. 基于V4L2的视频驱动开发(1)

    编写基于V4L2视频驱动主要涉及到以下几个知识点: l         摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法.各种参数的配置方法.信号输出类型等. l         Came ...

最新文章

  1. 基于Matlab的神经网络结合遗传算法在非线性函数极值寻优中的应用
  2. 预备作业02 20162316刘诚昊
  3. CF374 Maxim and Array
  4. [Leedcode][JAVA][第84题][柱状图中最大的矩形][暴力][单调栈]
  5. python判断语句 if elif else(一分钟读懂)
  6. coreldraw水涟漪怎么做_不懂怎么挑选水处理设备?跟贝斯沃了解这3点再做决定,轻松挑出适合自己的...
  7. mybatis报错解决
  8. SQL中的5种常用的聚集函数
  9. Latex WinEdt7.0查找替换功能
  10. [JNI]开发之旅(5)访问c/c++函数
  11. java 关键字提取_提取Java关键字
  12. 莱布尼茨公式C语言编程,高等数学——手撕牛顿莱布尼茨公式
  13. 如何用xmlspy将xml文档生成xsd文件
  14. FastDFS 入门小 Demo( 图片上传)
  15. 如何查看电脑操作系统及系统类型
  16. rxjava面试题,android教程零基础入门
  17. mysql日期自动加1天
  18. 现金流折算法的详细计算公式记录
  19. 地理学(第一、第二)定律
  20. 淘宝/天猫获取sku详细信息 API 返回值说明

热门文章

  1. 什么是HTTPS安全证书?
  2. 【python爬虫】用python编写LOL战绩查询
  3. latex中的希腊字母
  4. 5、C++结构体的使用
  5. ASF网站使用教程——Sentinel-1数据下载为例
  6. erlang使用c语言开发的吗,Erlang语言作者告诉你什么才是编程最好的方法
  7. 11.STC15W408AS单片机CCP/PCA/PWM应用
  8. Win10卸载微软sql服务器,win10系统彻底卸载server 2008数据库的设置办法
  9. 1028: 安全路径(2014年中南大学研究生复试机试题 )
  10. 如何找国外作者的matlab,如何与外国学者用电子邮件联系(索要论文或者代码)...