Subversion Repositories Kolibri OS

Rev

Rev 1613 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1613 Rev 1875
Line 13... Line 13...
13
	struct hid_class_descriptor desc[1];
13
	struct hid_class_descriptor desc[1];
14
} __attribute__ ((packed));
14
} __attribute__ ((packed));
Line 15... Line 15...
15
 
15
 
-
 
16
void create_hid_mouse(udev_t *dev, endpoint_descr_t *en_d);
Line 16... Line 17...
16
void create_hid_mouse(udev_t *dev, endpoint_descr_t *en_d);
17
void create_hid_keyboard(udev_t *dev, endpoint_descr_t *en_d);
17
 
18
 
18
bool init_hid(udev_t *dev)
19
bool init_hid(udev_t *dev)
19
{
20
{
Line 91... Line 92...
91
                  ep->bEndpointAddress, ep->bmAttributes,
92
                  ep->bEndpointAddress, ep->bmAttributes,
92
                  ep->wMaxPacketSize, ep->bInterval);
93
                  ep->wMaxPacketSize, ep->bInterval);
93
        dptr+= ep->bLength;
94
        dptr+= ep->bLength;
94
 
95
 
Line 95... Line 96...
95
        if( interface->bInterfaceProtocol == 2)
96
        switch(interface->bInterfaceProtocol)
-
 
97
        {
-
 
98
            case 1:
-
 
99
                create_hid_keyboard(dev, ep);
-
 
100
                break;
-
 
101
 
-
 
102
            case 2:
96
            create_hid_mouse(dev, ep);
103
                create_hid_mouse(dev, ep);
-
 
104
                break;
-
 
105
        }
97
  //  }
106
  //  }
98
    return true;
107
    return true;
99
};
108
};
Line 116... Line 125...
116
    td->token ^= DATA1;
125
    td->token ^= DATA1;
117
 
126
 
Line 118... Line 127...
118
    u32_t efl = safe_cli();
127
    u32_t efl = safe_cli();
119
      list_add_tail(&rq->list, &dev->host->rq_list);
128
      list_add_tail(&rq->list, &dev->host->rq_list);
-
 
129
      qh = dev->host->qh[rq->qnum];
-
 
130
      qh->qelem = rq->td_head->dma;
-
 
131
      mb();
-
 
132
    safe_sti(efl);
-
 
133
 
-
 
134
    return true;
-
 
135
};
-
 
136
 
-
 
137
typedef union
-
 
138
{
-
 
139
    uint16_t value;
-
 
140
    struct
-
 
141
    {
-
 
142
        uint8_t code;
-
 
143
        uint8_t ecode;
-
 
144
    };
-
 
145
}scancode_t;
-
 
146
 
-
 
147
static const uint16_t usb_keycode[256] =
-
 
148
{
-
 
149
  /*   0       1       2       3       4       5       6       7    */
-
 
150
  /*   8       9       A       B       C       D       E       F    */
-
 
151
 
-
 
152
    0x0000, 0x0000, 0x0000, 0x0000, 0x001E, 0x0030, 0x002E, 0x0020,   /*  0x00  */
-
 
153
    0x0012, 0x0021, 0x0022, 0x0023, 0x0017, 0x0024, 0x0025, 0x0026,
-
 
154
 
-
 
155
    0x0032, 0x0031, 0x0018, 0x0019, 0x0010, 0x0013, 0x001F, 0x0014,   /*  0x10  */
-
 
156
    0x0016, 0x002F, 0x0011, 0x002D, 0x0015, 0x002C, 0x0002, 0x0003,
-
 
157
 
-
 
158
    0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B,   /*  0x20  */
-
 
159
    0x001C, 0x0001, 0x000E, 0x000F, 0x0039, 0x000C, 0x000D, 0x001A,
-
 
160
 
-
 
161
    0x001B, 0x002B, 0x002B, 0x0027, 0x0028, 0x0029, 0x0033, 0x0034,   /*  0x30  */
-
 
162
    0x0035, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
-
 
163
 
-
 
164
    0x0041, 0x0042, 0x0043, 0x0044, 0x0057, 0x0058, 0xE037, 0x0046,   /*  0x40  */
-
 
165
    0x0000, 0xE052, 0xE047, 0xE049, 0xE053, 0xE04F, 0xE051, 0xE04D,
-
 
166
 
-
 
167
    0xE04B, 0xE050, 0xE048, 0x0045, 0xE035, 0x0037, 0x004A, 0x004E,   /*  0x50  */
-
 
168
    0xE01C, 0x004F, 0x0050, 0x0051, 0x004B, 0x004C, 0x004D, 0x0047,
-
 
169
 
-
 
170
    0x0048, 0x0049, 0x0052, 0x0053, 0x0056, 0xE05D, 0xE05E, 0x0059,   /*  0x60  */
-
 
171
    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,
-
 
172
 
-
 
173
    0x006C, 0x006D, 0x006E, 0x0076, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0x70  */
-
 
174
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-
 
175
 
-
 
176
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x0000, 0x0073,   /*  0x80  */
-
 
177
    0x0070, 0x007D, 0x0079, 0x007B, 0x005C, 0x0000, 0x0000, 0x0000,
-
 
178
 
-
 
179
    0x00F2, 0x00F1, 0x0078, 0x0077, 0x0076, 0x0000, 0x0000, 0x0000,   /*  0x90  */
-
 
180
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-
 
181
 
-
 
182
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xA0  */
-
 
183
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-
 
184
 
-
 
185
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xB0  */
-
 
186
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-
 
187
 
-
 
188
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xC0  */
-
 
189
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-
 
190
 
-
 
191
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xD0  */
-
 
192
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-
 
193
 
-
 
194
    0x001D, 0x002A, 0x0038, 0xE05B, 0xE01D, 0x0036, 0xE038, 0xE05C,   /*  0xE0  */
-
 
195
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-
 
196
 
-
 
197
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xFE0  */
-
 
198
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-
 
199
 
-
 
200
};
-
 
