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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*********************************************************************
  2.  *                
  3.  * Filename:      litelink.c
  4.  * Version:       1.1
  5.  * Description:   Driver for the Parallax LiteLink dongle
  6.  * Status:        Stable
  7.  * Author:        Dag Brattli <dagb@cs.uit.no>
  8.  * Created at:    Fri May  7 12:50:33 1999
  9.  * Modified at:   Fri Dec 17 09:14:23 1999
  10.  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  11.  * 
  12.  *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
  13.  *     
  14.  *     This program is free software; you can redistribute it and/or 
  15.  *     modify it under the terms of the GNU General Public License as 
  16.  *     published by the Free Software Foundation; either version 2 of 
  17.  *     the License, or (at your option) any later version.
  18.  * 
  19.  *     This program is distributed in the hope that it will be useful,
  20.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  22.  *     GNU General Public License for more details.
  23.  * 
  24.  *     You should have received a copy of the GNU General Public License 
  25.  *     along with this program; if not, write to the Free Software 
  26.  *     Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
  27.  *     MA 02111-1307 USA
  28.  *     
  29.  ********************************************************************/
  30. #include <linux/module.h>
  31. #include <linux/delay.h>
  32. #include <linux/tty.h>
  33. #include <linux/sched.h>
  34. #include <linux/init.h>
  35. #include <net/irda/irda.h>
  36. #include <net/irda/irmod.h>
  37. #include <net/irda/irda_device.h>
  38. #define MIN_DELAY 25      /* 15 us, but wait a little more to be sure */
  39. #define MAX_DELAY 10000   /* 1 ms */
  40. static void litelink_open(dongle_t *self, struct qos_info *qos);
  41. static void litelink_close(dongle_t *self);
  42. static int  litelink_change_speed(struct irda_task *task);
  43. static int  litelink_reset(struct irda_task *task);
  44. /* These are the baudrates supported */
  45. static __u32 baud_rates[] = { 115200, 57600, 38400, 19200, 9600 };
  46. static struct dongle_reg dongle = {
  47. Q_NULL,
  48. IRDA_LITELINK_DONGLE,
  49. litelink_open,
  50. litelink_close,
  51. litelink_reset,
  52. litelink_change_speed,
  53. };
  54. int __init litelink_init(void)
  55. {
  56. return irda_device_register_dongle(&dongle);
  57. }
  58. void litelink_cleanup(void)
  59. {
  60. irda_device_unregister_dongle(&dongle);
  61. }
  62. static void litelink_open(dongle_t *self, struct qos_info *qos)
  63. {
  64. qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200;
  65. qos->min_turn_time.bits = 0x7f; /* Needs 0.01 ms */
  66. MOD_INC_USE_COUNT;
  67. }
  68. static void litelink_close(dongle_t *self)
  69. {
  70. /* Power off dongle */
  71. self->set_dtr_rts(self->dev, FALSE, FALSE);
  72. MOD_DEC_USE_COUNT;
  73. }
  74. /*
  75.  * Function litelink_change_speed (task)
  76.  *
  77.  *    Change speed of the Litelink dongle. To cycle through the available 
  78.  *    baud rates, pulse RTS low for a few ms.  
  79.  */
  80. static int litelink_change_speed(struct irda_task *task)
  81. {
  82. dongle_t *self = (dongle_t *) task->instance;
  83. __u32 speed = (__u32) task->param;
  84.         int i;
  85. /* Clear RTS to reset dongle */
  86. self->set_dtr_rts(self->dev, TRUE, FALSE);
  87. /* Sleep a minimum of 15 us */
  88. udelay(MIN_DELAY);
  89. /* Go back to normal mode */
  90. self->set_dtr_rts(self->dev, TRUE, TRUE);
  91. /* Sleep a minimum of 15 us */
  92. udelay(MIN_DELAY);
  93. /* Cycle through avaiable baudrates until we reach the correct one */
  94. for (i=0; i<5 && baud_rates[i] != speed; i++) {
  95. /* Set DTR, clear RTS */
  96. self->set_dtr_rts(self->dev, FALSE, TRUE);
  97. /* Sleep a minimum of 15 us */
  98. udelay(MIN_DELAY);
  99. /* Set DTR, Set RTS */
  100. self->set_dtr_rts(self->dev, TRUE, TRUE);
  101. /* Sleep a minimum of 15 us */
  102. udelay(MIN_DELAY);
  103.         }
  104. irda_task_next_state(task, IRDA_TASK_DONE);
  105. return 0;
  106. }
  107. /*
  108.  * Function litelink_reset (task)
  109.  *
  110.  *      Reset the Litelink type dongle.
  111.  *
  112.  */
  113. static int litelink_reset(struct irda_task *task)
  114. {
  115. dongle_t *self = (dongle_t *) task->instance;
  116. /* Power on dongle */
  117. self->set_dtr_rts(self->dev, TRUE, TRUE);
  118. /* Sleep a minimum of 15 us */
  119. udelay(MIN_DELAY);
  120. /* Clear RTS to reset dongle */
  121. self->set_dtr_rts(self->dev, TRUE, FALSE);
  122. /* Sleep a minimum of 15 us */
  123. udelay(MIN_DELAY);
  124. /* Go back to normal mode */
  125. self->set_dtr_rts(self->dev, TRUE, TRUE);
  126. /* Sleep a minimum of 15 us */
  127. udelay(MIN_DELAY);
  128. /* This dongles speed defaults to 115200 bps */
  129. self->speed = 115200;
  130. irda_task_next_state(task, IRDA_TASK_DONE);
  131. return 0;
  132. }
  133. #ifdef MODULE
  134. MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");
  135. MODULE_DESCRIPTION("Parallax Litelink dongle driver");
  136. MODULE_LICENSE("GPL");
  137. /*
  138.  * Function init_module (void)
  139.  *
  140.  *    Initialize Litelink module
  141.  *
  142.  */
  143. int init_module(void)
  144. {
  145. return litelink_init();
  146. }
  147. /*
  148.  * Function cleanup_module (void)
  149.  *
  150.  *    Cleanup Litelink module
  151.  *
  152.  */
  153. void cleanup_module(void)
  154. {
  155. litelink_cleanup();
  156. }
  157. #endif /* MODULE */