Diff between a41a625b1d833d6a1df91a6a58d7786f8755c89c and f2ca3564606864a68fc41de4b7b5d0362c68f17e

Changed Files

File Additions Deletions Status
monitor/broadcom.c +299 -22 modified

Full Patch

diff --git a/monitor/broadcom.c b/monitor/broadcom.c
index 214790e..901483b 100644
--- a/monitor/broadcom.c
+++ b/monitor/broadcom.c
@@ -44,6 +44,184 @@ static void print_status(uint8_t status)
 	packet_print_error("Status", status);
 }
 
+static void print_sco_routing(uint8_t routing)
+{
+	const char *str;
+
+	switch (routing) {
+	case 0x00:
+		str = "PCM";
+		break;
+	case 0x01:
+		str = "Transport";
+		break;
+	case 0x02:
+		str = "Codec";
+		break;
+	case 0x03:
+		str = "I2S";
+		break;
+	default:
+		str = "Reserved";
+		break;
+	}
+
+	print_field("SCO routing: %s (0x%2.2x)", str, routing);
+}
+
+static void print_pcm_interface_rate(uint8_t rate)
+{
+	const char *str;
+
+	switch (rate) {
+	case 0x00:
+		str = "128 KBps";
+		break;
+	case 0x01:
+		str = "256 KBps";
+		break;
+	case 0x02:
+		str = "512 KBps";
+		break;
+	case 0x03:
+		str = "1024 KBps";
+		break;
+	case 0x04:
+		str = "2048 KBps";
+		break;
+	default:
+		str = "Reserved";
+		break;
+	}
+
+	print_field("PCM interface rate: %s (0x%2.2x)", str, rate);
+}
+
+static void print_frame_type(uint8_t type)
+{
+	const char *str;
+
+	switch (type) {
+	case 0x00:
+		str = "Short";
+		break;
+	case 0x01:
+		str = "Long";
+		break;
+	default:
+		str = "Reserved";
+		break;
+	}
+
+	print_field("Frame type: %s (0x%2.2x)", str, type);
+}
+
+static void print_sync_mode(uint8_t mode)
+{
+	const char *str;
+
+	switch (mode) {
+	case 0x00:
+		str = "Slave";
+		break;
+	case 0x01:
+		str = "Master";
+		break;
+	default:
+		str = "Reserved";
+		break;
+	}
+
+	print_field("Sync mode: %s (0x%2.2x)", str, mode);
+}
+
+static void print_clock_mode(uint8_t mode)
+{
+	const char *str;
+
+	switch (mode) {
+	case 0x00:
+		str = "Slave";
+		break;
+	case 0x01:
+		str = "Master";
+		break;
+	default:
+		str = "Reserved";
+		break;
+	}
+
+	print_field("Clock mode: %s (0x%2.2x)", str, mode);
+}
+
+static void print_sleep_mode(uint8_t mode)
+{
+	const char *str;
+
+	switch (mode) {
+	case 0x00:
+		str = "No sleep mode";
+		break;
+	case 0x01:
+		str = "UART";
+		break;
+	case 0x02:
+		str = "UART with messaging";
+		break;
+	case 0x03:
+		str = "USB";
+		break;
+	case 0x04:
+		str = "H4IBSS";
+		break;
+	case 0x05:
+		str = "USB with Host wake";
+		break;
+	case 0x06:
+		str = "SDIO";
+		break;
+	case 0x07:
+		str = "UART CS-N";
+		break;
+	case 0x08:
+		str = "SPI";
+		break;
+	case 0x09:
+		str = "H5";
+		break;
+	case 0x0a:
+		str = "H4DS";
+		break;
+	case 0x0c:
+		str = "UART with BREAK";
+		break;
+	default:
+		str = "Reserved";
+		break;
+	}
+
+	print_field("Sleep mode: %s (0x%2.2x)", str, mode);
+}
+
+static void print_clock_setting(uint8_t clock)
+{
+	const char *str;
+
+	switch (clock) {
+	case 0x01:
+		str = "48 Mhz";
+		break;
+	case 0x02:
+		str = "24 Mhz";
+		break;
+	default:
+		str = "Reserved";
+		break;
+	}
+
+	print_field("UART clock: %s (0x%2.2x)", str, clock);
+}
+
 static void null_cmd(const void *data, uint8_t size)
 {
 }
@@ -73,45 +251,112 @@ static void update_uart_baud_rate_cmd(const void *data, uint8_t size)
 	print_field("Explicit baud rate: %u Mbps", exp_rate);
 }
 
