1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include <linux/module.h>
35#include <linux/delay.h>
36#include <linux/init.h>
37
38#include <net/irda/irda.h>
39
40#include "sir-dev.h"
41
42static int ma600_open(struct sir_dev *);
43static int ma600_close(struct sir_dev *);
44static int ma600_change_speed(struct sir_dev *, unsigned);
45static int ma600_reset(struct sir_dev *);
46
47
48#define MA600_9600 0x00
49#define MA600_19200 0x01
50#define MA600_38400 0x02
51#define MA600_57600 0x03
52#define MA600_115200 0x04
53#define MA600_DEV_ID1 0x05
54#define MA600_DEV_ID2 0x06
55#define MA600_2400 0x08
56
57static struct dongle_driver ma600 = {
58 .owner = THIS_MODULE,
59 .driver_name = "MA600",
60 .type = IRDA_MA600_DONGLE,
61 .open = ma600_open,
62 .close = ma600_close,
63 .reset = ma600_reset,
64 .set_speed = ma600_change_speed,
65};
66
67
68static int __init ma600_sir_init(void)
69{
70 IRDA_DEBUG(2, "%s()\n", __func__);
71 return irda_register_dongle(&ma600);
72}
73
74static void __exit ma600_sir_cleanup(void)
75{
76 IRDA_DEBUG(2, "%s()\n", __func__);
77 irda_unregister_dongle(&ma600);
78}
79
80
81
82
83
84
85
86
87static int ma600_open(struct sir_dev *dev)
88{
89 struct qos_info *qos = &dev->qos;
90
91 IRDA_DEBUG(2, "%s()\n", __func__);
92
93 sirdev_set_dtr_rts(dev, TRUE, TRUE);
94
95
96 qos->baud_rate.bits &= IR_2400|IR_9600|IR_19200|IR_38400
97 |IR_57600|IR_115200;
98
99 qos->min_turn_time.bits = 0x01;
100 irda_qos_bits_to_value(qos);
101
102
103
104 return 0;
105}
106
107static int ma600_close(struct sir_dev *dev)
108{
109 IRDA_DEBUG(2, "%s()\n", __func__);
110
111
112 sirdev_set_dtr_rts(dev, FALSE, FALSE);
113
114 return 0;
115}
116
117static __u8 get_control_byte(__u32 speed)
118{
119 __u8 byte;
120
121 switch (speed) {
122 default:
123 case 115200:
124 byte = MA600_115200;
125 break;
126 case 57600:
127 byte = MA600_57600;
128 break;
129 case 38400:
130 byte = MA600_38400;
131 break;
132 case 19200:
133 byte = MA600_19200;
134 break;
135 case 9600:
136 byte = MA600_9600;
137 break;
138 case 2400:
139 byte = MA600_2400;
140 break;
141 }
142
143 return byte;
144}
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175static int ma600_change_speed(struct sir_dev *dev, unsigned speed)
176{
177 u8 byte;
178
179 IRDA_DEBUG(2, "%s(), speed=%d (was %d)\n", __func__,
180 speed, dev->speed);
181
182
183
184
185 sirdev_set_dtr_rts(dev, TRUE, FALSE);
186 mdelay(1);
187
188
189 byte = get_control_byte(speed);
190 sirdev_raw_write(dev, &byte, sizeof(byte));
191
192
193 msleep(15);
194
195#if 1
196
197
198
199
200
201 sirdev_raw_read(dev, &byte, sizeof(byte));
202 if (byte != get_control_byte(speed)) {
203 IRDA_WARNING("%s(): bad control byte read-back %02x != %02x\n",
204 __func__, (unsigned) byte,
205 (unsigned) get_control_byte(speed));
206 return -1;
207 }
208 else
209 IRDA_DEBUG(2, "%s() control byte write read OK\n", __func__);
210#endif
211
212
213 sirdev_set_dtr_rts(dev, TRUE, TRUE);
214
215
216 msleep(10);
217
218
219 dev->speed = speed;
220
221 return 0;
222}
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239static int ma600_reset(struct sir_dev *dev)
240{
241 IRDA_DEBUG(2, "%s()\n", __func__);
242
243
244 sirdev_set_dtr_rts(dev, FALSE, TRUE);
245 msleep(10);
246
247
248 sirdev_set_dtr_rts(dev, TRUE, TRUE);
249 msleep(10);
250
251 dev->speed = 9600;
252
253 return 0;
254}
255
256MODULE_AUTHOR("Leung <95Etwl@alumni.ee.ust.hk> http://www.engsvr.ust/~eetwl95");
257MODULE_DESCRIPTION("MA600 dongle driver version 0.1");
258MODULE_LICENSE("GPL");
259MODULE_ALIAS("irda-dongle-11");
260
261module_init(ma600_sir_init);
262module_exit(ma600_sir_cleanup);
263
264