1 /*
2 ********************************************************************************************************************
3 *                                              usb_host
4 *
5 *                              (c) Copyright 2007-2009, javen.China
6 *                                       All Rights Reserved
7 *
8 * File Name     : usbh_disk_info.c
9 *
10 * Author        : javen
11 *
12 * Version       : 1.0
13 *
14 * Date          : 2009.08.18
15 *
16 * Description   : host支持海量存储类时候的读写状况获取
17 *
18 * History       :
19 *
20 *
21 ********************************************************************************************************************
22 */
23 #include  "usb_os_platform.h"
24 #include  "list_head_ext.h"
25 #include  "usbh_disk_info.h"
26 #include  "error.h"
27 #include  "usb_msc_i.h"
28 
29 static usbh_disk_info_t usbh_disk_info;  /* handle */
30 static unsigned int  usb_disk_status = 0;         /* disk status */
31 
32 static int usbh_disk_GetDeviceInfo(usbh_disk_info_t *disk_info,
33                                      char *DeviceName,
34                                      usbhDeivceInfo_t *usbhDeivceInfo);
35 
36 /*
37 *********************************************************************
38 *                     set_usbh_disk_status
39 *
40 * Description:
41 *
42 * Arguments:
43 *    void
44 * Returns:
45 *    void
46 * note:
47 *    无
48 *
49 *********************************************************************
50 */
set_usbh_disk_status(unsigned int status)51 void set_usbh_disk_status(unsigned int status)
52 {
53     unsigned int cpu_sr = 0;
54     ENTER_CRITICAL(cpu_sr);
55     usb_disk_status = status;
56     EXIT_CRITICAL(cpu_sr);
57 }
58 
59 /*
60 *********************************************************************
61 *                     get_usbh_disk_status
62 *
63 * Description:
64 *
65 * Arguments:
66 *    void
67 * Returns:
68 *    void
69 * note:
70 *    无
71 *
72 *********************************************************************
73 */
get_usbh_disk_status(void)74 unsigned int get_usbh_disk_status(void)
75 {
76     return usb_disk_status;
77 }
78 
79 /*
80 *********************************************************************
81 *                     usbh_disk_info_open
82 *
83 * Description:
84 *
85 * Arguments:
86 *
87 * Returns:
88 *
89 * note:
90 *
91 *
92 *********************************************************************
93 */
usbh_disk_info_open(void * open_arg,uint32_t mode)94 static void *  usbh_disk_info_open(void *open_arg, uint32_t mode)
95 {
96     usbh_disk_info_t *info = &usbh_disk_info;
97     info->cnt++;
98     return (void *)info;
99 }
100 
101 /*
102 *********************************************************************
103 *                     usbh_disk_info_open
104 *
105 * Description:
106 *
107 * Arguments:
108 *
109 * Returns:
110 *
111 * note:
112 *
113 *
114 *********************************************************************
115 */
usbh_disk_info_close(void * hDev)116 static int32_t usbh_disk_info_close(void * hDev)
117 {
118     usbh_disk_info_t *info = &usbh_disk_info;
119 
120     if (hDev != (void *)info)
121     {
122         hal_log_err("PANIC : usbh_disk_info_close() : handle error\n");
123         return EPDK_FAIL;
124     }
125 
126     info->cnt--;
127     return EPDK_OK;
128 }
129 
130 
131 /*
132 *********************************************************************
133 *                     usbh_disk_info_open
134 *
135 * Description:
136 *
137 * Arguments:
138 *
139 * Returns:
140 *
141 * note:
142 *
143 *
144 *********************************************************************
145 */
usbh_disk_info_read(void * pBuffer,uint32_t blk,uint32_t n,void * hDev)146 static uint32_t usbh_disk_info_read(void *pBuffer, uint32_t blk, uint32_t n, void * hDev)
147 {
148     hal_log_err("WARN : usbh_disk_info_read() : can read nothing\n");
149     return 0;
150 }
151 
152 /*
153 *********************************************************************
154 *                     usbh_disk_info_open
155 *
156 * Description:
157 *
158 * Arguments:
159 *
160 * Returns:
161 *
162 * note:
163 *
164 *
165 *********************************************************************
166 */
usbh_disk_info_write(const void * pBuffer,uint32_t blk,uint32_t n,void * hDev)167 static uint32_t usbh_disk_info_write(const void *pBuffer, uint32_t blk, uint32_t n, void * hDev)
168 {
169     hal_log_err("WARN : usbh_disk_info_write() : can write nothing\n");
170     return 0;
171 }
172 
173 /*
174 *********************************************************************
175 *                     usbh_disk_info_open
176 *
177 * Description:
178 *
179 * Arguments:
180 *
181 * Returns:
182 *
183 * note:
184 *
185 *
186 *********************************************************************
187 */
usbh_disk_info_ioctrl(void * hDev,uint32_t Cmd,long Aux,void * pBuffer)188 static int32_t usbh_disk_info_ioctrl(void * hDev, uint32_t Cmd, long Aux, void *pBuffer)
189 {
190     usbh_disk_info_t *info = &usbh_disk_info;
191 
192     if (hDev != (void *)info)
193     {
194         hal_log_err("ERR : handle error, (0x%x, 0x%x)\n", hDev, info);
195         return EPDK_FAIL;
196     }
197 
198     switch (Cmd)
199     {
200         case USB_DEVICE_INFO_USER_CMD_GET_DISK_STATUS:  //read读取当前所有lun的读写状态
201         {
202             unsigned int *p_status = (unsigned int *)pBuffer;
203 
204             if (pBuffer == NULL)
205             {
206                 hal_log_err("PANIC : usbh_disk_info_ioctrl() : buff == NULL, error\n");
207                 return EPDK_FAIL;
208             }
209 
210             *p_status = get_usbh_disk_status();
211         }
212         break;
213 
214         case USB_DEVICE_INFO_USER_CMD_GET_DEVICE_INFO:
215             return usbh_disk_GetDeviceInfo(&usbh_disk_info, (char *)Aux, (usbhDeivceInfo_t *)pBuffer);
216 
217         //break;
218 
219         default:
220             hal_log_err("ERR : usbh_disk_info_ioctrl(), unkown cmd(0x%x)\n", Cmd);
221             return EPDK_FAIL;
222     }
223 
224     return EPDK_OK;
225 }
226 
227 static __dev_devop_t usbh_disk_info_op =
228 {
229     usbh_disk_info_open,
230     usbh_disk_info_close,
231     usbh_disk_info_read,
232     usbh_disk_info_write,
233     usbh_disk_info_ioctrl
234 };
235 
236 /*
237 *********************************************************************
238 *                     usbh_disk_SaveDeviceInfo
239 *
240 * Description:
241 *
242 *
243 * Arguments:
244 *
245 *
246 * Returns:
247 *
248 *
249 * note:
250 *
251 *
252 *********************************************************************
253 */
usbh_disk_SaveDeviceInfo(usbh_disk_device_info_t * device_info)254 void usbh_disk_SaveDeviceInfo(usbh_disk_device_info_t *device_info)
255 {
256     usbh_disk_info_t *disk_info = &usbh_disk_info;
257 
258     if (device_info == NULL)
259     {
260         hal_log_err("ERR: input error\n");
261         return ;
262     }
263     list_head_malloc_and_add((void *)device_info, &(disk_info->device_list));
264 }
265 
266 /*
267 *********************************************************************
268 *                     usbh_disk_FreeDeviceInfo
269 *
270 * Description:
271 *
272 *
273 * Arguments:
274 *
275 *
276 * Returns:
277 *
278 *
279 * note:
280 *
281 *
282 *********************************************************************
283 */
usbh_disk_FreeDeviceInfo(usbh_disk_device_info_t * device_info)284 void usbh_disk_FreeDeviceInfo(usbh_disk_device_info_t *device_info)
285 {
286     usbh_disk_info_t *disk_info = &usbh_disk_info;
287 
288     if (device_info == NULL)
289     {
290         hal_log_err("ERR: input error\n");
291         return ;
292     }
293 
294     list_del_node_by_data((void *)device_info, &(disk_info->device_list));
295 }
296 
297 /*
298 *********************************************************************
299 *                     usbh_disk_GetDeviceInfo
300 *
301 * Description:
302 *
303 *
304 * Arguments:
305 *
306 *
307 * Returns:
308 *
309 *
310 * note:
311 *
312 *
313 *********************************************************************
314 */
usbh_disk_GetDeviceInfo(usbh_disk_info_t * disk_info,char * DeviceName,usbhDeivceInfo_t * usbhDeivceInfo)315 static int usbh_disk_GetDeviceInfo(usbh_disk_info_t *disk_info,
316                                      char *DeviceName,
317                                      usbhDeivceInfo_t *usbhDeivceInfo)
318 {
319     struct usb_list_head *head      = NULL;
320     struct usb_list_head *list_now  = NULL;
321     struct usb_list_head *list_next = NULL;
322     usbh_disk_device_info_t *device_info = NULL;
323     unsigned int is_find = 0;
324 
325     if (DeviceName == NULL || disk_info == NULL)
326     {
327         hal_log_err("ERR: input error\n");
328         return EPDK_FAIL;
329     }
330 
331     head = &(disk_info->device_list);
332     list_now = head->next;
333 
334     while (head != list_now)
335     {
336         list_next = list_now->next;
337         device_info = (usbh_disk_device_info_t *)list_now->data;
338 
339         if (device_info)
340         {
341             /* 找到对应的设备 */
342             if (strcmp(DeviceName, device_info->DeviceName) == 0)
343             {
344                 memcpy(usbhDeivceInfo, &device_info->DeivceInfo, sizeof(usbhDeivceInfo_t));
345                 is_find = 1;
346             }
347         }
348 
349         list_now = list_next;
350     }
351 
352     if (is_find)
353     {
354         return EPDK_OK;
355     }
356 
357     return EPDK_FAIL;
358 }
359 
360 /*
361 *********************************************************************
362 *                     usbh_disk_info_open
363 *
364 * Description:
365 *     sd信息设备,目前主要用于监测sd设备的读写情况
366 * Arguments:
367 *
368 * Returns:
369 *
370 * note:
371 *
372 *
373 *********************************************************************
374 */
usbh_disk_info_reg(void)375 int usbh_disk_info_reg(void)
376 {
377     usbh_disk_info_t *info = &usbh_disk_info;
378     usb_disk_status = 0;
379     memset(info, 0, sizeof(usbh_disk_info_t));
380     USB_INIT_LIST_HEAD(&info->device_list);
381     info->reghandle = esDEV_DevReg(DEV_CLASS_USERDEF, USB_DEVICE_INFO_NAME, &usbh_disk_info_op, NULL);
382 
383     if (info->reghandle == NULL)
384     {
385         hal_log_err("ERR: register to the block layer failed.\n");
386         return -1;
387     }
388 
389     return 0;
390 }
391 
392 /*
393 *********************************************************************
394 *                     usbh_disk_info_open
395 *
396 * Description:
397 *     sd信息设备,目前主要用于监测sd设备的读写情况
398 * Arguments:
399 *
400 * Returns:
401 *
402 * note:
403 *
404 *
405 *********************************************************************
406 */
usbh_disk_info_unreg(void)407 int usbh_disk_info_unreg(void)
408 {
409     usbh_disk_info_t *info = &usbh_disk_info;
410     int ret = 0;
411 
412     if (info->reghandle == NULL)
413     {
414         hal_log_err("ERR: usbh_disk_info_unreg: info->reghandle == NULL\n");
415         return -1;
416     }
417 
418     ret = esDEV_DevUnreg(info->reghandle);
419     memset(info, 0, sizeof(usbh_disk_info_t));
420     return ret;
421 }
422 
423 
424