]> rtime.felk.cvut.cz Git - mf6xx.git/blob - src/HuLinux-2.4.3/opendevh.c
8a60409603c19c31f2f8d25e590a9ee9539f51a1
[mf6xx.git] / src / HuLinux-2.4.3 / opendevh.c
1 /******************************************************************/
2 /**@file opendev.c:
3  * Desctiption: Humusoft data acquisition Linux library
4  implementation.                                   *
5  * Dependency: Linux                                              *
6  *                Copyright 2006-2007 Jaroslav Fojtik             *
7  ******************************************************************/
8 #include <stdio.h>
9 #include <malloc.h>
10 #include <string.h>
11 #include <dirent.h>
12
13 #include "hudaqlib.h"
14 #include "hudaq_internal.h"
15
16
17 static int sysfs_get_value(const char *FileName)
18 {
19         FILE *F;
20         int RetVal;
21
22         F=fopen(FileName,"rb");
23         if(F==NULL) return -1;
24
25         fscanf(F,"%X",&RetVal);
26         fclose(F);
27         return RetVal;
28 }
29
30 static int ScanSys(DWORD DeviceID, int deviceorder, DriverRecord *Rec)
31 {
32         DIR *dir;
33         FILE *F;
34         char ch;
35         struct dirent *entry;
36         unsigned vendor_id;
37         unsigned device_id;
38         char FileName[1024];
39         const char *SysDir="/sys/bus/pci/devices";
40         unsigned long long start, end, size;
41         DWORD Resources[14];
42         int i;
43         int RetVal=0;
44
45         if(deviceorder <= 0) return -1;
46         if(Rec==NULL) return -2;
47
48         Rec->NumPhysMemResources = Rec->Resources.NumIOResources = 0;
49
50         sprintf(FileName,"%s",SysDir);
51         dir = opendir(FileName);
52         if(!dir)
53         {
54                 //fprintf(stderr,"Cannot open /sys/bus/pci/devices");
55                 return -3;
56         }
57
58         while ((entry = readdir(dir)))
59         {
60                 if(entry->d_name[0]=='.') continue;
61
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);
66
67                 memset(Resources, 0, sizeof(Resources));    
68                 sprintf(FileName,"%s/%s/resource",SysDir,entry->d_name);
69                 F=fopen(FileName,"rb");
70                 if(F)
71                 {
72                         for(i=0;i<7;i++)
73                         {
74                                 if(fscanf(F,"%llx %llx", &start, &end) != 2)
75                                 {
76                                         fprintf(stderr,"Syntax error in %s", FileName);
77                                         break;
78                                 }
79                                 do
80                                 {  
81                                         ch=fgetc(F);
82                                         if(feof(F)) break;
83                                 } while(ch!='\r' && ch!='\n' && ch!=0);  
84
85                                 if(start)
86                                         size = end - start + 1;
87                                 else
88                                         size = 0;
89
90                                 Resources[i]=start;
91                                 Resources[i+7]=size;
92                         }
93                         fclose(F);
94                 }
95
96                 if(DeviceID==(device_id+(vendor_id<<16)))
97                 {
98                         //printf("DEVICE HAS BEEN FOUND!");
99                         if(--deviceorder<1)
100                         {
101                                 for(i=0;i<7;i++)
102                                 {
103                                         if(Resources[i]!=0)
104                                         {
105                                                 if(Resources[i] > 0xFFFF)
106                                                 {
107                                                         Rec->PhysMemResources[Rec->NumPhysMemResources].Base=Resources[i];
108                                                         Rec->PhysMemResources[Rec->NumPhysMemResources].Length=Resources[i+7];
109                                                         Rec->NumPhysMemResources++;
110                                                 }
111                                                 else
112                                                 {
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++;
116                                                 }
117                                         }
118                                 }
119                                 RetVal=1;    //device has been found!!
120                                 break;
121                         }
122                 }    
123
124                 //  printf("%X %X %s\n", vendor_id, device_id, entry->d_name);
125         }
126
127         closedir(dir);    
128         return RetVal;
129 }
130
131
132 static int ScanProc(DWORD DeviceID, int deviceorder, DriverRecord *Rec)
133 {
134         FILE *devices;
135         DWORD DevTblID;
136         DWORD DevPos, DevInt;
137         DWORD Resources[14];
138         int i;
139         char ch;
140         int RetVal=0;
141
142         if(deviceorder <= 0) return -1;
143         if(Rec==NULL) return -2;
144
145         Rec->NumPhysMemResources = Rec->Resources.NumIOResources = 0;
146
147         //devices=fopen("devices","rb");
148         devices=fopen("/proc/bus/pci/devices","rb");
149         if(devices==NULL) return -4;
150
151         /* loop over devices */
152         while (!feof(devices))
153         {
154                 if(fscanf(devices,"%X %X %X", &DevPos, &DevTblID, & DevInt)!=3)
155                         return -5;
156
157                 memset(Resources, 0, sizeof(Resources));
158                 for(i=0; i<14; i++)
159                 {
160                         if(fscanf(devices,"%X", &Resources[i])!=1)
161                         {
162                                 if(i==6 || i==7) break;  //correct
163                                 break; //strange
164                         }
165                 }
166                 do {    
167                         ch=fgetc(devices);
168                         if(feof(devices)) break;
169                 } while(ch!='\r' && ch!='\n' && ch!=0);
170
171                 if(DeviceID==DevTblID)
172                 {
173                         if(--deviceorder<1)
174                         {
175                                 for(i=0;i<7;i++)
176                                 {
177                                         if(Resources[i]!=0)
178                                         {
179                                                 if(Resources[i] & 1)
180                                                 {
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++;
184                                                 }
185                                                 else
186                                                 {
187                                                         Rec->PhysMemResources[Rec->NumPhysMemResources].Base=Resources[i];
188                                                         Rec->PhysMemResources[Rec->NumPhysMemResources].Length=Resources[i+7];
189                                                         Rec->NumPhysMemResources++;
190                                                 }
191                                         }
192                                 }
193                                 RetVal=1;    //device has been found!!
194                                 break;
195                         }
196                 }
197         }
198
199         fclose(devices);
200         return(RetVal);
201 }
202
203
204
205
206
207 /*****************************************************************************
208   ;*
209   ;*              OpenDeviceHandle
210   ;*              opens device handle by device name and order
211   ;*
212   ;*              Input:  device name
213   ;*                      device order number
214   ;*              Output: positive number when success; 0 or negative when fails.
215   ;*
216   ;****************************************************************************/
217 int OpenDeviceHandle(const char *devicename, int deviceorder, DriverRecord *Rec)
218 {
219         DWORD DeviceID=0;
220         int RetVal;
221
222         if(deviceorder <= 0) return -1;
223         if(Rec==NULL) return -2;
224
225         /* Humusoft */
226 #ifdef MF61X
227         if(!strcmp(devicename,"AD612")) DeviceID=0x186C0612;
228         if(!strcmp(devicename,"MF614")) DeviceID=0x186C0614;
229 #endif
230 #ifdef MF62X
231         if(!strcmp(devicename,"AD622")) DeviceID=0x186C0622;
232         if(!strcmp(devicename,"MF624")) DeviceID=0x186C0624;
233         if(!strcmp(devicename,"MF625")) DeviceID=0x186C0625;
234 #endif  
235
236         /* Advantech */
237 #ifdef PCI1753
238         if(!strcmp(devicename,"PCI1753")) DeviceID=0x13FE1753;
239 #endif
240
241         /* Tedia */  
242 #ifdef PCD7004
243         if(!strcmp(devicename,"PCD7004")) DeviceID=0x17600101;
244 #endif
245 #ifdef PCT7303B
246         if(!strcmp(devicename,"PCT7303B")) DeviceID=0x17600201;
247 #endif
248
249         //printf("\n%s deviceID = %X", devicename, DeviceID);
250
251         if(DeviceID==0) return -3;
252
253         RetVal = ScanSys(DeviceID, deviceorder, Rec);
254         if(RetVal>0) return RetVal;
255         RetVal = ScanProc(DeviceID, deviceorder, Rec);
256         if(RetVal>0) return RetVal;  
257
258         return(RetVal);
259 }
260
261