-static void enable_usb_hid_emulation_cmd(const void *data, uint8_t size)
+static void write_sco_pcm_int_param_cmd(const void *data, uint8_t size)
 {
-	uint8_t enable = get_u8(data);
+	uint8_t routing = get_u8(data);
+	uint8_t rate = get_u8(data + 1);
+	uint8_t frame_type = get_u8(data + 2);
+	uint8_t sync_mode = get_u8(data + 3);
+	uint8_t clock_mode = get_u8(data + 4);
+
+	print_sco_routing(routing);
+	print_pcm_interface_rate(rate);
+	print_frame_type(frame_type);
+	print_sync_mode(sync_mode);
+	print_clock_mode(clock_mode);
+}
+
+static void read_sco_pcm_int_param_rsp(const void *data, uint8_t size)
+{
+	uint8_t status = get_u8(data);
+	uint8_t routing = get_u8(data + 1);
+	uint8_t rate = get_u8(data + 2);
+	uint8_t frame_type = get_u8(data + 3);
+	uint8_t sync_mode = get_u8(data + 4);
+	uint8_t clock_mode = get_u8(data + 5);
+
+	print_status(status);
+	print_sco_routing(routing);
+	print_pcm_interface_rate(rate);
+	print_frame_type(frame_type);
+	print_sync_mode(sync_mode);
+	print_clock_mode(clock_mode);
+}
+
+static void set_sleepmode_param_cmd(const void *data, uint8_t size)
+{
+	uint8_t mode = get_u8(data);
+
+	print_sleep_mode(mode);
+
+	packet_hexdump(data + 1, size - 1);
+}
+
+static void read_sleepmode_param_rsp(const void *data, uint8_t size)
+{
+	uint8_t status = get_u8(data);
+	uint8_t mode = get_u8(data + 1);
+
+	print_status(status);
+	print_sleep_mode(mode);
+
+	packet_hexdump(data + 2, size - 2);
+}
+
+static void enable_radio_cmd(const void *data, uint8_t size)
+{
+	uint8_t mode = get_u8(data);
 	const char *str;
 
-	switch (enable) {
+	switch (mode) {
 	case 0x00:
-		str = "Bluetooth mode";
+		str = "Disable the radio";
 		break;
 	case 0x01:
-		str = "HID Mode";
+		str = "Enable the radio";
 		break;
 	default:
 		str = "Reserved";
 		break;
 	}
 
-	print_field("Enable: %s (0x%2.2x)", str, enable);
+	print_field("Mode: %s (0x%2.2x)", str, mode);
 }
 
-static void write_uart_clock_setting_cmd(const void *data, uint8_t size)
+static void enable_usb_hid_emulation_cmd(const void *data, uint8_t size)
 {
-	uint8_t clock = get_u8(data);
-
+	uint8_t enable = get_u8(data);
 	const char *str;
 
-	switch (clock) {
-	case 0x01:
-		str = "48 Mhz";
+	switch (enable) {
+	case 0x00:
+		str = "Bluetooth mode";
 		break;
-	case 0x02:
-		str = "24 Mhz";
+	case 0x01:
+		str = "HID Mode";
 		break;
 	default:
 		str = "Reserved";
 		break;
 	}
 
-	print_field("UART clock: %s (0x%2.2x)", str, clock);
+	print_field("Enable: %s (0x%2.2x)", str, enable);
+}
+
+static void read_uart_clock_setting_rsp(const void *data, uint8_t size)
+{
+	uint8_t status = get_u8(data);
+	uint8_t clock = get_u8(data + 1);
+
+	print_status(status);
+	print_clock_setting(clock);
+}
+
+static void write_uart_clock_setting_cmd(const void *data, uint8_t size)
+{
+	uint8_t clock = get_u8(data);
+
+	print_clock_setting(clock);
 }
 
 static void write_ram_cmd(const void *data, uint8_t size)
@@ -123,6 +368,24 @@ static void write_ram_cmd(const void *data, uint8_t size)
 	packet_hexdump(data + 4, size - 4);
 }
 
+static void read_ram_cmd(const void *data, uint8_t size)
+{
+	uint32_t addr = get_le32(data);
+	uint8_t length = get_u8(data + 4);
+
+	print_field("Address: 0x%8.8x", addr);
+	print_field("Length: %u", length);
+}
+
+static void read_ram_rsp(const void *data, uint8_t size)
+{
+	uint8_t status = get_u8(data);
+
+	print_status(status);
+
+	packet_hexdump(data + 1, size - 1);
+}
+
 static void launch_ram_cmd(const void *data, uint8_t size)
 {
 	uint32_t addr = get_le32(data);
@@ -222,25 +485,39 @@ static const struct vendor_ocf vendor_ocf_table[] = {
 	{ 0x018, "Update UART Baud Rate",
 			update_uart_baud_rate_cmd, 6, true,
 			status_rsp, 1, true },
-	{ 0x01c, "Write SCO PCM Int Param" },
-	{ 0x01d, "Read SCO PCM Int Param" },
-	{ 0x027, "Set Sleepmode Param" },
-	{ 0x028, "Read Sleepmode Param" },
+	{ 0x01c, "Write SCO PCM Int Param",
+			write_sco_pcm_int_param_cmd, 5, true,
+			status_rsp, 1, true },
+	{ 0x01d, "Read SCO PCM Int Param",
+			null_cmd, 0, true,
+			read_sco_pcm_int_param_rsp, 6, true },
+	{ 0x027, "Set Sleepmode Param",
+			set_sleepmode_param_cmd, 12, true,
+			status_rsp, 1, true },
+	{ 0x028, "Read Sleepmode Param",
+			null_cmd, 0, true,
+			read_sleepmode_param_rsp, 13, true },
 	{ 0x02e, "Download Minidriver",
 			null_cmd, 0, true,
 			status_rsp, 1, true },
-	{ 0x034, "Enable Radio" },
+	{ 0x034, "Enable Radio",
+			enable_radio_cmd, 1, true,
+			status_rsp, 1, true },
 	{ 0x03b, "Enable USB HID Emulation",
 			enable_usb_hid_emulation_cmd, 1, true,
 			status_rsp, 1, true },
-	{ 0x044, "Read UART Clock Setting" },
+	{ 0x044, "Read UART Clock Setting",
+			null_cmd, 0, true,
+			read_uart_clock_setting_rsp, 1, true },
 	{ 0x045, "Write UART Clock Setting",
 			write_uart_clock_setting_cmd, 1, true,
 			status_rsp, 1, true },
 	{ 0x04c, "Write RAM",
 			write_ram_cmd, 4, false,
 			status_rsp, 1, true },
-	{ 0x04d, "Read RAM" },
+	{ 0x04d, "Read RAM",
+			read_ram_cmd, 5, true,
+			read_ram_rsp, 1, false },
 	{ 0x04e, "Launch RAM",
 			launch_ram_cmd, 4, true,
 			status_rsp, 1, true },