/*
 *  User Mode Init manager - For shared transport
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program;if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef UIM_H
#define UIM_H

/* Paramaters to set the baud rate*/
#define  FLOW_CTL       0x0001
#define  BOTHER         0x00001000
#define  ARM_NCCS       19

#define TCGETS2      _IOR('T',0x2A, struct termios2)
#define TCSETS2      _IOW('T',0x2B, struct termios2)

/*HCI Command and Event information*/
#define HCI_HDR_OPCODE          0xff36
#define WRITE_BD_ADDR_OPCODE	0xFC06
#define RESP_PREFIX             0x04
#define MAX_TRY                 10

/* HCI Packet types */
#define HCI_COMMAND_PKT         0x01
#define HCI_EVENT_PKT           0x04

/* HCI command macros*/
#define HCI_EVENT_HDR_SIZE              2
#define HCI_COMMAND_HDR_SIZE            3
#define UIM_WRITE_BD_ADDR_CP_SIZE       6


/* HCI event macros*/
#define EVT_CMD_COMPLETE_SIZE   3
#define EVT_CMD_STATUS_SIZE     4
#define EVT_CMD_COMPLETE        0x0E
#define EVT_CMD_STATUS          0x0F


#define VERBOSE
#ifdef ANDROID
#define LOG_TAG "uim-sysfs"
#define UIM_ERR(fmt, arg...)  ALOGE("uim:"fmt"\n" , ##arg)
#if defined(UIM_DEBUG)          /* limited debug messages */
#define UIM_START_FUNC()      ALOGE("uim: Inside %s", __FUNCTION__)
#define UIM_DBG(fmt, arg...)  ALOGE("uim:"fmt"\n" , ## arg)
#define UIM_VER(fmt, arg...)
#elif defined(VERBOSE)          /* very verbose */
#define UIM_START_FUNC()      ALOGE("uim: Inside %s", __FUNCTION__)
#define UIM_DBG(fmt, arg...)  ALOGE("uim:"fmt"\n" , ## arg)
#define UIM_VER(fmt, arg...)  ALOGE("uim:"fmt"\n" , ## arg)
#else /* error msgs only */
#define UIM_START_FUNC()
#define UIM_DBG(fmt, arg...)
#define UIM_VER(fmt, arg...)
#endif
#endif  /* ANDROID */

/*Termios2 structure for setting the Custom baud rate*/
struct termios2 {
	tcflag_t c_iflag;       /* input mode flags */
	tcflag_t c_oflag;       /* output mode flags */
	tcflag_t c_cflag;       /* control mode flags */
	tcflag_t c_lflag;       /* local mode flags */
	cc_t c_line;            /* line discipline */
	cc_t c_cc[ARM_NCCS];    /* control characters */
	speed_t c_ispeed;       /* input speed */
	speed_t c_ospeed;       /* output speed */
};

/* HCI command header*/
typedef struct {
	uint16_t        opcode;         /* OCF & OGF */
	uint8_t         plen;
} __attribute__ ((packed))      hci_command_hdr;

/* HCI event header*/
typedef struct {
	uint8_t         evt;
	uint8_t         plen;
} __attribute__ ((packed))      hci_event_hdr;

/* HCI command complete event*/
typedef struct {
	uint8_t         ncmd;
	uint16_t        opcode;
} __attribute__ ((packed)) evt_cmd_complete;

/* HCI event status*/
typedef struct {
	uint8_t         status;
	uint8_t         ncmd;
	uint16_t        opcode;
} __attribute__ ((packed)) evt_cmd_status;

/* HCI Event structure to set the cusrom baud rate*/
typedef struct {
	uint8_t uart_prefix;
	hci_event_hdr hci_hdr;
	evt_cmd_complete cmd_complete;
	uint8_t status;
	uint8_t data[16];
} __attribute__ ((packed)) command_complete_t;

/* HCI Command structure to set the cusrom baud rate*/
typedef struct {
	uint8_t uart_prefix;
	hci_command_hdr hci_hdr;
	uint32_t speed;
} __attribute__ ((packed)) uim_speed_change_cmd;

/* BD address structure to set the uim BD address*/
typedef struct {
	unsigned char b[6];
} __attribute__((packed)) bdaddr_t;

/* HCI Command structure to set the uim BD address*/
typedef struct {
	uint8_t uart_prefix;
	hci_command_hdr hci_hdr;
	bdaddr_t addr;
} __attribute__ ((packed)) uim_bdaddr_change_cmd;

#define INSTALL_SYSFS_ENTRY	"/sys/devices/platform/kim/install"
#define DEV_NAME_SYSFS		"/sys/devices/platform/kim/dev_name"
#define BAUD_RATE_SYSFS		"/sys/devices/platform/kim/baud_rate"
#define FLOW_CTRL_SYSFS		"/sys/devices/platform/kim/flow_cntrl"

/* Functions to insert and remove the kernel modules from the system*/
extern int init_module(void *, unsigned int, const char *);
extern int delete_module(const char *, unsigned int);
extern int load_file(const char *, unsigned int *);

#endif /* UIM_H */
