/************************************************************************\
## ##
## Creation Date: 18 Mar 2007 ##
## Last Update: 18 Mar 2007 ##
## Author: EviLove ##
## ##
\************************************************************************/
#include "usmcpkt.h"
#include <linux/usb.h>
#include <linux/usbdevice_fs.h>
#include <linux/usb/ch9.h>
#include <linux/module.h> // kzalloc (), kfree ()
#include <asm/uaccess.h>
#include <linux/slab.h>
#define BYTE_I(i) (*(((__u8 * )pPacketData)+i))
#define FIRST_BYTE(pPacketData) (*((__u8 * )pPacketData))
#define SECOND_BYTE(pPacketData) (*(((__u8 * )pPacketData)+1))
#define THIRD_BYTE(pPacketData) (*(((__u8 * )pPacketData)+2))
#define FOURTH_BYTE(pPacketData) (*(((__u8 * )pPacketData)+3))
#define FIRST_WORD(pPacketData) (*((__u16 * )pPacketData))
#define SECOND_WORD(pPacketData) (*(((__u16 * )pPacketData)+1))
#define FIRST_WORD_SWAPPED(pPacketData) ((FIRST_BYTE(pPacketData)<<8)|SECOND_BYTE(pPacketData))
#define SECOND_WORD_SWAPPED(pPacketData) ((THIRD_BYTE(pPacketData)<<8)|FOURTH_BYTE(pPacketData))
#define PACK_WORD(w) (HIBYTE(w)|(LOBYTE(w)<<8))
#define REST_DATA(pPacketData) ((void *)(((__u16 * )pPacketData)+2))
char * user_to_kernel ( const char * user_buf, int len )
{
char * kern_buf;
int i;
kern_buf = ( char * ) kzalloc ( ( ssize_t ) len, GFP_KERNEL );
for ( i = 0 ; i < len ; i++ )
get_user ( kern_buf [i], user_buf + i );
return kern_buf;
}
void bsp_GetDescriptor ( int descriptorType,
__u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
*bRequestType = USB_DIR_IN |
USB_RECIP_DEVICE |
USB_TYPE_STANDARD;
*bRequest = 0x06;
switch ( descriptorType )
{
case GET_DESCRIPTOR_CONFIGURATION:
*wValue = 0x0200;
*wIndex = 0x0000;
*wLength = 0x0009;
break;
case GET_DESCRIPTOR_DEVICE:
*wValue = 0x0100;
*wIndex = 0x0000;
*wLength = 0x0012;
break;
case GET_DESCRIPTOR_STRING:
*wValue = 0x0300;
*wIndex = 0x0409;
*wLength = 0x0002;
break;
}
}
void bsp_GetStatus ( int statusType,
__u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
*bRequest = 0x00;
*wValue = 0x0000;
*wIndex = 0x0000;
*wLength = 0x0002;
switch ( statusType )
{
case GET_STATUS_DEVICE:
*bRequestType = USB_DIR_IN |
USB_RECIP_DEVICE |
USB_TYPE_STANDARD;
break;
case GET_STATUS_ENDPOINT:
*bRequestType = USB_DIR_IN |
USB_RECIP_ENDPOINT |
USB_TYPE_STANDARD;
break;
case GET_STATUS_INTERFACE:
*bRequestType = USB_DIR_IN |
USB_RECIP_INTERFACE |
USB_TYPE_STANDARD;
break;
}
}
void bsp_GetVersion ( __u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
*bRequestType = USB_DIR_IN |
USB_RECIP_DEVICE |
USB_TYPE_STANDARD;
*bRequest = 0x06;
*wValue = 0x0304;
*wIndex = 0x0409;
*wLength = 0x0006;
}
void bsp_GetSerial ( __u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
*bRequestType = USB_DIR_IN |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0xC9; // Dec: 201
*wValue = 0x0000;
*wIndex = 0x0000;
*wLength = 0x0010; // Dec: 16
}
void bsp_GetEncoderState ( __u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
*bRequestType = USB_DIR_IN |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0x85; // Dec: 133
*wValue = 0x0000;
*wIndex = 0x0000;
*wLength = 0x0008;
}
void bsp_GetState ( __u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
*bRequestType = USB_DIR_IN |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0x82; // Dec: 130
*wValue = 0x0000;
*wIndex = 0x0000;
*wLength = 0x000B; // Dec: 11
}
char * bsp_GoTo ( const char * user_buf,
__u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
char * kern_buf;
*bRequestType = USB_DIR_OUT |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0x80; // Dec: 128
*wLength = 0x0003;
kern_buf = user_to_kernel ( user_buf, *wLength + 4 );
*wIndex = FIRST_WORD ( kern_buf );
*wValue = SECOND_WORD ( kern_buf );
return kern_buf;
}
char * bsp_SetMode ( const char * user_buf,
__u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
char * kern_buf;
*bRequestType = USB_DIR_OUT |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0x81; // Dec: 129
*wLength = 0x0003;
kern_buf = user_to_kernel ( user_buf, *wLength + 4 );
*wValue = FIRST_WORD_SWAPPED ( kern_buf );
*wIndex = SECOND_WORD_SWAPPED ( kern_buf );
return kern_buf;
}
char * bsp_SetParameters ( const char * user_buf,
__u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
char * kern_buf;
*bRequestType = USB_DIR_OUT |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0x83; // Dec: 131
*wLength = 0x0035; // Dec: 53
kern_buf = user_to_kernel ( user_buf, *wLength + 4 );
*wValue = FIRST_WORD_SWAPPED ( kern_buf );
*wIndex = SECOND_WORD ( kern_buf );
return kern_buf;
}
char * bsp_Download ( const char * user_buf,
__u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
char * kern_buf;
*bRequestType = USB_DIR_OUT |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0xC8; // Dec: 200
*wLength = 0x003D; // Dec: 61
kern_buf = user_to_kernel ( user_buf, *wLength + 4 );
*wValue = FIRST_WORD_SWAPPED ( kern_buf );
*wIndex = SECOND_WORD_SWAPPED ( kern_buf );
return kern_buf;
}
char * bsp_SetSerial ( const char * user_buf,
__u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
char * kern_buf;
*bRequestType = USB_DIR_OUT |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0xCA; // Dec: 202
*wLength = 0x001C; // Dec: 28
kern_buf = user_to_kernel ( user_buf, *wLength + 4 );
*wValue = FIRST_WORD_SWAPPED ( kern_buf );
*wIndex = SECOND_WORD_SWAPPED ( kern_buf );
return kern_buf;
}
void bsp_SetCurrentPosition ( const char * user_buf,
__u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
char * kern_buf;
*bRequestType = USB_DIR_OUT |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0x01;
*wLength = 0x0000;
kern_buf = user_to_kernel ( user_buf, *wLength + 4 );
*wValue = SECOND_WORD ( kern_buf );
*wIndex = FIRST_WORD ( kern_buf );
}
void bsp_StopStepMotor ( __u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
*bRequestType = USB_DIR_OUT |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0x07;
*wLength = 0x0000;
*wValue = 0x0000;
*wIndex = 0x0000;
}
void bsp_EmulateButtons ( const char * user_buf,
__u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
char * kern_buf;
*bRequestType = USB_DIR_OUT |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0x0D; // Dec: 13
*wLength = 0x0000;
kern_buf = user_to_kernel ( user_buf, *wLength + 1 );
*wValue = FIRST_BYTE ( kern_buf );
*wIndex = 0x0000;
}
void bsp_SaveParameters ( __u8 * bRequestType,
__u8 * bRequest,
__u16 * wValue,
__u16 * wIndex,
__u16 * wLength )
{
*bRequestType = USB_DIR_OUT |
USB_RECIP_DEVICE |
USB_TYPE_VENDOR;
*bRequest = 0x84; // Dec: 132
*wLength = 0x0000;
*wValue = 0x0000;
*wIndex = 0x0000;
}