usb_ctl.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:23k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1.  /*
  2.  * Copyright (C) Compaq Computer Corporation, 1998, 1999
  3.  *  Copyright (C) Extenex Corporation, 2001
  4.  *
  5.  *  usb_ctl.c
  6.  *
  7.  *  SA1100 USB controller core driver.
  8.  *
  9.  *  This file provides interrupt routing and overall coordination
  10.  *  of the three endpoints in usb_ep0, usb_receive (1),  and usb_send (2).
  11.  *
  12.  *  Please see linux/Documentation/arm/SA1100/SA1100_USB for details.
  13.  *
  14.  */
  15. #include <linux/config.h>
  16. #include <linux/module.h>
  17. #include <linux/init.h>
  18. #include <linux/proc_fs.h>
  19. #include <linux/tqueue.h>
  20. #include <linux/delay.h>
  21. #include <linux/sched.h>
  22. #include <linux/slab.h>
  23. #include <asm/io.h>
  24. #include <asm/dma.h>
  25. #include <asm/irq.h>
  26. #include <asm/mach-types.h>
  27. #include "sa1100_usb.h"
  28. #include "usb_ctl.h"
  29. //////////////////////////////////////////////////////////////////////////////
  30. // Prototypes
  31. //////////////////////////////////////////////////////////////////////////////
  32. int usbctl_next_state_on_event( int event );
  33. static void udc_int_hndlr(int, void *, struct pt_regs *);
  34. static void initialize_descriptors( void );
  35. static void soft_connect_hook( int enable );
  36. static void udc_disable(void);
  37. static void udc_enable(void);
  38. #if CONFIG_PROC_FS
  39. #define PROC_NODE_NAME "sausb"
  40. static int usbctl_read_proc(char *page, char **start, off_t off,
  41. int count, int *eof, void *data);
  42. #endif
  43. //////////////////////////////////////////////////////////////////////////////
  44. // Globals
  45. //////////////////////////////////////////////////////////////////////////////
  46. static const char pszMe[] = "usbctl: ";
  47. struct usb_info_t usbd_info;  /* global to ep0, usb_recv, usb_send */
  48. /* device descriptors */
  49. static desc_t desc;
  50. #define MAX_STRING_DESC 8
  51. static string_desc_t * string_desc_array[ MAX_STRING_DESC ];
  52. static string_desc_t sd_zero;  /* special sd_zero holds language codes */
  53. // called when configured
  54. static usb_notify_t configured_callback = NULL;
  55. enum { kStateZombie  = 0,  kStateZombieSuspend  = 1,
  56. kStateDefault = 2,  kStateDefaultSuspend = 3,
  57. kStateAddr    = 4,  kStateAddrSuspend    = 5,
  58. kStateConfig  = 6,  kStateConfigSuspend  = 7
  59. };
  60. static int device_state_machine[8][6] = {
  61. //                suspend               reset          resume     adddr config deconfig
  62. /* zombie */  {  kStateZombieSuspend,  kStateDefault, kError,    kError, kError, kError },
  63. /* zom sus */ {  kError, kStateDefault, kStateZombie, kError, kError, kError },
  64. /* default */ {  kStateDefaultSuspend, kError, kStateDefault, kStateAddr, kError, kError },
  65. /* def sus */ {  kError, kStateDefault, kStateDefault, kError, kError, kError },
  66. /* addr */    {  kStateAddrSuspend, kStateDefault, kError, kError, kStateConfig, kError },
  67. /* addr sus */{  kError, kStateDefault, kStateAddr, kError, kError, kError },
  68. /* config */  {  kStateConfigSuspend, kStateDefault, kError, kError, kError, kStateAddr },
  69. /* cfg sus */ {  kError, kStateDefault, kStateConfig, kError, kError, kError }
  70. };
  71. /* "device state" is the usb device framework state, as opposed to the
  72.    "state machine state" which is whatever the driver needs and is much
  73.    more fine grained
  74. */
  75. static int sm_state_to_device_state[8] =
  76. //  zombie           zom suspend          default            default sus
  77. { USB_STATE_POWERED, USB_STATE_SUSPENDED, USB_STATE_DEFAULT, USB_STATE_SUSPENDED,
  78. // addr              addr sus             config                config sus
  79.   USB_STATE_ADDRESS, USB_STATE_SUSPENDED, USB_STATE_CONFIGURED, USB_STATE_SUSPENDED
  80. };
  81. static char * state_names[8] =
  82. { "zombie", "zombie suspended", "default", "default suspended",
  83.   "address", "address suspended", "configured", "config suspended"
  84. };
  85. static char * event_names[6] =
  86. { "suspend", "reset", "resume",
  87.   "address assigned", "configure", "de-configure"
  88. };
  89. static char * device_state_names[] =
  90. { "not attached", "attached", "powered", "default",
  91.   "address", "configured", "suspended" };
  92. static int sm_state = kStateZombie;
  93. //////////////////////////////////////////////////////////////////////////////
  94. // Async
  95. //////////////////////////////////////////////////////////////////////////////
  96. static void core_kicker(void);
  97. static inline void enable_resume_mask_suspend( void );
  98. static inline void enable_suspend_mask_resume(void);
  99. static void
  100. udc_int_hndlr(int irq, void *dev_id, struct pt_regs *regs)
  101. {
  102.    __u32 status = Ser0UDCSR;
  103. /* ReSeT Interrupt Request - UDC has been reset */
  104. if ( status & UDCSR_RSTIR )
  105. {
  106. if ( usbctl_next_state_on_event( kEvReset ) != kError )
  107. {
  108. /* starting 20ms or so reset sequence now... */
  109. printk("%sResettingn", pszMe);
  110. ep0_reset();  // just set state to idle
  111. ep1_reset();  // flush dma, clear false stall
  112. ep2_reset();  // flush dma, clear false stall
  113. }
  114. // mask reset ints, they flood during sequence, enable
  115. // suspend and resume
  116. Ser0UDCCR |= UDCCR_REM;    // mask reset
  117. Ser0UDCCR &= ~(UDCCR_SUSIM | UDCCR_RESIM); // enable suspend and resume
  118. UDC_flip(  Ser0UDCSR, status ); // clear all pending sources
  119. return; // <-- no reason to continue if resetting
  120. }
  121. // else we have done something other than reset, so be sure reset enabled
  122. UDC_clear( Ser0UDCCR, UDCCR_REM );
  123. /* RESume Interrupt Request */
  124. if ( status & UDCSR_RESIR )
  125. {
  126. usbctl_next_state_on_event( kEvResume );
  127. core_kicker();
  128. enable_suspend_mask_resume();
  129. }
  130. /* SUSpend Interrupt Request */
  131. if ( status & UDCSR_SUSIR )
  132. {
  133. usbctl_next_state_on_event( kEvSuspend );
  134. enable_resume_mask_suspend();
  135. }
  136. UDC_flip(Ser0UDCSR, status); // clear all pending sources
  137. if (status & UDCSR_EIR)
  138.  ep0_int_hndlr();
  139. if (status & UDCSR_RIR)
  140. ep1_int_hndlr(status);
  141. if (status & UDCSR_TIR)
  142. ep2_int_hndlr(status);
  143. }
  144. static inline void enable_resume_mask_suspend( void )
  145. {
  146.  int i = 0;
  147.  while( 1 ) {
  148.   Ser0UDCCR |= UDCCR_SUSIM; // mask future suspend events
  149.   udelay( i );
  150.   if ( (Ser0UDCCR & UDCCR_SUSIM) || (Ser0UDCSR & UDCSR_RSTIR) )
  151.    break;
  152.   if ( ++i == 50 ) {
  153.    printk( "%senable_resume(): Could not set SUSIM %8.8Xn",
  154.    pszMe, Ser0UDCCR );
  155.    break;
  156.   }
  157.  }
  158.  i = 0;
  159.  while( 1 ) {
  160.   Ser0UDCCR &= ~UDCCR_RESIM;
  161.   udelay( i );
  162.   if ( ( Ser0UDCCR & UDCCR_RESIM ) == 0
  163.    ||
  164.    (Ser0UDCSR & UDCSR_RSTIR)
  165.  )
  166.    break;
  167.   if ( ++i == 50 ) {
  168.    printk( "%senable_resume(): Could not clear RESIM %8.8Xn",
  169.    pszMe, Ser0UDCCR );
  170.    break;
  171.   }
  172.  }
  173. }
  174. static inline void enable_suspend_mask_resume(void)
  175. {
  176.  int i = 0;
  177.  while( 1 ) {
  178.   Ser0UDCCR |= UDCCR_RESIM; // mask future resume events
  179.   udelay( i );
  180.   if ( Ser0UDCCR & UDCCR_RESIM || (Ser0UDCSR & UDCSR_RSTIR) )
  181.    break;
  182.   if ( ++i == 50 ) {
  183.    printk( "%senable_suspend(): Could not set RESIM %8.8Xn",
  184.    pszMe, Ser0UDCCR );
  185.    break;
  186.   }
  187.  }
  188.  i = 0;
  189.  while( 1 ) {
  190.   Ser0UDCCR &= ~UDCCR_SUSIM;
  191.   udelay( i );
  192.   if ( ( Ser0UDCCR & UDCCR_SUSIM ) == 0
  193.    ||
  194.    (Ser0UDCSR & UDCSR_RSTIR)
  195.  )
  196.    break;
  197.   if ( ++i == 50 ) {
  198.    printk( "%senable_suspend(): Could not clear SUSIM %8.8Xn",
  199.    pszMe, Ser0UDCCR );
  200.    break;
  201.   }
  202.  }
  203. }
  204. //////////////////////////////////////////////////////////////////////////////
  205. // Public Interface
  206. //////////////////////////////////////////////////////////////////////////////
  207. /* Open SA usb core on behalf of a client, but don't start running */
  208. int
  209. sa1100_usb_open( const char * client )
  210. {
  211.  if ( usbd_info.client_name != NULL )
  212.   return -EBUSY;
  213.  usbd_info.client_name = (char*) client;
  214.  memset(&usbd_info.stats, 0, sizeof(struct usb_stats_t));
  215.  memset(string_desc_array, 0, sizeof(string_desc_array));
  216.  /* hack to start in zombie suspended state */
  217.  sm_state = kStateZombieSuspend;
  218.  usbd_info.state = USB_STATE_SUSPENDED;
  219.  /* create descriptors for enumeration */
  220.  initialize_descriptors();
  221.  printk( "%sOpened for %sn", pszMe, client );
  222.  return 0;
  223. }
  224. /* Start running. Must have called usb_open (above) first */
  225. int
  226. sa1100_usb_start( void )
  227. {
  228.  if ( usbd_info.client_name == NULL ) {
  229.   printk( "%s%s - no client registeredn",
  230.   pszMe, __FUNCTION__ );
  231.   return -EPERM;
  232.  }
  233.  /* start UDC internal machinery running */
  234.  udc_enable();
  235.  udelay( 100 );
  236.  /* clear stall - receiver seems to start stalled? 19Jan01ww */
  237.  /* also clear other stuff just to be thurough 22Feb01ww */
  238.  UDC_clear(Ser0UDCCS1, UDCCS1_FST | UDCCS1_RPE | UDCCS1_RPC );
  239.  UDC_clear(Ser0UDCCS2, UDCCS2_FST | UDCCS2_TPE | UDCCS2_TPC );
  240.  /* mask everything */
  241.  Ser0UDCCR = 0xFC;
  242.  /* flush DMA and fire through some -EAGAINs */
  243.  ep1_init( usbd_info.dmach_rx );
  244.  ep2_init( usbd_info.dmach_tx );
  245.  /* give endpoint notification we are starting */
  246.  ep1_state_change_notify( USB_STATE_SUSPENDED );
  247.  ep2_state_change_notify( USB_STATE_SUSPENDED );
  248.  /* enable any platform specific hardware */
  249.  soft_connect_hook( 1 );
  250. /* clear all top-level sources */
  251.  Ser0UDCSR = UDCSR_RSTIR | UDCSR_RESIR | UDCSR_EIR   |
  252.          UDCSR_RIR   | UDCSR_TIR   | UDCSR_SUSIR ;
  253.  /* EXERIMENT - a short line in the spec says toggling this
  254.   ..bit diddles the internal state machine in the udc to
  255.   ..expect a suspend */
  256.  Ser0UDCCR  |= UDCCR_RESIM;
  257.  /* END EXPERIMENT 10Feb01ww */
  258.  /* enable any platform specific hardware */
  259.  soft_connect_hook( 1 );
  260.  /* enable interrupts. If you are unplugged you will
  261.     immediately get a suspend interrupt. If you are plugged
  262.     and have a soft connect-circuit, you will get a reset
  263.         If you are plugged without a soft-connect, I think you
  264.     also get suspend. In short, start with suspend masked
  265.     and everything else enabled */
  266.  UDC_write( Ser0UDCCR, UDCCR_SUSIM );
  267.  printk( "%sStarted for %sn", pszMe, usbd_info.client_name );
  268.  return 0;
  269. }
  270. /* Stop USB core from running */
  271. int
  272. sa1100_usb_stop( void )
  273. {
  274.  if ( usbd_info.client_name == NULL ) {
  275.   printk( "%s%s - no client registeredn",
  276.   pszMe, __FUNCTION__ );
  277.   return -EPERM;
  278.  }
  279.  /* mask everything */
  280.  Ser0UDCCR = 0xFC;
  281.  ep1_reset();
  282.  ep2_reset();
  283.  udc_disable();
  284.  printk( "%sStoppedn", pszMe );
  285.  return 0;
  286. }
  287. /* Tell SA core client is through using it */
  288. int
  289. sa1100_usb_close( void )
  290. {
  291.  if ( usbd_info.client_name == NULL ) {
  292.   printk( "%s%s - no client registeredn",
  293.   pszMe, __FUNCTION__ );
  294.   return -EPERM;
  295.  }
  296.  usbd_info.client_name = NULL;
  297.  printk( "%sClosedn", pszMe );
  298.  return 0;
  299. }
  300. /* set a proc to be called when device is configured */
  301. usb_notify_t sa1100_set_configured_callback( usb_notify_t func )
  302. {
  303.  usb_notify_t retval = configured_callback;
  304.  configured_callback = func;
  305.  return retval;
  306. }
  307. /*====================================================
  308.  * Descriptor Manipulation.
  309.  * Use these between open() and start() above to setup
  310.  * the descriptors for your device.
  311.  *
  312.  */
  313. /* get pointer to static default descriptor */
  314. desc_t *
  315. sa1100_usb_get_descriptor_ptr( void ) { return &desc; }
  316. /* optional: set a string descriptor */
  317. int
  318. sa1100_usb_set_string_descriptor( int i, string_desc_t * p )
  319. {
  320.  int retval;
  321.  if ( i < MAX_STRING_DESC ) {
  322.   string_desc_array[i] = p;
  323.   retval = 0;
  324.  } else {
  325.   retval = -EINVAL;
  326.  }
  327.  return retval;
  328. }
  329. /* optional: get a previously set string descriptor */
  330. string_desc_t *
  331. sa1100_usb_get_string_descriptor( int i )
  332. {
  333.  return ( i < MAX_STRING_DESC )
  334.     ? string_desc_array[i]
  335.     : NULL;
  336. }
  337. /* optional: kmalloc and unicode up a string descriptor */
  338. string_desc_t *
  339. sa1100_usb_kmalloc_string_descriptor( const char * p )
  340. {
  341.  string_desc_t * pResult = NULL;
  342.  if ( p ) {
  343.   int len = strlen( p );
  344.   int uni_len = len * sizeof( __u16 );
  345.   pResult = (string_desc_t*) kmalloc( uni_len + 2, GFP_KERNEL ); /* ugh! */
  346.   if ( pResult != NULL ) {
  347.    int i;
  348.    pResult->bLength = uni_len + 2;
  349.    pResult->bDescriptorType = USB_DESC_STRING;
  350.    for( i = 0; i < len ; i++ ) {
  351. pResult->bString[i] = make_word( (__u16) p[i] );
  352.    }
  353.   }
  354.  }
  355.  return pResult;
  356. }
  357. //////////////////////////////////////////////////////////////////////////////
  358. // Exports to rest of driver
  359. //////////////////////////////////////////////////////////////////////////////
  360. /* called by the int handler here and the two endpoint files when interesting
  361.    .."events" happen */
  362. int
  363. usbctl_next_state_on_event( int event )
  364. {
  365. int next_state = device_state_machine[ sm_state ][ event ];
  366. if ( next_state != kError )
  367. {
  368. int next_device_state = sm_state_to_device_state[ next_state ];
  369. printk( "%s%s --> [%s] --> %s. Device in %s state.n",
  370. pszMe, state_names[ sm_state ], event_names[ event ],
  371. state_names[ next_state ], device_state_names[ next_device_state ] );
  372. sm_state = next_state;
  373. if ( usbd_info.state != next_device_state )
  374. {
  375. if ( configured_callback != NULL
  376.  &&
  377.  next_device_state == USB_STATE_CONFIGURED
  378.  &&
  379.  usbd_info.state != USB_STATE_SUSPENDED
  380.    ) {
  381.   configured_callback();
  382. }
  383. usbd_info.state = next_device_state;
  384. ep1_state_change_notify( next_device_state );
  385. ep2_state_change_notify( next_device_state );
  386. }
  387. }
  388. #if 0
  389. else
  390. printk( "%s%s --> [%s] --> ??? is an error.n",
  391. pszMe, state_names[ sm_state ], event_names[ event ] );
  392. #endif
  393. return next_state;
  394. }
  395. //////////////////////////////////////////////////////////////////////////////
  396. // Private Helpers
  397. //////////////////////////////////////////////////////////////////////////////
  398. /* setup default descriptors */
  399. static void
  400. initialize_descriptors(void)
  401. {
  402. desc.dev.bLength               = sizeof( device_desc_t );
  403. desc.dev.bDescriptorType       = USB_DESC_DEVICE;
  404. desc.dev.bcdUSB                = 0x100; /* 1.0 */
  405. desc.dev.bDeviceClass          = 0xFF; /* vendor specific */
  406. desc.dev.bDeviceSubClass       = 0;
  407. desc.dev.bDeviceProtocol       = 0;
  408. desc.dev.bMaxPacketSize0       = 8; /* ep0 max fifo size */
  409. desc.dev.idVendor              = 0; /* vendor ID undefined */
  410. desc.dev.idProduct             = 0; /* product */
  411. desc.dev.bcdDevice             = 0; /* vendor assigned device release num */
  412. desc.dev.iManufacturer         = 0; /* index of manufacturer string */
  413. desc.dev.iProduct              = 0; /* index of product description string */
  414. desc.dev.iSerialNumber         = 0; /* index of string holding product s/n */
  415. desc.dev.bNumConfigurations    = 1;
  416. desc.b.cfg.bLength             = sizeof( config_desc_t );
  417. desc.b.cfg.bDescriptorType     = USB_DESC_CONFIG;
  418. desc.b.cfg.wTotalLength        = make_word_c( sizeof(struct cdb) );
  419. desc.b.cfg.bNumInterfaces      = 1;
  420. desc.b.cfg.bConfigurationValue = 1;
  421. desc.b.cfg.iConfiguration      = 0;
  422. desc.b.cfg.bmAttributes        = USB_CONFIG_BUSPOWERED;
  423. desc.b.cfg.MaxPower            = USB_POWER( 500 );
  424. desc.b.intf.bLength            = sizeof( intf_desc_t );
  425. desc.b.intf.bDescriptorType    = USB_DESC_INTERFACE;
  426. desc.b.intf.bInterfaceNumber   = 0; /* unique intf index*/
  427. desc.b.intf.bAlternateSetting  = 0;
  428. desc.b.intf.bNumEndpoints      = 2;
  429. desc.b.intf.bInterfaceClass    = 0xFF; /* vendor specific */
  430. desc.b.intf.bInterfaceSubClass = 0;
  431. desc.b.intf.bInterfaceProtocol = 0;
  432. desc.b.intf.iInterface         = 0;
  433. desc.b.ep1.bLength             = sizeof( ep_desc_t );
  434. desc.b.ep1.bDescriptorType     = USB_DESC_ENDPOINT;
  435. desc.b.ep1.bEndpointAddress    = USB_EP_ADDRESS( 1, USB_OUT );
  436. desc.b.ep1.bmAttributes        = USB_EP_BULK;
  437. desc.b.ep1.wMaxPacketSize      = make_word_c( 64 );
  438. desc.b.ep1.bInterval           = 0;
  439. desc.b.ep2.bLength             = sizeof( ep_desc_t );
  440. desc.b.ep2.bDescriptorType     = USB_DESC_ENDPOINT;
  441. desc.b.ep2.bEndpointAddress    = USB_EP_ADDRESS( 2, USB_IN );
  442. desc.b.ep2.bmAttributes        = USB_EP_BULK;
  443. desc.b.ep2.wMaxPacketSize      = make_word_c( 64 );
  444. desc.b.ep2.bInterval           = 0;
  445. /* set language */
  446. /* See: http://www.usb.org/developers/data/USB_LANGIDs.pdf */
  447. sd_zero.bDescriptorType = USB_DESC_STRING;
  448. sd_zero.bLength         = sizeof( string_desc_t );
  449. sd_zero.bString[0]      = make_word_c( 0x409 ); /* American English */
  450. sa1100_usb_set_string_descriptor( 0, &sd_zero );
  451. }
  452. /* soft_connect_hook()
  453.  * Some devices have platform-specific circuitry to make USB
  454.  * not seem to be plugged in, even when it is. This allows
  455.  * software to control when a device 'appears' on the USB bus
  456.  * (after Linux has booted and this driver has loaded, for
  457.  * example). If you have such a circuit, control it here.
  458.  */
  459. static void
  460. soft_connect_hook( int enable )
  461. {
  462. #ifdef CONFIG_SA1100_EXTENEX1
  463.  if (machine_is_extenex1() ) {
  464.   if ( enable ) {
  465.    PPDR |= PPC_USB_SOFT_CON;
  466.    PPSR |= PPC_USB_SOFT_CON;
  467.   } else {
  468.    PPSR &= ~PPC_USB_SOFT_CON;
  469.    PPDR &= ~PPC_USB_SOFT_CON;
  470.   }
  471.  }
  472. #endif
  473. }
  474. /* disable the UDC at the source */
  475. static void
  476. udc_disable(void)
  477. {
  478. soft_connect_hook( 0 );
  479. UDC_set( Ser0UDCCR, UDCCR_UDD );
  480. }
  481. /*  enable the udc at the source */
  482. static void
  483. udc_enable(void)
  484. {
  485. UDC_clear(Ser0UDCCR, UDCCR_UDD);
  486. }
  487. // HACK DEBUG  3Mar01ww
  488. // Well, maybe not, it really seems to help!  08Mar01ww
  489. static void
  490. core_kicker( void )
  491. {
  492.  __u32 car = Ser0UDCAR;
  493.  __u32 imp = Ser0UDCIMP;
  494.  __u32 omp = Ser0UDCOMP;
  495.  UDC_set( Ser0UDCCR, UDCCR_UDD );
  496.  udelay( 300 );
  497.  UDC_clear(Ser0UDCCR, UDCCR_UDD);
  498.  Ser0UDCAR = car;
  499.  Ser0UDCIMP = imp;
  500.  Ser0UDCOMP = omp;
  501. }
  502. //////////////////////////////////////////////////////////////////////////////
  503. // Proc Filesystem Support
  504. //////////////////////////////////////////////////////////////////////////////
  505. #if CONFIG_PROC_FS
  506. #define SAY( fmt, args... )  p += sprintf(p, fmt, ## args )
  507. #define SAYV(  num )         p += sprintf(p, num_fmt, "Value", num )
  508. #define SAYC( label, yn )    p += sprintf(p, yn_fmt, label, yn )
  509. #define SAYS( label, v )     p += sprintf(p, cnt_fmt, label, v )
  510. static int usbctl_read_proc(char *page, char **start, off_t off,
  511.     int count, int *eof, void *data)
  512. {
  513.  const char * num_fmt   = "%25.25s: %8.8lXn";
  514.  const char * cnt_fmt   = "%25.25s: %lun";
  515.  const char * yn_fmt    = "%25.25s: %sn";
  516.  const char * yes       = "YES";
  517.  const char * no        = "NO";
  518.  unsigned long v;
  519.  char * p = page;
  520.  int len;
  521.    SAY( "SA1100 USB Controller Coren" );
  522.  SAY( "USB state: %s (%s) %dn",
  523.   device_state_names[ sm_state_to_device_state[ sm_state ] ],
  524.   state_names[ sm_state ],
  525.   sm_state );
  526.  SAYS( "ep0 bytes read", usbd_info.stats.ep0_bytes_read );
  527.  SAYS( "ep0 bytes written", usbd_info.stats.ep0_bytes_written );
  528.  SAYS( "ep0 FIFO read failures", usbd_info.stats.ep0_fifo_write_failures );
  529.  SAYS( "ep0 FIFO write failures", usbd_info.stats.ep0_fifo_write_failures );
  530.  SAY( "n" );
  531.  v = Ser0UDCAR;
  532.  SAY( "%25.25s: 0x%8.8lX - %ldn", "Address Register", v, v );
  533.  v = Ser0UDCIMP;
  534.  SAY( "%25.25s: %ld (%8.8lX)n", "IN  max packet size", v+1, v );
  535.  v = Ser0UDCOMP;
  536.  SAY( "%25.25s: %ld (%8.8lX)n", "OUT max packet size", v+1, v );
  537.  v = Ser0UDCCR;
  538.  SAY( "nUDC Mask Registern" );
  539.  SAYV( v );
  540.  SAYC( "UDC Active",                ( v & UDCCR_UDA ) ? yes : no );
  541.  SAYC( "Suspend interrupts masked", ( v & UDCCR_SUSIM ) ? yes : no );
  542.  SAYC( "Resume interrupts masked",  ( v & UDCCR_RESIM ) ? yes : no );
  543.  SAYC( "Reset interrupts masked",   ( v & UDCCR_REM ) ? yes : no );
  544.  v = Ser0UDCSR;
  545.  SAY( "nUDC Interrupt Request Registern" );
  546.  SAYV( v );
  547.  SAYC( "Reset pending",      ( v & UDCSR_RSTIR ) ? yes : no );
  548.  SAYC( "Suspend pending",    ( v & UDCSR_SUSIR ) ? yes : no );
  549.  SAYC( "Resume pending",     ( v & UDCSR_RESIR ) ? yes : no );
  550.  SAYC( "ep0 pending",        ( v & UDCSR_EIR )   ? yes : no );
  551.  SAYC( "receiver pending",   ( v & UDCSR_RIR )   ? yes : no );
  552.  SAYC( "tramsitter pending", ( v & UDCSR_TIR )   ? yes : no );
  553. #ifdef CONFIG_SA1100_EXTENEX1
  554.  SAYC( "nSoft connect", (PPSR & PPC_USB_SOFT_CON) ? "Visible" : "Hidden" );
  555. #endif
  556. #if 0
  557.  v = Ser0UDCCS0;
  558.  SAY( "nUDC Endpoint Zero Status Registern" );
  559.  SAYV( v );
  560.  SAYC( "Out Packet Ready", ( v & UDCCS0_OPR ) ? yes : no );
  561.  SAYC( "In Packet Ready",  ( v & UDCCS0_IPR ) ? yes : no );
  562.  SAYC( "Sent Stall",       ( v & UDCCS0_SST ) ? yes : no );
  563.  SAYC( "Force Stall",      ( v & UDCCS0_FST ) ? yes : no );
  564.  SAYC( "Data End",         ( v & UDCCS0_DE )  ? yes : no );
  565.  SAYC( "Data Setup End",   ( v & UDCCS0_SE )  ? yes : no );
  566.  SAYC( "Serviced (SO)",    ( v & UDCCS0_SO )  ? yes : no );
  567.  v = Ser0UDCCS1;
  568.  SAY( "nUDC Receiver Status Registern" );
  569.  SAYV( v );
  570.  SAYC( "Receive Packet Complete", ( v & UDCCS1_RPC ) ? yes : no );
  571.  SAYC( "Sent Stall",              ( v & UDCCS1_SST ) ? yes : no );
  572.  SAYC( "Force Stall",             ( v & UDCCS1_FST ) ? yes : no );
  573.  SAYC( "Receive Packet Error",    ( v & UDCCS1_RPE ) ? yes : no );
  574.  SAYC( "Receive FIFO not empty",  ( v & UDCCS1_RNE ) ? yes : no );
  575.  v = Ser0UDCCS2;
  576.  SAY( "nUDC Transmitter Status Registern" );
  577.  SAYV( v );
  578.  SAYC( "FIFO has < 8 of 16 chars", ( v & UDCCS2_TFS ) ? yes : no );
  579.  SAYC( "Transmit Packet Complete", ( v & UDCCS2_TPC ) ? yes : no );
  580.  SAYC( "Transmit FIFO underrun",   ( v & UDCCS2_TUR ) ? yes : no );
  581.  SAYC( "Transmit Packet Error",    ( v & UDCCS2_TPE ) ? yes : no );
  582.  SAYC( "Sent Stall",               ( v & UDCCS2_SST ) ? yes : no );
  583.  SAYC( "Force Stall",              ( v & UDCCS2_FST ) ? yes : no );
  584. #endif
  585.  len = ( p - page ) - off;
  586.  if ( len < 0 )
  587.   len = 0;
  588.  *eof = ( len <=count ) ? 1 : 0;
  589.  *start = page + off;
  590.  return len;
  591. }
  592. #endif  /* CONFIG_PROC_FS */
  593. //////////////////////////////////////////////////////////////////////////////
  594. // Module Initialization and Shutdown
  595. //////////////////////////////////////////////////////////////////////////////
  596. /*
  597.  * usbctl_init()
  598.  * Module load time. Allocate dma and interrupt resources. Setup /proc fs
  599.  * entry. Leave UDC disabled.
  600.  */
  601. int __init usbctl_init( void )
  602. {
  603. int retval = 0;
  604. udc_disable();
  605. memset( &usbd_info, 0, sizeof( usbd_info ) );
  606. #if CONFIG_PROC_FS
  607. create_proc_read_entry ( PROC_NODE_NAME, 0, NULL, usbctl_read_proc, NULL);
  608. #endif
  609. /* setup rx dma */
  610. retval = sa1100_request_dma(&usbd_info.dmach_rx, "USB receive", DMA_Ser0UDCRd);
  611. if (retval) {
  612. printk("%sunable to register for rx dma rc=%dn", pszMe, retval );
  613. goto err_rx_dma;
  614. }
  615. /* setup tx dma */
  616. retval = sa1100_request_dma(&usbd_info.dmach_tx, "USB transmit", DMA_Ser0UDCWr);
  617. if (retval) {
  618. printk("%sunable to register for tx dma rc=%dn",pszMe,retval);
  619. goto err_tx_dma;
  620. }
  621. /* now allocate the IRQ. */
  622. retval = request_irq(IRQ_Ser0UDC, udc_int_hndlr, SA_INTERRUPT,
  623.   "SA USB core", NULL);
  624. if (retval) {
  625. printk("%sCouldn't request USB irq rc=%dn",pszMe, retval);
  626. goto err_irq;
  627. }
  628. printk( "SA1100 USB Controller Core Initializedn");
  629. return 0;
  630. err_irq:
  631. sa1100_free_dma(usbd_info.dmach_tx);
  632. usbd_info.dmach_tx = 0;
  633. err_tx_dma:
  634. sa1100_free_dma(usbd_info.dmach_rx);
  635. usbd_info.dmach_rx = 0;
  636. err_rx_dma:
  637. return retval;
  638. }
  639. /*
  640.  * usbctl_exit()
  641.  * Release DMA and interrupt resources
  642.  */
  643. void __exit usbctl_exit( void )
  644. {
  645.     printk("Unloading SA1100 USB Controllern");
  646. udc_disable();
  647. #if CONFIG_PROC_FS
  648.     remove_proc_entry ( PROC_NODE_NAME, NULL);
  649. #endif
  650.     sa1100_free_dma(usbd_info.dmach_rx);
  651.     sa1100_free_dma(usbd_info.dmach_tx);
  652.     free_irq(IRQ_Ser0UDC, NULL);
  653. }
  654. EXPORT_SYMBOL( sa1100_usb_open );
  655. EXPORT_SYMBOL( sa1100_usb_start );
  656. EXPORT_SYMBOL( sa1100_usb_stop );
  657. EXPORT_SYMBOL( sa1100_usb_close );
  658. EXPORT_SYMBOL( sa1100_usb_get_descriptor_ptr );
  659. EXPORT_SYMBOL( sa1100_usb_set_string_descriptor );
  660. EXPORT_SYMBOL( sa1100_usb_get_string_descriptor );
  661. EXPORT_SYMBOL( sa1100_usb_kmalloc_string_descriptor );
  662. module_init( usbctl_init );
  663. module_exit( usbctl_exit );