pull master
[hh.org.git] / drivers / input / mouse / mep.c
blob5c1de8bc1ec49e4b300e43e32ffec746f9c65686
1 /*
2 * Synaptics Modular Embedded Protocol (MEP) implementation
4 * Copyright (c) 2005 SDG Systems, LLC
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by
8 * the Free Software Foundation.
9 */
11 #include <linux/module.h>
12 #include "mep.h"
14 int
15 mep_host_format_cmd( u_int8_t *pkt, int addr, int command,
16 int num_data, unsigned char *data )
18 int size=1;
20 if (command < MEP_HOST_CMD_SET_DEFAULT) {
21 pkt[MEP_HOST_HEADER] = (u_int8_t)command | MEP_HOST_PKT_FORMAT_SHORT;
23 else {
24 int i;
26 size += num_data+1; /* long command counts */
27 for (i=0; i<num_data; i++)
28 pkt[MEP_HOST_DATA_START+i] = data[i];
29 pkt[MEP_HOST_HEADER] = num_data+1;
30 pkt[MEP_HOST_LONG_CMD] = (u_int8_t)command;
33 /* addr of -1 is global */
34 if (addr==-1)
35 pkt[MEP_HOST_HEADER] |= MEP_HOST_PKT_GLOBAL;
36 else
37 pkt[MEP_HOST_HEADER] |= MEP_HOST_PKT_ADDR(addr);
38 return size;
40 EXPORT_SYMBOL( mep_host_format_cmd );
42 #define MEP_IDLE 0
43 #define MEP_PROCESSING 1
45 enum mep_rx_result
46 mep_rx( struct mep_pkt_stream_desc *ps, u_int8_t octet )
48 if (ps->state == MEP_IDLE) {
49 if (octet != 0) {
50 ps->pkt.header = octet;
51 ps->addr = MEP_MODULE_PKT_ADDR(octet);
52 ps->ctrl = MEP_MODULE_PKT_CTRL(octet);
53 ps->len = MEP_MODULE_PKT_LEN(octet);
54 ps->remain_len = ps->len;
55 ps->datap = ps->pkt.data;
57 if (ps->len == 0) // This is ACK, most likely
58 return MEP_RX_PKT_DONE;
59 else
60 ps->state = MEP_PROCESSING;
63 else {
64 /* processing state */
65 *ps->datap++ = octet;
66 if (--ps->remain_len == 0) {
67 ps->state = MEP_IDLE;
68 return MEP_RX_PKT_DONE;
71 return MEP_RX_PKT_MORE;
73 EXPORT_SYMBOL( mep_rx );
75 void
76 mep_report_base_info( void *notused, u_int8_t *data )
78 printk( "MEP Base: Manufacturer ID: %d\n", (int)data[1] );
79 printk( "MEP Base: Major version: %d\n", (int)data[2]>>4 );
80 printk( "MEP Base: Minor version: %d\n", (int)data[2] & 0xf );
81 printk( "MEP Base: Class major version: %d\n", (int)data[3]>>4 );
82 printk( "MEP Base: Class minor version: %d\n", (int)data[3] & 0xf );
83 printk( "MEP Base: Module class ID: %d\n", (int)data[4] );
84 printk( "MEP Base: Sub-class major version: %d\n", (int)data[5]>>4 );
85 printk( "MEP Base: Sub-class minor version: %d\n", (int)data[5] & 0xf );
86 printk( "MEP Base: Module sub-class ID: %d\n", (int)data[6] );
88 EXPORT_SYMBOL( mep_report_base_info );
90 void
91 mep_report_prod_info( void *notused, u_int8_t *data )
93 printk( "MEP Product: Module major version: %d\n", (int)data[1] );
94 printk( "MEP Product: Module minor version: %d\n", (int)data[2] );
95 printk( "MEP Product: Module product ID: %d\n", (int)(data[3]<<8) | data[4] );
96 printk( "MEP Product: Features: %s %s\n", (data[6]&2)?"CanDoze":"",
97 (data[6]&1)?"GuestPort":"" );
99 EXPORT_SYMBOL(mep_report_prod_info);
101 MODULE_LICENSE("GPL");