blob: a2f57885e5b8c594a97ee39768789a91c66980d0 [file] [log] [blame]
/*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
* *
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.
* *
Description:
*/
#ifndef __RTLFW_H__
#define __RTLFW_H__
#include <usb.h>
#define ENODEV 19 /* No such device */
#define HCI_CMD_READ_BD_ADDR 0x1009
#define HCI_VENDOR_CHANGE_BDRATE 0xfc17
#define HCI_VENDOR_READ_RTK_ROM_VERISION 0xfc6d
#define HCI_VENDOR_READ_LMP_VERISION 0x1001
#define HCI_VENDOR_SET_WAKE_UP_DEVICE 0xfc7b
#define HCI_VENDOR_FORCE_RESET_AND_PATCHABLE 0xFC66
/*******************************
** Reasil patch code
********************************/
#define CMD_CMP_EVT 0x0e
#define PKT_LEN 300
#define MSG_TO 1000
#define PATCH_SEG_MAX 252
#define DATA_END 0x80
#define DOWNLOAD_OPCODE 0xfc20
#define BTOFF_OPCODE 0xfc28
#define TRUE 1
#define FALSE 0
#define CMD_HDR_LEN sizeof(struct hci_command_hdr)
#define EVT_HDR_LEN sizeof(struct hci_event_hdr)
#define CMD_CMP_LEN sizeof(struct hci_ev_cmd_complete)
#define RTK_PATCH_LENGTH_MAX 1024*24
enum rtk_endpoit {
CTRL_EP = 0,
INTR_EP = 1,
BULK_EP = 2,
ISOC_EP = 3
};
#define MAX_URBS_QUEUED 5
struct hci_command_hdr {
__le16 opcode; /* OCF & OGF */
unsigned char plen;
} __packed;
struct hci_event_hdr {
unsigned char evt;
unsigned char plen;
} __packed;
#define HCI_EV_CMD_COMPLETE 0x0e
struct hci_ev_cmd_complete {
unsigned char ncmd;
__le16 opcode;
} __packed;
struct rtk_eversion_evt {
unsigned char status;
unsigned char version;
} __attribute__ ((packed));
struct rtk_localversion_evt {
unsigned char status;
unsigned char hci_version;
unsigned int hci_revision;
unsigned char lmp_version;
unsigned int lmp_manufacture;
unsigned int lmp_subversion;
} __attribute__ ((packed));
struct rtk_epatch_entry {
unsigned short chip_id;
unsigned short patch_length;
unsigned int start_offset;
unsigned int coex_version;
unsigned int svn_version;
unsigned int fw_version;
} __attribute__ ((packed));
struct rtk_epatch {
unsigned char signature[8];
unsigned int fw_version;
unsigned short number_of_total_patch;
struct rtk_epatch_entry entry[0];
} __attribute__ ((packed));
struct rtk_extension_entry {
unsigned char opcode;
unsigned char length;
unsigned char *data;
} __attribute__ ((packed));
typedef struct {
unsigned short prod_id;
unsigned short lmp_sub_default;
unsigned short lmp_sub;
unsigned short eversion;
char *mp_patch_name;
char *patch_name;
char *config_name;
unsigned char *fw_cache;
int fw_len;
} patch_info;
typedef struct {
unsigned char index;
unsigned char data[PATCH_SEG_MAX];
} __attribute__((packed)) download_cp;
typedef struct {
unsigned char status;
unsigned char index;
} __attribute__((packed)) download_rp;
typedef struct {
struct usb_interface *intf;
struct usb_device *udev;
patch_info *patch_entry;
int pipe_in, pipe_out;
unsigned char *send_pkt;
unsigned char *rcv_pkt;
struct hci_command_hdr *cmd_hdr;
struct hci_event_hdr *evt_hdr;
struct hci_ev_cmd_complete *cmd_cmp;
unsigned char *req_para, *rsp_para;
unsigned char *fw_data;
int pkt_len;
int fw_len;
} firmware_info;
extern void load_rtl_firmware(void);
extern struct usb_device * get_rtl_dev(void);
extern int load_rtl_firmware_dev(struct usb_device *dev);
#endif