201
 
-
 
202
static uint8_t  kbd_old[8];
-
 
203
 
-
 
204
bool keyboard_handler(udev_t *dev, struct tag_request *rq)
-
 
205
{
-
 
206
    td_t   *td;
-
 
207
    qh_t   *qh;
-
 
208
 
-
 
209
    uint8_t *data;
-
 
210
    int    i;
-
 
211
 
-
 
212
    td = rq->td_head;
-
 
213
 
-
 
214
    if( (td->status &0x7FF)==rq->size-1)
-
 
215
    {
-
 
216
        uint8_t action;
-
 
217
        scancode_t scan;
-
 
218
 
-
 
219
        data = (uint8_t*)rq->data;
-
 
220
 
-
 
221
        action = data[0] ^ kbd_old[0];
-
 
222
 
-
 
223
        for (i = 0; i < 8; i++)
-
 
224
        {
-
 
225
            if(action & 1)
-
 
226
            {
-
 
227
                scan.value = usb_keycode[i+224];
-
 
228
 
-
 
229
                if(data[0]>>i & 1)
-
 
230
                {
-
 
231
                    if(scan.ecode)
-
 
232
                        SetKeyboardData(scan.ecode);
-
 
233
                    SetKeyboardData(scan.code);
-
 
234
                }
-
 
235
                else
-
 
236
                {
-
 
237
                    if(scan.ecode)
-
 
238
                        SetKeyboardData(scan.ecode);
-
 
239
                    SetKeyboardData(scan.code|0x80);
-
 
240
                };
-
 
241
            }
-
 
242
            action >>= 1;
-
 
243
        }
-
 
244
 
-
 
245
 
-
 
246
        for (i = 2; i < 8; i++)
-
 
247
        {
-
 
248
            if ((kbd_old[i] > 3) && (memscan(data+2, kbd_old[i], 6) == data+8))
-
 
249
            {
-
 
250
                scan.value = usb_keycode[kbd_old[i]];
-
 
251
 
-
 
252
                if (scan.value)
-
 
253
                {
-
 
254
                    if(scan.ecode)
-
 
255
                        SetKeyboardData(scan.ecode);
-
 
256
                    SetKeyboardData(scan.code|0x80);
-
 
257
                  //  input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);
-
 
258
                }
-
 
259
                else
-
 
260
                    dbgprintf("Unknown key (scancode %#x) released.\n", kbd_old[i]);
-
 
261
            }
-
 
262
 
-
 
263
            if ((data[i] > 3) && (memscan(kbd_old+2, data[i], 6) == kbd_old+8))
-
 
264
            {
-
 
265
                scan.value = usb_keycode[data[i]];
-
 
266
 
-
 
267
                if (scan.value)
-
 
268
                {
-
 
269
                    if(scan.ecode)
-
 
270
                        SetKeyboardData(scan.ecode);
-
 
271
                    SetKeyboardData(scan.code);
-
 
272
                   //input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);
-
 
273
                }
-
 
274
                else
-
 
275
                    dbgprintf("Unknown key (scancode %#x) released.\n", data[i]);
-
 
276
            }
-
 
277
        }
-
 
278
        memcpy(kbd_old, data, 8);
-
 
279
    };
-
 
280
 
-
 
281
    td->status = TD_CTRL_ACTIVE | TD_CTRL_IOC | dev->speed;
-
 
282
    td->token ^= DATA1;
-
 
283
 
-
 
284
    u32_t efl = safe_cli();
-
 
285
      list_add_tail(&rq->list, &dev->host->rq_list);
120
      qh = dev->host->qh[6];
286
      qh = dev->host->qh[rq->qnum];
121
      qh->qelem = rq->td_head->dma;
287
      qh->qelem = rq->td_head->dma;
122
      mb();
288
      mb();
123
    safe_sti(efl);
289
    safe_sti(efl);
Line 124... Line 290...
124
 
290
 
Line 133... Line 299...
133
    addr_t  address;
299
    addr_t  address;
134
    addr_t  size;
300
    addr_t  size;
135
    u32_t   toggle;
301
    u32_t   toggle;
Line 136... Line -...
136
 
-
 
137
    void *packet;
-
 
138
 
-
 
139
    td_t   *td;
302
 
Line 140... Line 303...
140
    qh_t   *qh;
303
    qh_t   *qh;
141
 
304
 
Line 148... Line 311...
148
    enp.address = en_d->bEndpointAddress;
311
    enp.address = en_d->bEndpointAddress;
149
    enp.size    = en_d->wMaxPacketSize;
312
    enp.size    = en_d->wMaxPacketSize;
150
    enp.toggle  = DATA0;
313
    enp.toggle  = DATA0;
Line 151... Line 314...
151
 
314
 
Line 152... Line -...
152
    packet = kzalloc(enp.size, 0);
-
 
153
 
315
    rq = alloc_rq_buffer(dev, &enp, DIN, enp.size);
154
    rq = create_request(dev, &enp, DIN, packet, enp.size);
316
 
Line 155... Line 317...
155
    rq->qnum = 6;
317
    rq->qnum = 6;
156
    rq->handler = &mouse_handler;
318
    rq->handler = &mouse_handler;
157
 
319
 
158
    u32_t efl = safe_cli();
320
    u32_t efl = safe_cli();
159
      list_add_tail(&rq->list, &dev->host->rq_list);
321
      list_add_tail(&rq->list, &dev->host->rq_list);
160
      qh = dev->host->qh[6];
322
      qh = dev->host->qh[rq->qnum];
Line 161... Line 323...
161
      qh->qelem = rq->td_head->dma;
323
      qh->qelem = rq->td_head->dma;
162
      mb();
324
      mb();
-
 
325
    safe_sti(efl);
-
 
326
 
-
 
327
    dbgprintf("%s\n",__FUNCTION__);
-
 
328
}
-
 
