@ -32,7 +32,7 @@
# undef USB_KBD_DEBUG
/*
* i f overwrite_console returns 1 , the stdin , stderr and stdout
* I f overwrite_console returns 1 , the stdin , stderr and stdout
* are switched to the serial port , else the settings in the
* environment are used
*/
@ -41,7 +41,7 @@ extern int overwrite_console (void);
# else
int overwrite_console ( void )
{
return ( 0 ) ;
return 0 ;
}
# endif
@ -52,8 +52,8 @@ int overwrite_console (void)
# endif
# define REPEAT_RATE 40 / 4 /* 40msec -> 25cps */
# define REPEAT_DELAY 10 /* 10 x REA PEAT_RATE = 400msec */
# define REPEAT_RATE (40 / 4) /* 40msec -> 25cps */
# define REPEAT_DELAY 10 /* 10 x RE PEAT_RATE = 400msec */
# define NUM_LOCK 0x53
# define CAPS_LOCK 0x39
@ -72,28 +72,30 @@ int overwrite_console (void)
# define USB_KBD_BUFFER_LEN 0x20 /* size of the keyboardbuffer */
static volatile char usb_kbd_buffer [ USB_KBD_BUFFER_LEN ] ;
static volatile int usb_in_pointer = 0 ;
static volatile int usb_out_pointer = 0 ;
static char usb_kbd_buffer [ USB_KBD_BUFFER_LEN ] ;
static int usb_in_pointer ;
static int usb_out_pointer ;
unsigned char new [ 8 ] ;
unsigned char old [ 8 ] ;
int repeat_delay ;
# define DEVNAME "usbkbd"
static unsigned char num_lock = 0 ;
static unsigned char caps_lock = 0 ;
static unsigned char scroll_lock = 0 ;
static unsigned char ctrl = 0 ;
static unsigned char num_lock ;
static unsigned char caps_lock ;
static unsigned char scroll_lock ;
static unsigned char ctrl ;
static unsigned char leds __attribute__ ( ( aligned ( 0x4 ) ) ) ;
static unsigned char usb_kbd_numkey [ ] = {
' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' , ' 0 ' , ' \r ' , 0x1b , ' \b ' , ' \t ' , ' ' , ' - ' ,
' = ' , ' [ ' , ' ] ' , ' \\ ' , ' # ' , ' ; ' , ' \' ' , ' ` ' , ' , ' , ' . ' , ' / '
' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' , ' 0 ' ,
' \r ' , 0x1b , ' \b ' , ' \t ' , ' ' , ' - ' , ' = ' , ' [ ' , ' ] ' ,
' \\ ' , ' # ' , ' ; ' , ' \' ' , ' ` ' , ' , ' , ' . ' , ' / '
} ;
static unsigned char usb_kbd_numkey_shifted [ ] = {
' ! ' , ' @ ' , ' # ' , ' $ ' , ' % ' , ' ^ ' , ' & ' , ' * ' , ' ( ' , ' ) ' , ' \r ' , 0x1b , ' \b ' , ' \t ' , ' ' , ' _ ' ,
' + ' , ' { ' , ' } ' , ' | ' , ' ~ ' , ' : ' , ' " ' , ' ~ ' , ' < ' , ' > ' , ' ? '
' ! ' , ' @ ' , ' # ' , ' $ ' , ' % ' , ' ^ ' , ' & ' , ' * ' , ' ( ' , ' ) ' ,
' \r ' , 0x1b , ' \b ' , ' \t ' , ' ' , ' _ ' , ' + ' , ' { ' , ' } ' ,
' | ' , ' ~ ' , ' : ' , ' " ' , ' ~ ' , ' < ' , ' > ' , ' ? '
} ;
/******************************************************************
@ -103,11 +105,10 @@ static unsigned char usb_kbd_numkey_shifted[] = {
static void usb_kbd_put_queue ( char data )
{
if ( ( usb_in_pointer + 1 ) = = USB_KBD_BUFFER_LEN ) {
if ( usb_out_pointer = = 0 ) {
if ( usb_out_pointer = = 0 )
return ; /* buffer full */
} else {
else
usb_in_pointer = 0 ;
}
} else {
if ( ( usb_in_pointer + 1 ) = = usb_out_pointer )
return ; /* buffer full */
@ -124,15 +125,15 @@ static int usb_kbd_testc(void)
usb_event_poll ( ) ;
# endif
if ( usb_in_pointer = = usb_out_pointer )
return ( 0 ) ; /* no data */
return 0 ; /* no data */
else
return ( 1 ) ;
return 1 ;
}
/* gets the character from the queue */
static int usb_kbd_getc ( void )
{
char c ;
while ( usb_in_pointer = = usb_out_pointer ) {
while ( usb_in_pointer = = usb_out_pointer )
# ifdef CONFIG_SYS_USB_EVENT_POLL
usb_event_poll ( ) ;
# endif
@ -165,20 +166,25 @@ int drv_usb_kbd_init(void)
if ( dev = = NULL )
return - 1 ;
if ( dev - > devnum ! = - 1 ) {
if ( usb_kbd_probe ( dev , 0 ) = = 1 ) { /* Ok, we found a keyboard */
/* Ok, we found a keyboard */
if ( usb_kbd_probe ( dev , 0 ) = = 1 ) {
/* check, if it is already registered */
USB_KBD_PRINTF ( " USB KBD found set up device. \n " ) ;
USB_KBD_PRINTF ( " USB KBD found set up "
" device. \n " ) ;
old_dev = stdio_get_by_name ( DEVNAME ) ;
if ( old_dev ) {
/* ok, already registered, just return ok */
USB_KBD_PRINTF ( " USB KBD is already registered. \n " ) ;
/* already registered, just return ok */
USB_KBD_PRINTF ( " USB KBD is already "
" registered. \n " ) ;
return 1 ;
}
/* register the keyboard */
USB_KBD_PRINTF ( " USB KBD register. \n " ) ;
memset ( & usb_kbd_dev , 0 , sizeof ( struct stdio_dev ) ) ;
memset ( & usb_kbd_dev , 0 ,
sizeof ( struct stdio_dev ) ) ;
strcpy ( usb_kbd_dev . name , DEVNAME ) ;
usb_kbd_dev . flags = DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM ;
usb_kbd_dev . flags = DEV_FLAGS_INPUT |
DEV_FLAGS_SYSTEM ;
usb_kbd_dev . putc = NULL ;
usb_kbd_dev . puts = NULL ;
usb_kbd_dev . getc = usb_kbd_getc ;
@ -186,13 +192,16 @@ int drv_usb_kbd_init(void)
usb_kbd_dev . priv = ( void * ) dev ;
error = stdio_register ( & usb_kbd_dev ) ;
if ( error = = 0 ) {
/* check if this is the standard input device */
/*
* check if this is the standard
* input device
*/
if ( strcmp ( stdinname , DEVNAME ) = = 0 ) {
/* reassign the console */
if ( overwrite_console ( ) ) {
if ( overwrite_console ( ) )
return 1 ;
}
error = console_assign ( stdin , DEVNAME ) ;
error = console_assign ( stdin ,
DEVNAME ) ;
if ( error = = 0 )
return 1 ;
else
@ -249,7 +258,8 @@ static void usb_kbd_setled(struct usb_device *dev)
# define CAPITAL_MASK 0x20
/* Translate the scancode in ASCII */
static int usb_kbd_translate ( unsigned char scancode , unsigned char modifier , int pressed )
static int usb_kbd_translate ( unsigned char scancode , unsigned char modifier ,
int pressed )
{
unsigned char keycode ;
@ -268,16 +278,21 @@ static int usb_kbd_translate(unsigned char scancode,unsigned char modifier,int p
if ( ( scancode > 3 ) & & ( scancode < = 0x1d ) ) { /* alpha numeric values */
keycode = scancode - 4 + 0x61 ;
if ( caps_lock )
keycode & = ~ CAPITAL_MASK ; /* switch to capital Letters */
if ( ( ( modifier & ( 1 < < LEFT_SHIFT ) ) ! = 0 ) | | ( ( modifier & ( 1 < < RIGHT_SHIFT ) ) ! = 0 ) ) {
/* switch to capital Letters */
keycode & = ~ CAPITAL_MASK ;
if ( ( ( modifier & ( 1 < < LEFT_SHIFT ) ) ! = 0 ) | |
( ( modifier & ( 1 < < RIGHT_SHIFT ) ) ! = 0 ) ) {
if ( keycode & CAPITAL_MASK )
keycode & = ~ CAPITAL_MASK ; /* switch to capital Letters */
/* switch to capital Letters */
keycode & = ~ CAPITAL_MASK ;
else
keycode | = CAPITAL_MASK ; /* switch to non capital Letters */
/* switch to non capital Letters */
keycode | = CAPITAL_MASK ;
}
}
if ( ( scancode > 0x1d ) & & ( scancode < 0x3A ) ) {
if ( ( ( modifier & ( 1 < < LEFT_SHIFT ) ) ! = 0 ) | | ( ( modifier & ( 1 < < RIGHT_SHIFT ) ) ! = 0 ) ) /* shifted */
if ( ( ( modifier & ( 1 < < LEFT_SHIFT ) ) ! = 0 ) | |
( ( modifier & ( 1 < < RIGHT_SHIFT ) ) ! = 0 ) ) /* shifted */
keycode = usb_kbd_numkey_shifted [ scancode - 0x1e ] ;
else /* non shifted */
keycode = usb_kbd_numkey [ scancode - 0x1e ] ;
@ -312,9 +327,9 @@ static int usb_kbd_irq(struct usb_device *dev)
{
int i , res ;
if ( ( dev - > irq_status ! = 0 ) | | ( dev - > irq_act_len ! = 8 ) )
{
USB_KBD_PRINTF ( " usb_keyboard Error %lX, len %d \n " , dev - > irq_status , dev - > irq_act_len ) ;
if ( ( dev - > irq_status ! = 0 ) | | ( dev - > irq_act_len ! = 8 ) ) {
USB_KBD_PRINTF ( " usb_keyboard Error %lX, len %d \n " ,
dev - > irq_status , dev - > irq_act_len ) ;
return 1 ;
}
res = 0 ;
@ -330,18 +345,20 @@ static int usb_kbd_irq(struct usb_device *dev)
}
for ( i = 2 ; i < 8 ; i + + ) {
if ( old [ i ] > 3 & & memscan ( & new [ 2 ] , old [ i ] , 6 ) = = & new [ 8 ] ) {
if ( old [ i ] > 3 & & memscan ( & new [ 2 ] , old [ i ] , 6 ) = = & new [ 8 ] )
res | = usb_kbd_translate ( old [ i ] , new [ 0 ] , 0 ) ;
}
if ( new [ i ] > 3 & & memscan ( & old [ 2 ] , new [ i ] , 6 ) = = & old [ 8 ] ) {
if ( new [ i ] > 3 & & memscan ( & old [ 2 ] , new [ i ] , 6 ) = = & old [ 8 ] )
res | = usb_kbd_translate ( new [ i ] , new [ 0 ] , 1 ) ;
}
}
if ( ( new [ 2 ] > 3 ) & & ( old [ 2 ] = = new [ 2 ] ) ) /* still pressed */
res | = usb_kbd_translate ( new [ 2 ] , new [ 0 ] , 2 ) ;
if ( res = = 1 )
usb_kbd_setled ( dev ) ;
memcpy ( & old [ 0 ] , & new [ 0 ] , 8 ) ;
return 1 ; /* install IRQ Handler again */
}
@ -352,7 +369,8 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
struct usb_endpoint_descriptor * ep ;
int pipe , maxp ;
if ( dev - > descriptor . bNumConfigurations ! = 1 ) return 0 ;
if ( dev - > descriptor . bNumConfigurations ! = 1 )
return 0 ;
iface = & dev - > config . if_desc [ ifnum ] ;
if ( iface - > desc . bInterfaceClass ! = 3 )
@ -366,8 +384,10 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
ep = & iface - > ep_desc [ 0 ] ;
if ( ! ( ep - > bEndpointAddress & 0x80 ) ) return 0 ;
if ( ( ep - > bmAttributes & 3 ) ! = 3 ) return 0 ;
if ( ! ( ep - > bEndpointAddress & 0x80 ) )
return 0 ;
if ( ( ep - > bmAttributes & 3 ) ! = 3 )
return 0 ;
USB_KBD_PRINTF ( " USB KBD found set protocol... \n " ) ;
/* ok, we found a USB Keyboard, install it */
/* usb_kbd_get_hid_desc(dev); */
@ -381,7 +401,8 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
maxp = usb_maxpacket ( dev , pipe ) ;
dev - > irq_handle = usb_kbd_irq ;
USB_KBD_PRINTF ( " USB KBD enable interrupt pipe... \n " ) ;
usb_submit_int_msg ( dev , pipe , & new [ 0 ] , maxp > 8 ? 8 : maxp , ep - > bInterval ) ;
usb_submit_int_msg ( dev , pipe , & new [ 0 ] , maxp > 8 ? 8 : maxp ,
ep - > bInterval ) ;
return 1 ;
}
@ -395,7 +416,7 @@ struct usb_hid_descriptor {
unsigned char bNumDescriptors ;
unsigned char bReportDescriptorType ;
unsigned short wDescriptorLength ;
} __attribute__ ( ( packed ) ) ;
} __packed ;
/*
* We parse each description item into this structure . Short items data
@ -452,7 +473,8 @@ void usb_kbd_display_hid(struct usb_hid_descriptor *hid)
* items , though they are not used yet .
*/
static int fetch_item ( unsigned char * start , unsigned char * end , struct hid_item * item )
static int fetch_item ( unsigned char * start , unsigned char * end ,
struct hid_item * item )
{
if ( ( end - start ) > 0 ) {
unsigned char b = * start + + ;
@ -483,14 +505,16 @@ static int fetch_item(unsigned char *start,unsigned char *end, struct hid_item *
break ;
case 2 :
if ( ( end - start ) > = 2 ) {
item - > data . u16 = le16_to_cpu ( ( unsigned short * ) start ) ;
item - > data . u16 = le16_to_cpu (
( unsigned short * ) start ) ;
start + = 2 ;
return item - > size ;
}
case 3 :
item - > size + + ;
if ( ( end - start ) > = 4 ) {
item - > data . u32 = le32_to_cpu ( ( unsigned long * ) start ) ;
item - > data . u32 = le32_to_cpu (
( unsigned long * ) start ) ;
start + = 4 ;
return item - > size ;
}
@ -708,18 +732,23 @@ static int usb_kbd_get_hid_desc(struct usb_device *dev)
return - 1 ;
head = ( struct usb_descriptor_header * ) & buffer [ 0 ] ;
if ( head - > bDescriptorType ! = USB_DT_CONFIG ) {
printf ( " ERROR: NOT USB_CONFIG_DESC %x \n " , head - > bDescriptorType ) ;
printf ( " ERROR: NOT USB_CONFIG_DESC %x \n " ,
head - > bDescriptorType ) ;
return - 1 ;
}
index = head - > bLength ;
config = ( struct usb_config_descriptor * ) & buffer [ 0 ] ;
len = le16_to_cpu ( config - > wTotalLength ) ;
/* Ok the first entry must be a configuration entry, now process the others */
/*
* Ok the first entry must be a configuration entry ,
* now process the others
*/
head = ( struct usb_descriptor_header * ) & buffer [ index ] ;
while ( index + 1 < len ) {
if ( head - > bDescriptorType = = USB_DT_HID ) {
printf ( " HID desc found \n " ) ;
memcpy ( & usb_kbd_hid_desc , & buffer [ index ] , buffer [ index ] ) ;
memcpy ( & usb_kbd_hid_desc , & buffer [ index ] ,
buffer [ index ] ) ;
le16_to_cpus ( & usb_kbd_hid_desc . bcdHID ) ;
le16_to_cpus ( & usb_kbd_hid_desc . wDescriptorLength ) ;
usb_kbd_display_hid ( & usb_kbd_hid_desc ) ;
@ -732,7 +761,9 @@ static int usb_kbd_get_hid_desc(struct usb_device *dev)
if ( len > 0 )
return - 1 ;
len = usb_kbd_hid_desc . wDescriptorLength ;
if ( ( index = usb_get_class_descriptor ( dev , 0 , USB_DT_REPORT , 0 , & buffer [ 0 ] , len ) ) < 0 ) {
index = usb_get_class_descriptor ( dev , 0 , USB_DT_REPORT , 0 , & buffer [ 0 ] ,
len ) ;
if ( index < 0 ) {
printf ( " reading report descriptor failed \n " ) ;
return - 1 ;
}