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");
26 fscanf(F, "%X", &RetVal);
31 static int ScanSys(DWORD DeviceID, int deviceorder, DriverRecord *Rec)
33 DIR *dir_uio, *dir_memmaps;
36 struct dirent *direntry_uio, *direntry_memmaps;
40 const char *SysDir="/sys/class/uio/";
41 unsigned long long start, end, size;
43 DWORD Resources[7 * 3];
53 Rec->NumPhysMemResources = Rec->Resources.NumIOResources = 0;
55 sprintf(FileName, "%s", SysDir);
56 dir_uio = opendir(FileName);
63 while (direntry_uio = readdir(dir_uio))
65 if((strcmp((direntry_uio->d_name), ".") == 0) ||
66 (strcmp((direntry_uio->d_name), "..") == 0))
71 sprintf(FileName, "%s/%s/device/vendor", SysDir, direntry_uio->d_name);
72 vendor_id = sysfs_get_value(FileName);
73 sprintf(FileName, "%s/%s/device/device", SysDir, direntry_uio->d_name);
74 device_id = sysfs_get_value(FileName);
77 //Fixme search also through iomaps; add into the same Resources array
78 memset(Resources, 0, sizeof(Resources));
79 sprintf(FileName, "%s/%s/maps", SysDir, direntry_uio->d_name);
80 dir_memmaps = opendir(FileName);
83 printf("%s\n", FileName);
86 while (direntry_memmaps = readdir(dir_memmaps)) {
87 if((strcmp(direntry_memmaps->d_name, ".") == 0) || (strcmp(direntry_memmaps->d_name, "..") == 0))
90 //printf("maps: %s\n", direntry_memmaps->d_name);
91 sprintf(FileName, "%s/%s/maps/%s/addr", SysDir, direntry_uio->d_name, direntry_memmaps->d_name);
92 F = fopen(FileName, "rb");
95 if(fscanf(F, "%llx", &start) != 1)
97 fprintf(stderr, "Syntax error in %s", FileName);
101 Resources[j] = start;
105 sprintf(FileName, "%s/%s/maps/%s/size", SysDir, direntry_uio->d_name, direntry_memmaps->d_name);
106 F = fopen(FileName, "rb");
109 if(fscanf(F, "%llx", &size) != 1)
111 fprintf(stderr, "Syntax error in %s", FileName);
115 Resources[j + 7] = size;
121 index = atoi((direntry_memmaps->d_name) + 3); // "+3", because we have to skip over the word "map"
122 Resources[j + 7 + 7] = index;
126 closedir(dir_memmaps);
128 if(DeviceID == (device_id + (vendor_id << 16)))
130 //printf("DEVICE HAS BEEN FOUND!\n");
131 if(--deviceorder < 1)
133 for(i = 0; i < 7; i++)
135 if(Resources[i] != 0)
137 if(Resources[i] > 0xFFFF)
139 Rec->PhysMemResources[Rec->NumPhysMemResources].Base = Resources[i];
140 Rec->PhysMemResources[Rec->NumPhysMemResources].Length = Resources[i + 7];
141 Rec->PhysMemResources[Rec->NumPhysMemResources].UioMappingIndex =
142 Resources[i + 7 + 7];
143 Rec->NumPhysMemResources ++;
147 Rec->Resources.IOResources[Rec->Resources.NumIOResources].Base = Resources[i];
148 Rec->Resources.IOResources[Rec->Resources.NumIOResources].Length = Resources[i + 7];
149 Rec->Resources.IOResources[Rec->Resources.NumIOResources].UioMappingIndex =
150 Resources[i + 7 + 7];
151 Rec->Resources.NumIOResources ++;
156 Rec->UioDevNum = atoi((direntry_uio->d_name) + 3); //number of uio device
158 RetVal = 1; //device has been found!!
163 //printf("%X %X %s\n", vendor_id, device_id, direntry_uio->d_name);
175 /*****************************************************************************
178 ;* opens device handle by device name and order
180 ;* Input: device name
181 ;* device order number
182 ;* Output: positive number when success; 0 or negative when fails.
184 ;****************************************************************************/
185 int OpenDeviceHandle(const char *devicename, int deviceorder, DriverRecord *Rec)
197 if(!strcmp(devicename,"AD612")) DeviceID = 0x186C0612; /*DeviceID = (Device_ID & (Vendor_ID << 16))*/
198 if(!strcmp(devicename,"MF614")) DeviceID = 0x186C0614;
201 if(!strcmp(devicename,"AD622")) DeviceID = 0x186C0622;
202 if(!strcmp(devicename,"MF624")) DeviceID = 0x186C0624;
203 if(!strcmp(devicename,"MF625")) DeviceID = 0x186C0625;
208 if(!strcmp(devicename,"PCI1753")) DeviceID = 0x13FE1753;
213 if(!strcmp(devicename,"PCD7004")) DeviceID = 0x17600101;
216 if(!strcmp(devicename,"PCT7303B")) DeviceID = 0x17600201;
219 //printf("\n%s deviceID = %X", devicename, DeviceID);
224 RetVal = ScanSys(DeviceID, deviceorder, Rec);