| /******************************************************************************* |
| Copyright (C) Marvell International Ltd. and its affiliates |
| |
| ******************************************************************************** |
| Marvell GPL License Option |
| |
| If you received this File from Marvell, you may opt to use, redistribute and/or |
| modify this File in accordance with the terms and conditions of the General |
| Public License Version 2, June 1991 (the "GPL License"), a copy of which is |
| available along with the File in the license.txt file or by writing to the Free |
| Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or |
| on the worldwide web at http://www.gnu.org/licenses/gpl.txt. |
| |
| THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED |
| WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY |
| DISCLAIMED. The GPL License provides additional details about this warranty |
| disclaimer. |
| |
| *******************************************************************************/ |
| |
| #include <config.h> |
| #include <common.h> |
| #include <command.h> |
| |
| #include "mvOs.h" |
| #include "mvCommon.h" |
| #include "mvDebug.h" |
| #include "mvBoardEnvSpec.h" |
| #include "mvUsb.h" |
| #include "mvUsbDevApi.h" |
| #include "disk.h" |
| #include "mouse.h" |
| |
| #define USB_DISK_DEFAULT_SIZE 2048 |
| |
| extern MV_U32 mvUsbGetCapRegAddr(int devNo); |
| |
| typedef struct |
| { |
| _usb_device_handle handle; |
| MV_BOOL isMouse; |
| int gppNo; |
| |
| } MV_USB_DEVICE; |
| |
| MV_BOOL mvUsbIsFirst = MV_TRUE; |
| MV_USB_DEVICE mvUsbDevice[MV_BOARD_MAX_USB_IF]; |
| |
| |
| USB_IMPORT_FUNCS usbImportFuncs = |
| { |
| printf, |
| mvOsSPrintf, |
| mvOsIoUncachedMalloc, |
| mvOsIoUncachedFree, |
| mvOsMalloc, |
| mvOsFree, |
| memset, |
| memcpy, |
| mvOsCacheFlush, |
| mvOsCacheInvalidate, |
| mvOsIoVirtToPhy, |
| NULL, |
| NULL, |
| mvUsbGetCapRegAddr, |
| NULL |
| }; |
| |
| |
| static void print_args(int argc, char** argv) |
| { |
| int i; |
| |
| for(i=0; i<argc; i++) |
| { |
| mvOsPrintf("argv[%d]=%s, ", i, argv[i]); |
| } |
| mvOsPrintf("\n"); |
| } |
| |
| static void mvUsbDevsInit(void) |
| { |
| int dev; |
| |
| for(dev=0; dev<mvCtrlUsbMaxGet(); dev++) |
| { |
| mvUsbDevice[dev].handle = NULL; |
| mvUsbDevice[dev].gppNo = -1; |
| mvUsbDevice[dev].isMouse = MV_FALSE; |
| mvUsbInit(dev, MV_FALSE); |
| |
| #ifdef MV_USB_VOLTAGE_FIX |
| mvUsbDevice[dev].gppNo = mvUsbGppInit(dev); |
| #endif /* MV_USB_VOLTAGE_FIX */ |
| } |
| /* First of all. */ |
| _usb_device_set_bsp_funcs(&usbImportFuncs); |
| } |
| |
| static void mvUsbPolling(void) |
| { |
| int dev, counter = 0; |
| |
| mvOsPrintf("Start USB ISR polling:"); |
| for(dev=0; dev<mvCtrlUsbMaxGet(); dev++) |
| { |
| mvOsPrintf(" dev-%d - handle=%p\n", dev, mvUsbDevice[dev].handle); |
| } |
| mvOsPrintf("\n"); |
| |
| while (TRUE) |
| { |
| counter++; |
| for(dev=0; dev<mvCtrlUsbMaxGet(); dev++) |
| { |
| if(mvUsbDevice[dev].handle == NULL) |
| continue; |
| |
| #ifdef MV_USB_VOLTAGE_FIX |
| /* Polling VBUS */ |
| if(mvUsbDevice[dev].gppNo != -1) |
| mvUsbBackVoltageUpdate(dev, mvUsbDevice[dev].gppNo); |
| #endif /* MV_USB_VOLTAGE_FIX */ |
| |
| /* Polling USB interrupts */ |
| _usb_dci_vusb20_isr(mvUsbDevice[dev].handle); |
| |
| if(mvUsbDevice[dev].isMouse) |
| { |
| if (counter >= 1000000) |
| { /* Body */ |
| usbMousePeriodicResume(mvUsbDevice[dev].handle); |
| } |
| } /* Endbody */ |
| } |
| if( (counter & 0xFFFFF) == 0) |
| mvOsPrintf("."); |
| |
| if (ctrlc()) |
| { |
| puts ("\nAbort\n"); |
| return; |
| } |
| } /* Endwhile */ |
| } |
| |
| static void mvUsbUnload(int dev) |
| { |
| if(mvUsbDevice[dev].handle == NULL) |
| { |
| mvOsPrintf("USB-%d Device is not loaded\n", dev); |
| return; |
| } |
| |
| mvOsPrintf("Unload USB=%d Device: handle=%p\n", |
| dev, mvUsbDevice[dev].handle); |
| if(mvUsbDevice[dev].isMouse) |
| { |
| usbMouseUnload(mvUsbDevice[dev].handle); |
| } |
| else |
| { |
| usbDiskUnload(mvUsbDevice[dev].handle); |
| } |
| mvUsbDevice[dev].handle = NULL; |
| mvUsbDevice[dev].gppNo = -1; |
| mvUsbDevice[dev].isMouse = MV_FALSE; |
| } |
| |
| |
| static void mvUsbDisk(int dev, int diskSize) |
| { |
| if(mvUsbDevice[dev].handle != NULL) |
| { |
| mvOsPrintf("USB-%d device already in use\n", dev); |
| return; |
| } |
| |
| if(diskSize == 0) |
| diskSize = USB_DISK_DEFAULT_SIZE; |
| |
| mvOsPrintf("Load USB-%d Disk example: disk size is %d Kbytes\n", |
| dev, diskSize); |
| |
| mvUsbDevice[dev].handle = usbDiskLoad(dev, diskSize); |
| if(mvUsbDevice[dev].handle == NULL) |
| { |
| mvOsPrintf("usbDiskLoad-%d FAILED\n", dev); |
| return; |
| } |
| mvUsbPolling(); |
| } |
| |
| static void mvUsbMouse(int dev) |
| { |
| if(mvUsbDevice[dev].handle != NULL) |
| { |
| mvOsPrintf("USB-%d device is already in use\n", dev); |
| return; |
| } |
| |
| mvOsPrintf("Load USB-%d Mouse example\n", dev); |
| |
| mvUsbDevice[dev].handle = usbMouseLoad(dev); |
| if(mvUsbDevice[dev].handle == NULL) |
| { |
| mvOsPrintf("usbMouseLoad-%d FAILED\n", dev); |
| return; |
| } |
| mvUsbDevice[dev].isMouse = MV_TRUE; |
| mvUsbPolling(); |
| } |
| |
| int mvUsbCmdMain(int argc, char *argv[]) |
| { |
| _usb_device_handle handle = NULL; |
| int i, mode, dev; |
| |
| if(mvUsbIsFirst == MV_TRUE) |
| { |
| mvUsbDevsInit(); |
| mvUsbIsFirst = MV_FALSE; |
| } |
| if(argc <= 1) |
| { |
| mvOsPrintf("usbTest: not enough parameters\n"); |
| return 2; |
| } |
| print_args(argc, argv); |
| |
| if(memcmp(argv[1], "flags", strlen(argv[1])) == 0) |
| { |
| mvOsPrintf("USB old debug flags = 0x%x\n", _usb_debug_get_flags()); |
| if(argc > 2) |
| { |
| mode = strtol(argv[2], NULL, 16); |
| _usb_debug_set_flags(mode); |
| mvOsPrintf("USB new debug flags = 0x%x\n", _usb_debug_get_flags()); |
| } |
| return 0; |
| } |
| if(memcmp(argv[1], "poll", strlen(argv[1])) == 0) |
| { |
| mvUsbPolling(); |
| return 0; |
| } |
| |
| dev = 0; |
| if(argc > 2) |
| dev = strtol(argv[2], NULL, 10); |
| |
| handle = mvUsbDevice[dev].handle; |
| if(handle == NULL) |
| { |
| mvOsPrintf("USB Device core is not initialized\n"); |
| return 3; |
| } |
| |
| if(memcmp(argv[1], "show", strlen(argv[1])) == 0) |
| { |
| mode = 0; |
| if(argc > 3) |
| mode = strtol(argv[3], NULL, 16); |
| |
| if( MV_BIT_CHECK(mode, 0) ) |
| _usb_regs(handle); |
| |
| if( MV_BIT_CHECK(mode, 1) ) |
| _usb_status(handle); |
| |
| if( MV_BIT_CHECK(mode, 2) ) |
| _usb_stats(handle); |
| |
| if( MV_BIT_CHECK(mode, 3) ) |
| _usb_debug_print_trace_log(); |
| |
| for(i=0; i<_usb_device_get_max_endpoint(handle); i++) |
| { |
| if( MV_BIT_CHECK(mode, (8+i)) ) |
| { |
| _usb_ep_status(handle, i, ARC_USB_RECV); |
| _usb_ep_status(handle, i, ARC_USB_SEND); |
| } |
| } |
| return 0; |
| } |
| |
| if(memcmp(argv[1], "test", strlen(argv[1])) == 0) |
| { |
| /* Set Test mode */ |
| mode = 0; |
| if(argc > 3) |
| mode = strtol(argv[3], NULL, 10); |
| |
| mvOsPrintf("USB test: set test mode %d\n", mode); |
| _usb_dci_vusb20_set_test_mode(handle, (mode & 0x7) << 8); |
| |
| return 0; |
| } |
| |
| mvOsPrintf("USB test: Unexpected command %s\n", argv[1]); |
| return 3; |
| } |
| |
| int mvUsbDevMain(int argc, char *argv[]) |
| { |
| int dev, diskSize = 0; |
| |
| if(mvUsbIsFirst == MV_TRUE) |
| { |
| mvUsbDevsInit(); |
| mvUsbIsFirst = MV_FALSE; |
| } |
| |
| dev = strtol(argv[1], NULL, 10); |
| |
| if(memcmp(argv[2], "disk", strlen(argv[2])) == 0) |
| { |
| if(argc > 3) |
| diskSize = strtol(argv[3], NULL, 10); |
| |
| mvUsbDisk(dev, diskSize); |
| return 0; |
| } |
| |
| if(memcmp(argv[2], "mouse", strlen(argv[2])) == 0) |
| { |
| mvUsbMouse(dev); |
| return 0; |
| } |
| |
| if( memcmp(argv[2], "unload", strlen(argv[2])) == 0) |
| { |
| mvUsbUnload(dev); |
| return 0; |
| } |
| |
| mvOsPrintf("usbDev unknown command\n"); |
| return 1; |
| } |
| |
| int mvUsbCmd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) |
| { |
| if( (argc == 0) || (argc == 1) ) |
| { |
| mvOsPrintf ("Usage:\n%s\n", cmdtp->usage); |
| return 1; |
| } |
| return mvUsbCmdMain(argc, argv); |
| } |
| |
| int mvUsbDev(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) |
| { |
| if(argc < 2) |
| { |
| mvOsPrintf ("Usage:\n%s\n", cmdtp->usage); |
| return 1; |
| } |
| return mvUsbDevMain(argc, argv); |
| } |
| |
| |
| U_BOOT_CMD( |
| usbCmd, 4, 1, mvUsbCmd, |
| "usbCmd - USB Device sub-system\n", |
| "\n" |
| "\t usbCmd flags [mask] - Get/Set debug flags\n" |
| "\t usbCmd poll - Polling IRQs for all USB devices for never\n" |
| "\t usbCmd show <devId> [mask] - Print out USB device information\n" |
| "\t usbCmd test <devId> [mode] - Set USB device to test mode\n" |
| ); |
| |
| U_BOOT_CMD( |
| usbDev, 5, 0, mvUsbDev, |
| "usbDev - Load/Unload USB Devices\n", |
| "\t usbDev <devId> disk [kBytes] - Load USB Disk device\n" |
| "\t usbDev <devId> mouse - Load USB Mouse device\n" |
| "\t usbDev <devId> unload - Unload USB device\n" |
| ); |