4086|1

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求教vxWorks下I/O卡驱动问题 [复制链接]

 小弟正在做一个vxWorks系统下的I/O卡驱动,因为是第一次接触驱动,所以我先写了一个测试程序来测试板卡能否被检测到并正常工作,程序的功能是这样的,首先获得I/O映射后的地址,因为该卡共两个寄存器,偏移地址分别为0和2,前者的不同输入值决定了I/O卡不同通道的开和关(由板卡上16个红色指示灯的亮灭来指示),现在的问题是,板卡能被检测到,向0地址输入值也有响应,但却非常奇怪。当我输入的值是0时,指示灯一个都不亮,当是一个奇数值是,会有几个灯不停的闪烁,而此时输入的值再换成一个偶数值,则闪烁停止,会有几个固定的灯在亮着。

我不知道是因为我没有配置或配置不对,还是我向寄存器写数据的方式不对造成的,请各位大虾不吝赐教,小弟感激不尽。

板卡情况是这样的,该板卡用来连接一个端子板,板卡上有16路A/D、D/A输入输出通道,通道的关闭和打开由板卡上16个指示灯来指示。
链接中是我的板卡的资料:
[url=http://mail.qq.com/cgi-bin/ftnExs_download?k=7166613388bd939ccfad4f3c1637564c045250555505515a1e075057071a505551524c520105514e52050750515251520600565030396433702f4c0206675555614831777637&t=exs_ftn_download&code=3fa307dc][/url]

以下是我的测试代码:

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include "drvtest.h"


  7. int findDeviceTest()
  8. {
  9.         int status = ERROR;
  10.         short data = 0;
  11.         short back = 0;
  12.         UINT8 tmp = 0;
  13.         UINT16 vendor = 0x0;
  14.        
  15.         int vendorId = 0x10b5;
  16.         int deviceId = 0x1180;
  17.        
  18.         int busNo = -1;
  19.         int devNo = -1;
  20.         int funNo = -1;
  21.        
  22.         UINT32 membaseCsr = 0x0;
  23.         UINT32 iobaseCsr = 0x0;
  24.         UINT32 tmpd = 0x0;

  25.        
  26.         if ((ERROR) == pciFindDevice(vendorId, deviceId, 0, &busNo, &devNo, &funNo))
  27.         {
  28.                 printf("Find device failed!\n");
  29.                 return 1;
  30.         }
  31.        
  32.         #if 0
  33.                 if ((ERROR) == pciHeaderShow(busNo, devNo, funNo))
  34.                 {
  35.                         printf("Show device header failed!\n");
  36.                         return 1;
  37.                 }
  38.         #endif
  39.        
  40.         /*pciConfigInWord(busNo, devNo, funNo, 0, &vendor);
  41.         printf("Vendor Id: 0x%x\n", vendor);
  42.         */
  43.        
  44.         /* 配置IO空间基地址 */
  45.         /*pciConfigOutLong(busNo, devNo, funNo, PCI_CFG_BASE_ADDRESS_1, iobaseCsr | PCI_BASE_IO);*/
  46.                                
  47.         /* 配置内存空间基地址 */
  48.         /*pciConfigOutLong(busNo, devNo, funNo, PCI_CFG_BASE_ADDRESS_0, membaseCsr);*/
  49.        
  50.        
  51.         /* 读取IO空间基地址 */
  52.         pciConfigInLong(busNo, devNo, funNo, PCI_CFG_BASE_ADDRESS_1, &iobaseCsr);
  53.        
  54.         /* 读取内存空间基地址 */
  55.         pciConfigInLong(busNo, devNo, funNo, PCI_CFG_BASE_ADDRESS_0, &membaseCsr);
  56.        
  57.         membaseCsr &= PCI_MEMBASE_MASK;
  58.         iobaseCsr &= PCI_IOBASE_MASK;
  59.        
  60.         /* enable mapped memory and IO addresses */
  61.         pciConfigOutWord(busNo, devNo, funNo, PCI_CFG_COMMAND, PCI_CMD_IO_ENABLE | PCI_CMD_MEM_ENABLE | PCI_CMD_MASTER_ENABLE);

  62.         /* disable sleep mode */
  63.         pciConfigOutWord(busNo, devNo, funNo, PCI_CFG_MODE, SLEEP_MODE_DIS);
  64.        
  65.         printf("Mem Base: 0x%x\n", membaseCsr);
  66.         printf("IO Base: 0x%x\n", iobaseCsr);
  67.        
  68.        
  69.         /*
  70.         * 读取
  71.         */
  72.         data = sysInWord(iobaseCsr + 2);
  73.         printf("Read Data: 0x%x\n", data);
  74.        
  75.         printf("====================================\n");
  76.        
  77.        
  78.         /* 向iobaseCsr地址写入不同的数据,测试指示灯的亮灭情况 */
  79.         for (status = 0; status < 16; status++)
  80.         {
  81.                 printf("Write Data: 0x%x\n", data);
  82.                 logMsg("Write Data: 0x%x\n", data, 0, 0, 0, 0, 0);
  83.                
  84.                 tmp = (UINT8)(data & 0x00ff);
  85.                 sysOutByte(iobaseCsr, tmp);

  86.                 tmp = (UINT8)((data >> 8) & 0x00ff);
  87.                 sysOutByte(iobaseCsr + 1, tmp);
  88.                
  89.                 tmp = sysInByte(iobaseCsr + 2);
  90.                
  91.                 printf("IO_2: 0x%x\n", tmp);
  92.                 logMsg("IO_2: 0x%x\n", tmp, 0, 0, 0, 0, 0);
  93.                 tmp = sysInByte(iobaseCsr + 3);
  94.                
  95.                 printf("IO_3: 0x%x\n\n\n", tmp);
  96.                 logMsg("IO_3: 0x%x\n\n\n", tmp, 0, 0, 0, 0, 0);
  97.                
  98.                 data++;               
  99.                
  100.                
  101.                 timeDelay(2, 0);
  102.         }
  103.        
  104.        
  105.         return 0;
  106. }

  107. void timeDelay(int sec, int nsec)
  108. {
  109.         struct timespec tm;                        /* 声明一个时钟结构体,包括s和ns成员 */
  110.        
  111.         if (nsec >= 1000000000)
  112.         {
  113.                 sec += nsec / 1000000000;
  114.                 nsec %= 1000000000;
  115.         }
  116.        
  117.         tm.tv_sec = sec;
  118.         tm.tv_nsec = nsec;
  119.         nanosleep(&tm, NULL);
  120. }

复制代码

最新回复

自己先顶一下。。。  详情 回复 发表于 2009-7-28 15:33
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
自己先顶一下。。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表