1 /******************************************************************/
3 * Desctiption: Humusoft data acquisition Linux library
6 * Copyright 2006-2007 Jaroslav Fojtik *
7 ******************************************************************/
14 #include "hudaq_internal.h"
17 static int sysfs_get_value(const char *FileName)
22 F=fopen(FileName,"rb");
23 if(F==NULL) return -1;
25 fscanf(F,"%X",&RetVal);
30 static int ScanSys(DWORD DeviceID, int deviceorder, DriverRecord *Rec)
39 const char *SysDir="/sys/bus/pci/devices";
40 unsigned long long start, end, size;
45 if(deviceorder <= 0) return -1;
46 if(Rec==NULL) return -2;
48 Rec->NumPhysMemResources = Rec->Resources.NumIOResources = 0;
50 sprintf(FileName,"%s",SysDir);
51 dir = opendir(FileName);
54 //fprintf(stderr,"Cannot open /sys/bus/pci/devices");
58 while ((entry = readdir(dir)))
60 if(entry->d_name[0]=='.') continue;
62 sprintf(FileName,"%s/%s/vendor",SysDir,entry->d_name);
63 vendor_id = sysfs_get_value(FileName);
64 sprintf(FileName,"%s/%s/device",SysDir,entry->d_name);
65 device_id = sysfs_get_value(FileName);
67 memset(Resources, 0, sizeof(Resources));
68 sprintf(FileName,"%s/%s/resource",SysDir,entry->d_name);
69 F=fopen(FileName,"rb");
74 if(fscanf(F,"%llx %llx", &start, &end) != 2)
76 fprintf(stderr,"Syntax error in %s", FileName);
83 } while(ch!='\r' && ch!='\n' && ch!=0);
86 size = end - start + 1;
96 if(DeviceID==(device_id+(vendor_id<<16)))
98 //printf("DEVICE HAS BEEN FOUND!");
105 if(Resources[i] > 0xFFFF)
107 Rec->PhysMemResources[Rec->NumPhysMemResources].Base=Resources[i];
108 Rec->PhysMemResources[Rec->NumPhysMemResources].Length=Resources[i+7];
109 Rec->NumPhysMemResources++;
113 Rec->Resources.IOResources[Rec->Resources.NumIOResources].Base=Resources[i];
114 Rec->Resources.IOResources[Rec->Resources.NumIOResources].Length=Resources[i+7];
115 Rec->Resources.NumIOResources++;
119 RetVal=1; //device has been found!!
124 // printf("%X %X %s\n", vendor_id, device_id, entry->d_name);
132 static int ScanProc(DWORD DeviceID, int deviceorder, DriverRecord *Rec)
136 DWORD DevPos, DevInt;
142 if(deviceorder <= 0) return -1;
143 if(Rec==NULL) return -2;
145 Rec->NumPhysMemResources = Rec->Resources.NumIOResources = 0;
147 //devices=fopen("devices","rb");
148 devices=fopen("/proc/bus/pci/devices","rb");
149 if(devices==NULL) return -4;
151 /* loop over devices */
152 while (!feof(devices))
154 if(fscanf(devices,"%X %X %X", &DevPos, &DevTblID, & DevInt)!=3)
157 memset(Resources, 0, sizeof(Resources));
160 if(fscanf(devices,"%X", &Resources[i])!=1)
162 if(i==6 || i==7) break; //correct
168 if(feof(devices)) break;
169 } while(ch!='\r' && ch!='\n' && ch!=0);
171 if(DeviceID==DevTblID)
181 Rec->Resources.IOResources[Rec->Resources.NumIOResources].Base = Resources[i] & ~1;
182 Rec->Resources.IOResources[Rec->Resources.NumIOResources].Length=Resources[i+7];
183 Rec->Resources.NumIOResources++;
187 Rec->PhysMemResources[Rec->NumPhysMemResources].Base=Resources[i];
188 Rec->PhysMemResources[Rec->NumPhysMemResources].Length=Resources[i+7];
189 Rec->NumPhysMemResources++;
193 RetVal=1; //device has been found!!
207 /*****************************************************************************
210 ;* opens device handle by device name and order
212 ;* Input: device name
213 ;* device order number
214 ;* Output: positive number when success; 0 or negative when fails.
216 ;****************************************************************************/
217 int OpenDeviceHandle(const char *devicename, int deviceorder, DriverRecord *Rec)
222 if(deviceorder <= 0) return -1;
223 if(Rec==NULL) return -2;
227 if(!strcmp(devicename,"AD612")) DeviceID=0x186C0612;
228 if(!strcmp(devicename,"MF614")) DeviceID=0x186C0614;
231 if(!strcmp(devicename,"AD622")) DeviceID=0x186C0622;
232 if(!strcmp(devicename,"MF624")) DeviceID=0x186C0624;
233 if(!strcmp(devicename,"MF625")) DeviceID=0x186C0625;
238 if(!strcmp(devicename,"PCI1753")) DeviceID=0x13FE1753;
243 if(!strcmp(devicename,"PCD7004")) DeviceID=0x17600101;
246 if(!strcmp(devicename,"PCT7303B")) DeviceID=0x17600201;
249 //printf("\n%s deviceID = %X", devicename, DeviceID);
251 if(DeviceID==0) return -3;
253 RetVal = ScanSys(DeviceID, deviceorder, Rec);
254 if(RetVal>0) return RetVal;
255 RetVal = ScanProc(DeviceID, deviceorder, Rec);
256 if(RetVal>0) return RetVal;