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