329
 
-
 
330
void create_hid_keyboard(udev_t *dev, endpoint_descr_t *en_d)
-
 
331
{
-
 
332
    request_t *rq;
-
 
333
    endp_t    enp;
-
 
334
 
-
 
335
    addr_t  address;
-
 
336
    addr_t  size;
-
 
337
    u32_t   toggle;
-
 
338
 
-
 
339
    qh_t   *qh;
-
 
340
 
-
 
341
    static  u16_t __attribute__((aligned(16)))
-
 
342
            req_set_conf[4]  = {0x0900,0x0001,0x0000,0x0000};
-
 
343
 
-
 
344
    if( !ctrl_request(dev, req_set_conf, DOUT, 0, 0))
-
 
345
        return;
-
 
346
 
-
 
347
    enp.address = en_d->bEndpointAddress;
-
 
348
    enp.size    = en_d->wMaxPacketSize;
-
 
349
    enp.toggle  = DATA0;
-
 
350
 
-
 
351
    rq = alloc_rq_buffer(dev, &enp, DIN, enp.size);
-
 
352
 
-
 
353
    rq->qnum = 4;
-
 
354
    rq->handler = &keyboard_handler;
-
 
355
 
-
 
356
    u32_t efl = safe_cli();
-
 
357
      list_add_tail(&rq->list, &dev->host->rq_list);
-
 
358
      qh = dev->host->qh[rq->qnum];
-
 
359
      qh->qelem = rq->td_head->dma;
-
 
360
      mb();
-
 
361
    safe_sti(efl);
-
 
362
 
-
 
363
    dbgprintf("%s\n",__FUNCTION__);
-
 
364
}
-
 
365
 
-
 
366
void *memscan(void *addr, int c, size_t size)
-
 
367
{
-
 
368
    if (!size)
-
 
369
        return addr;
-
 
370
    __asm__ __volatile__(
-
 
371
        "repnz; scasb       \n\t"
-
 
372
        "jnz 1f             \n\t"
-
 
373
        "dec %%edi          \n\t"
-
 
374
    "1:"
-
 
375
        : "=D" (addr), "=c" (size)
-
 
376
        : "D" (addr), "1" (size), "a" (c)