From 8d588f0abd06d706eea0de147f95df1ca2224189 Mon Sep 17 00:00:00 2001 From: Brandon Ros Date: Sun, 20 Aug 2023 18:10:57 -0400 Subject: [PATCH] cyw43: bluetooth module that almost works --- cyw43-firmware/43439A0.bin | Bin 230321 -> 231077 bytes cyw43-firmware/43439A0_btfw.bin | Bin 0 -> 6164 bytes cyw43-firmware/43439A0_clm.bin | Bin 4752 -> 984 bytes cyw43/src/bluetooth.rs | 230 +++++++++++++++++++++++++++++ cyw43/src/bus.rs | 28 ++++ cyw43/src/consts.rs | 36 +++++ cyw43/src/lib.rs | 6 +- cyw43/src/runner.rs | 54 +++++-- examples/rp/src/bin/wifi_blinky.rs | 3 +- 9 files changed, 343 insertions(+), 14 deletions(-) mode change 100755 => 100644 cyw43-firmware/43439A0.bin create mode 100644 cyw43-firmware/43439A0_btfw.bin mode change 100755 => 100644 cyw43-firmware/43439A0_clm.bin create mode 100644 cyw43/src/bluetooth.rs diff --git a/cyw43-firmware/43439A0.bin b/cyw43-firmware/43439A0.bin old mode 100755 new mode 100644 index 017375277d77d10e198deb1c668e2e6bb074d869..a05482fe957fbbf27d334e9b5c4fa6c53022f0bf GIT binary patch delta 54774 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

;x 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

&Y+ql0}nlp2EOH$C5sqy6Gc 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 SQ^lw$6Q{++#m5)K8~-2KbzOD< diff --git a/cyw43-firmware/43439A0_btfw.bin b/cyw43-firmware/43439A0_btfw.bin new file mode 100644 index 0000000000000000000000000000000000000000..290ce8ef0607f51f995e356808f8f05aab5fe4ba GIT binary patch literal 6164 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 X^C0l)rvY5Xo3-pBxXe^|a|7~sadC2< literal 0 HcmV?d00001 diff --git a/cyw43-firmware/43439A0_clm.bin b/cyw43-firmware/43439A0_clm.bin old mode 100755 new mode 100644 index 1fedd753ac255eb8feb4b81a8214d4070a8e414c..dc4ee02523209e1cc843272ead9d95fd285f2bbf GIT binary patch literal 984 zcmbVKJ#Q015S_KdmtzAVp^YrjAfa5&E87WHn)BJQ51*Zr?@UZOKuEEa#Fi5wMT&&z zC@Cpvsfg0j@B=9M0SJknn&x)*qvH!!Fv%H12%4k>XHMhE^%SE?Zt5j<4Cb$$s zNvc+{v_%=XGKX^xZ=zNeI8c{{y?Stjdr#Bf;w2DJ=~wXv7Sx*reG7cgsHNY;M~zvq z9}@Hkb_n(?Xh0`b$ZB+~r%B~zY(3j7(W+Zdi=H;K+H5Rf(SSt*>I6K+lgR3HSgS+9 zFtAj};E>AUQ%iM8b%*pkv!K@^U>iLixyK_%EE@5mA_hlPju{hEFlJ*hkDM?)Ve`qZ ztv-m&JL0{DL&>HYT<@M|DOJGZw87fR{2S~B_@lXe;r5-oOZS#n?&tBDvJ2O)-?(`z Nw`jEfwa=eK{sQ=&t>FLw literal 4752 zcmd5=&2Jn_5wGsq_1e4Z_1N)y;YH$Uq&y^q9JBU1j$@)H@63MB%zC^tyWX{OiHHOT zLQupZ5>ogF-U)Hw$Q20*#NUwvM}))$i30}?+@CbmZ@MZ$95``cWzW`jcYXY-s;jFf zOs>OcMD(+7{o@P6-PeDnIn%kRH_^{9K? z{WxKaX_}U4n_bhf);4X+w!NKZv(;+1+q><~?rx`Zb3!+#%<{*5q9Zo)hfEg?=nMw) z=T`#kFTVSo@Z5y)1pNQ=Ke(~~_WYXV;`2@&|HXlh0aGY-voVJ7^yG}A$SIyBSV zObav1ym(QIZ%r~aNnw(uNmeH9o3t?L+RPI(zcyK7vchB=v$!^kWj!C7d}{L86pKc2 zYnSJg8ri5o z-~x)M@8U&Vp`61bjaQ`ciWE)+IEY{*C;~2O4p$^_x>2l>C2$lWa6lT(>3;cuEsTHy z&Wtj#Fj5rJQdO*!>sHsS9Y8+csQFjuZz7fT+}2p)q#J_Ce+g->YrFMA=c6qPi3RUv2v;QSfb;{x^v?N2ksCm z7PV@3`>|BffEyR*pLp%!Me&BV%WW){`a_A-RZ28_6FoQ**&xK-PbG(v*u{$yM2B~r zpGb5l(V%djv%f^sYH;{OzM1!ti!HMCFdyxE~HG^M{2?0xi&)iMpYn`Si@JystNQ9O{79l_=SeD(ArXHC=2O! z{32F%v9MdHg@syJsD*{>i-2!6&QXQNw1BBVQQS(r_}b$FSE#8=c%IkLQc^2erm}dM zQ@yNll=*VfE}IqcfV+MW8)>MPDrY4Tq?HD4r75w}q+Lx#@=8$93MqjdcdK>d7TLn? z_19hUsvKLN@Cb5#eM+A=qUS~ezEwKo*J!PQV!a?!dRUy(ZrS26tqZD*5BUDMQ#LTN zqE@*B;?~vhV7;a$*n_p?e6YTwPBpSQagzNFavsjy@D<+?{35^+kCixA;)xP)0sw9# zD72Amp}P}_^4+NtJtfYRc&x;^5>J%4P~xc)x{2;msWx}IzxWnT^@MD)Ws{~&S~hI+ zee#lQ*szyO@=eiFoqrFu?5t@AvS3B_UBj+;L48Cv+p<~HW-U7b$5o9V2_B$o&&XbF z+oN53RyueI-@)wF zj=f;Pgck~YHzWE5KRCqnU8euZ_c9JH;Z@5ErumQl%+7k7;&J VvnMpWpc&p5Vcnm2-S2)w^e-;e=~w^& diff --git a/cyw43/src/bluetooth.rs b/cyw43/src/bluetooth.rs new file mode 100644 index 00000000..93321aa8 --- /dev/null +++ b/cyw43/src/bluetooth.rs @@ -0,0 +1,230 @@ +use embassy_time::{Timer, Duration}; +use embedded_hal_1::digital::OutputPin; + +use crate::{consts::*, CHIP, bus::Bus, SpiBusCyw43}; + +#[derive(Debug)] +pub(crate) struct CybtFwCb<'a> { + pub p_fw_mem_start: &'a [u8], + pub fw_len: u32, + pub p_next_line_start: &'a [u8], +} + +#[derive(Debug)] +pub(crate) struct HexFileData<'a> { + pub addr_mode: i32, + pub hi_addr: u16, + pub dest_addr: u32, + pub p_ds: &'a mut [u8], +} + +pub(crate) fn is_aligned(a: u32, x: u32) -> bool { + (a & (x - 1)) == 0 +} + +pub(crate) fn round_down(x: u32, a: u32) -> u32 { + x & !(a - 1) +} + +pub(crate) fn cybt_fw_get_data(p_btfw_cb: &mut CybtFwCb, hfd: &mut HexFileData) -> u32 { + let mut abs_base_addr32 = 0; + + loop { + let num_bytes = p_btfw_cb.p_next_line_start[0]; + p_btfw_cb.p_next_line_start = &p_btfw_cb.p_next_line_start[1..]; + + let addr = (p_btfw_cb.p_next_line_start[0] as u16) << 8 | p_btfw_cb.p_next_line_start[1] as u16; + p_btfw_cb.p_next_line_start = &p_btfw_cb.p_next_line_start[2..]; + + let line_type = p_btfw_cb.p_next_line_start[0]; + p_btfw_cb.p_next_line_start = &p_btfw_cb.p_next_line_start[1..]; + + if num_bytes == 0 { + break; + } + + hfd.p_ds[..num_bytes as usize].copy_from_slice(&p_btfw_cb.p_next_line_start[..num_bytes as usize]); + p_btfw_cb.p_next_line_start = &p_btfw_cb.p_next_line_start[num_bytes as usize..]; + + match line_type { + BTFW_HEX_LINE_TYPE_EXTENDED_ADDRESS => { + hfd.hi_addr = (hfd.p_ds[0] as u16) << 8 | hfd.p_ds[1] as u16; + hfd.addr_mode = BTFW_ADDR_MODE_EXTENDED; + } + BTFW_HEX_LINE_TYPE_EXTENDED_SEGMENT_ADDRESS => { + hfd.hi_addr = (hfd.p_ds[0] as u16) << 8 | hfd.p_ds[1] as u16; + hfd.addr_mode = BTFW_ADDR_MODE_SEGMENT; + } + BTFW_HEX_LINE_TYPE_ABSOLUTE_32BIT_ADDRESS => { + abs_base_addr32 = (hfd.p_ds[0] as u32) << 24 | (hfd.p_ds[1] as u32) << 16 | + (hfd.p_ds[2] as u32) << 8 | hfd.p_ds[3] as u32; + hfd.addr_mode = BTFW_ADDR_MODE_LINEAR32; + } + BTFW_HEX_LINE_TYPE_DATA => { + hfd.dest_addr = addr as u32; + match hfd.addr_mode { + BTFW_ADDR_MODE_EXTENDED => hfd.dest_addr += (hfd.hi_addr as u32) << 16, + BTFW_ADDR_MODE_SEGMENT => hfd.dest_addr += (hfd.hi_addr as u32) << 4, + BTFW_ADDR_MODE_LINEAR32 => hfd.dest_addr += abs_base_addr32, + _ => {} + } + return num_bytes as u32; + } + _ => {} + } + } + 0 +} + +pub(crate) async fn upload_bluetooth_firmware(bus: &mut Bus, firmware: &[u8]) { + // read version + let version_length = firmware[0]; + let _version = &firmware[1..=version_length as usize]; + // skip version + 1 extra byte as per cybt_shared_bus_driver.c + let firmware = &firmware[version_length as usize + 2..]; + // buffer + let mut data_buffer: [u8; 0x100] = [0; 0x100]; + // structs + let mut btfw_cb = CybtFwCb { + p_fw_mem_start: firmware, + fw_len: firmware.len() as u32, + p_next_line_start: firmware, + }; + let mut hfd = HexFileData { + addr_mode: BTFW_ADDR_MODE_UNKNOWN, + hi_addr: 0, + dest_addr: 0, + p_ds: &mut data_buffer, + }; + loop { + let mut aligned_data_buffer: [u8; 0x100] = [0; 0x100]; + let num_fw_bytes = cybt_fw_get_data(&mut btfw_cb, &mut hfd); + if num_fw_bytes == 0 { + break; + } + let fw_bytes = &hfd.p_ds[0..num_fw_bytes as usize]; + let mut dest_start_addr = hfd.dest_addr + CHIP.bluetooth_base_address; + let mut aligned_data_buffer_index: usize = 0; + // pad start + if !is_aligned(dest_start_addr, 4) { + let num_pad_bytes = dest_start_addr % 4; + let padded_dest_start_addr = round_down(dest_start_addr, 4); + let mut memory_value_bytes = [0; 4]; + bus.bp_read(padded_dest_start_addr, &mut memory_value_bytes).await; + // Copy the previous memory value's bytes to the start + for i in 0..num_pad_bytes as usize { + aligned_data_buffer[aligned_data_buffer_index] = memory_value_bytes[i]; + aligned_data_buffer_index += 1; + } + // Copy the firmware bytes after the padding bytes + for i in 0..num_fw_bytes as usize { + aligned_data_buffer[aligned_data_buffer_index] = fw_bytes[i]; + aligned_data_buffer_index += 1; + } + dest_start_addr = padded_dest_start_addr; + } else { + // Directly copy fw_bytes into aligned_data_buffer if no start padding is required + for i in 0..num_fw_bytes as usize { + aligned_data_buffer[aligned_data_buffer_index] = fw_bytes[i]; + aligned_data_buffer_index += 1; + } + } + // pad end + let mut dest_end_addr = dest_start_addr + aligned_data_buffer_index as u32; + if !is_aligned(dest_end_addr, 4) { + let offset = dest_end_addr % 4; + let num_pad_bytes_end = 4 - offset; + let padded_dest_end_addr = round_down(dest_end_addr, 4); + let mut memory_value_bytes = [0; 4]; + bus.bp_read(padded_dest_end_addr, &mut memory_value_bytes).await; + // Append the necessary memory bytes to pad the end of aligned_data_buffer + for i in offset..4 { + aligned_data_buffer[aligned_data_buffer_index] = memory_value_bytes[i as usize]; + aligned_data_buffer_index += 1; + } + dest_end_addr += num_pad_bytes_end; + } else { + // pad end alignment not needed + } + let buffer_to_write = &aligned_data_buffer[0..aligned_data_buffer_index as usize]; + debug!("upload_bluetooth_firmware: dest_start_addr = {:x} dest_end_addr = {:x} aligned_data_buffer_index = {} buffer_to_write = {:02x}", dest_start_addr, dest_end_addr, aligned_data_buffer_index, buffer_to_write); + assert!(dest_start_addr % 4 == 0); + assert!(dest_end_addr % 4 == 0); + assert!(aligned_data_buffer_index % 4 == 0); + bus.bp_write(dest_start_addr, buffer_to_write).await; + } +} + +pub(crate) async fn wait_bt_ready(bus: &mut Bus) { + debug!("wait_bt_ready"); + let mut success = false; + for _ in 0..300 { + let val = bus.bp_read32(BT_CTRL_REG_ADDR).await; + // TODO: do we need to swap endianness on this read? + debug!("BT_CTRL_REG_ADDR = {:08x}", val); + /*if val & BTSDIO_REG_FW_RDY_BITMASK != 0 { + break; + }*/ + // TODO: should be 00000000 until it is 0x01000100 + if val == 0x01000100 { + success = true; + break; + } + Timer::after(Duration::from_millis(1)).await; + } + assert!(success == true); +} + +pub(crate) async fn wait_bt_awake(bus: &mut Bus) { + debug!("wait_bt_awake"); + loop { + let val = bus.bp_read32(BT_CTRL_REG_ADDR).await; + // TODO: do we need to swap endianness on this read? + debug!("BT_CTRL_REG_ADDR = {:08x}", val); + if val & BTSDIO_REG_BT_AWAKE_BITMASK != 0 { + break; + } + Timer::after(Duration::from_millis(100)).await; + } +} + +pub(crate) async fn bt_set_host_ready(bus: &mut Bus) { + debug!("bt_set_host_ready"); + let old_val = bus.bp_read32(HOST_CTRL_REG_ADDR).await; + // TODO: do we need to swap endianness on this read? + let new_val = old_val | BTSDIO_REG_SW_RDY_BITMASK; + bus.bp_write32(HOST_CTRL_REG_ADDR, new_val).await; +} + +pub(crate) async fn bt_set_awake(bus: &mut Bus) { + debug!("bt_set_awake"); + let old_val = bus.bp_read32(HOST_CTRL_REG_ADDR).await; + // TODO: do we need to swap endianness on this read? + let new_val = old_val | BTSDIO_REG_WAKE_BT_BITMASK; + bus.bp_write32(HOST_CTRL_REG_ADDR, new_val).await; +} + +pub(crate) async fn bt_toggle_intr(bus: &mut Bus) { + debug!("bt_toggle_intr"); + let old_val = bus.bp_read32(HOST_CTRL_REG_ADDR).await; + // TODO: do we need to swap endianness on this read? + let new_val = old_val ^ BTSDIO_REG_DATA_VALID_BITMASK; + bus.bp_write32(HOST_CTRL_REG_ADDR, new_val).await; +} + +pub(crate) async fn bt_set_intr(bus: &mut Bus) { + debug!("bt_set_intr"); + let old_val = bus.bp_read32(HOST_CTRL_REG_ADDR).await; + let new_val = old_val | BTSDIO_REG_DATA_VALID_BITMASK; + bus.bp_write32(HOST_CTRL_REG_ADDR, new_val).await; +} + +pub(crate) async fn init_bluetooth(bus: &mut Bus, firmware: &[u8]) { + bus.bp_write32(CHIP.bluetooth_base_address + BT2WLAN_PWRUP_ADDR, BT2WLAN_PWRUP_WAKE).await; + upload_bluetooth_firmware(bus, firmware).await; + wait_bt_ready(bus).await; + // TODO: cybt_init_buffer(); + wait_bt_awake(bus).await; + bt_set_host_ready(bus).await; + bt_toggle_intr(bus).await; +} diff --git a/cyw43/src/bus.rs b/cyw43/src/bus.rs index e26f1112..c7518291 100644 --- a/cyw43/src/bus.rs +++ b/cyw43/src/bus.rs @@ -50,11 +50,13 @@ where pub async fn init(&mut self) { // Reset + debug!("WL_REG off/on"); self.pwr.set_low().unwrap(); Timer::after(Duration::from_millis(20)).await; self.pwr.set_high().unwrap(); Timer::after(Duration::from_millis(250)).await; + debug!("read REG_BUS_TEST_RO"); while self .read32_swapped(REG_BUS_TEST_RO) .inspect(|v| trace!("{:#x}", v)) @@ -62,30 +64,56 @@ where != FEEDBEAD {} + debug!("write REG_BUS_TEST_RW"); self.write32_swapped(REG_BUS_TEST_RW, TEST_PATTERN).await; let val = self.read32_swapped(REG_BUS_TEST_RW).await; trace!("{:#x}", val); assert_eq!(val, TEST_PATTERN); + debug!("read REG_BUS_CTRL"); let val = self.read32_swapped(REG_BUS_CTRL).await; trace!("{:#010b}", (val & 0xff)); // 32-bit word length, little endian (which is the default endianess). + // TODO: C library is uint32_t val = WORD_LENGTH_32 | ENDIAN_BIG | HIGH_SPEED_MODE | INTERRUPT_POLARITY_HIGH | WAKE_UP | 0x4 << (8 * SPI_RESPONSE_DELAY) | INTR_WITH_STATUS << (8 * SPI_STATUS_ENABLE); + debug!("write REG_BUS_CTRL"); self.write32_swapped( REG_BUS_CTRL, WORD_LENGTH_32 | HIGH_SPEED | INTERRUPT_HIGH | WAKE_UP | STATUS_ENABLE | INTERRUPT_WITH_STATUS, ) .await; + debug!("read REG_BUS_CTRL"); let val = self.read8(FUNC_BUS, REG_BUS_CTRL).await; trace!("{:#b}", val); + // TODO: C doesn't do this? i doubt it messes anything up + debug!("read REG_BUS_TEST_RO"); let val = self.read32(FUNC_BUS, REG_BUS_TEST_RO).await; trace!("{:#x}", val); assert_eq!(val, FEEDBEAD); + + // TODO: C doesn't do this? i doubt it messes anything up + debug!("read REG_BUS_TEST_RW"); let val = self.read32(FUNC_BUS, REG_BUS_TEST_RW).await; trace!("{:#x}", val); assert_eq!(val, TEST_PATTERN); + + // TODO: setting this causes total failure (watermark read test fails) + debug!("write SPI_RESP_DELAY_F1 CYW43_BACKPLANE_READ_PAD_LEN_BYTES"); + self.write8(FUNC_BUS, SPI_RESP_DELAY_F1, WHD_BUS_SPI_BACKPLANE_READ_PADD_SIZE).await; + + // TODO: Make sure error interrupt bits are clear? + // cyw43_write_reg_u8(self, BUS_FUNCTION, SPI_INTERRUPT_REGISTER, DATA_UNAVAILABLE | COMMAND_ERROR | DATA_ERROR | F1_OVERFLOW) != 0) + debug!("Make sure error interrupt bits are clear"); + self.write8(FUNC_BUS, REG_BUS_INTERRUPT, (IRQ_DATA_UNAVAILABLE | IRQ_COMMAND_ERROR | IRQ_DATA_ERROR | IRQ_F1_OVERFLOW) as u8) + .await; + + // Enable a selection of interrupts + // TODO: why not all of these F2_F3_FIFO_RD_UNDERFLOW | F2_F3_FIFO_WR_OVERFLOW | COMMAND_ERROR | DATA_ERROR | F2_PACKET_AVAILABLE | F1_OVERFLOW | F1_INTR + debug!("enable a selection of interrupts"); + self.write16(FUNC_BUS, REG_BUS_INTERRUPT_ENABLE, IRQ_F2_F3_FIFO_RD_UNDERFLOW | IRQ_F2_F3_FIFO_WR_OVERFLOW | IRQ_COMMAND_ERROR | IRQ_DATA_ERROR | IRQ_F2_PACKET_AVAILABLE | IRQ_F1_OVERFLOW | IRQ_F1_INTR) + .await; } pub async fn wlan_read(&mut self, buf: &mut [u32], len_in_u8: u32) { diff --git a/cyw43/src/consts.rs b/cyw43/src/consts.rs index 1f655158..6293a941 100644 --- a/cyw43/src/consts.rs +++ b/cyw43/src/consts.rs @@ -51,6 +51,13 @@ pub(crate) const REG_BACKPLANE_READ_FRAME_BC_HIGH: u32 = 0x1001C; pub(crate) const REG_BACKPLANE_WAKEUP_CTRL: u32 = 0x1001E; pub(crate) const REG_BACKPLANE_SLEEP_CSR: u32 = 0x1001F; +pub(crate) const I_HMB_SW_MASK: u32 = (0x000000f0); +pub(crate) const I_HMB_FC_CHANGE: u32 = (1 << 5); +pub(crate) const SDIO_INT_STATUS: u32 = 0x20; +pub(crate) const SDIO_INT_HOST_MASK: u32 = 0x24; + +pub(crate) const SPI_F2_WATERMARK: u8 = 0x20; + pub(crate) const BACKPLANE_WINDOW_SIZE: usize = 0x8000; pub(crate) const BACKPLANE_ADDRESS_MASK: u32 = 0x7FFF; pub(crate) const BACKPLANE_ADDRESS_32BIT_FLAG: u32 = 0x08000; @@ -118,6 +125,35 @@ pub(crate) const WPA2_SECURITY: u32 = 0x00400000; pub(crate) const MIN_PSK_LEN: usize = 8; pub(crate) const MAX_PSK_LEN: usize = 64; +// Bluetooth constants. +pub(crate) const SPI_RESP_DELAY_F1: u32 = 0x001d; +pub(crate) const WHD_BUS_SPI_BACKPLANE_READ_PADD_SIZE: u8 = 4; +pub(crate) const CYW43_BACKPLANE_READ_PAD_LEN_BYTES: u8 = 16; + +pub(crate) const BTFW_ADDR_MODE_UNKNOWN: i32 = 0; +pub(crate) const BTFW_ADDR_MODE_EXTENDED: i32 = 1; +pub(crate) const BTFW_ADDR_MODE_SEGMENT: i32 = 2; +pub(crate) const BTFW_ADDR_MODE_LINEAR32: i32 = 3; + +pub(crate) const BTFW_HEX_LINE_TYPE_DATA: u8 = 0; +pub(crate) const BTFW_HEX_LINE_TYPE_END_OF_DATA: u8 = 1; +pub(crate) const BTFW_HEX_LINE_TYPE_EXTENDED_SEGMENT_ADDRESS: u8 = 2; +pub(crate) const BTFW_HEX_LINE_TYPE_EXTENDED_ADDRESS: u8 = 4; +pub(crate) const BTFW_HEX_LINE_TYPE_ABSOLUTE_32BIT_ADDRESS: u8 = 5; + +pub(crate) const BT2WLAN_PWRUP_WAKE: u32 = 3; +pub(crate) const BT2WLAN_PWRUP_ADDR: u32 = 0x640894; + +pub(crate) const BT_CTRL_REG_ADDR: u32 = 0x18000c7c; +pub(crate) const HOST_CTRL_REG_ADDR: u32 = 0x18000d6c; +pub(crate) const WLAN_RAM_BASE_REG_ADDR: u32 = 0x18000d68; + +pub(crate) const BTSDIO_REG_DATA_VALID_BITMASK: u32 = (1 << 1); +pub(crate) const BTSDIO_REG_BT_AWAKE_BITMASK: u32 = (1 << 8); +pub(crate) const BTSDIO_REG_WAKE_BT_BITMASK: u32 = (1 << 17); +pub(crate) const BTSDIO_REG_SW_RDY_BITMASK: u32 = (1 << 24); +pub(crate) const BTSDIO_REG_FW_RDY_BITMASK: u32 = (1 << 24); + // Security type (authentication and encryption types are combined using bit mask) #[allow(non_camel_case_types)] #[derive(Copy, Clone, PartialEq)] diff --git a/cyw43/src/lib.rs b/cyw43/src/lib.rs index 30a3d5f2..3162b8b9 100644 --- a/cyw43/src/lib.rs +++ b/cyw43/src/lib.rs @@ -8,6 +8,7 @@ pub(crate) mod fmt; mod bus; +mod bluetooth; mod consts; mod countries; mod events; @@ -55,6 +56,7 @@ impl Core { struct Chip { arm_core_base_address: u32, socsram_base_address: u32, + bluetooth_base_address: u32, socsram_wrapper_base_address: u32, sdiod_core_base_address: u32, pmu_base_address: u32, @@ -82,6 +84,7 @@ const WRAPPER_REGISTER_OFFSET: u32 = 0x100000; const CHIP: Chip = Chip { arm_core_base_address: 0x18003000 + WRAPPER_REGISTER_OFFSET, socsram_base_address: 0x18004000, + bluetooth_base_address: 0x19000000, socsram_wrapper_base_address: 0x18004000 + WRAPPER_REGISTER_OFFSET, sdiod_core_base_address: 0x18002000, pmu_base_address: 0x18000000, @@ -211,6 +214,7 @@ pub async fn new<'a, PWR, SPI>( pwr: PWR, spi: SPI, firmware: &[u8], + bluetooth_firmware: &[u8] ) -> (NetDriver<'a>, Control<'a>, Runner<'a, PWR, SPI>) where PWR: OutputPin, @@ -221,7 +225,7 @@ where let mut runner = Runner::new(ch_runner, Bus::new(pwr, spi), &state.ioctl_state, &state.events); - runner.init(firmware).await; + runner.init(firmware, bluetooth_firmware).await; ( device, diff --git a/cyw43/src/runner.rs b/cyw43/src/runner.rs index 1c187faa..df492523 100644 --- a/cyw43/src/runner.rs +++ b/cyw43/src/runner.rs @@ -6,7 +6,7 @@ use embedded_hal_1::digital::OutputPin; use crate::bus::Bus; pub use crate::bus::SpiBusCyw43; -use crate::consts::*; +use crate::{consts::*, bluetooth}; use crate::events::{Event, Events, Status}; use crate::fmt::Bytes; use crate::ioctl::{IoctlState, IoctlType, PendingIoctl}; @@ -73,23 +73,41 @@ where } } - pub(crate) async fn init(&mut self, firmware: &[u8]) { + pub(crate) async fn init(&mut self, firmware: &[u8], bluetooth_firmware: &[u8]) { self.bus.init().await; // Init ALP (Active Low Power) clock + debug!("init alp"); self.bus .write8(FUNC_BACKPLANE, REG_BACKPLANE_CHIP_CLOCK_CSR, BACKPLANE_ALP_AVAIL_REQ) .await; + + // check we can set the bluetooth watermark + debug!("set bluetooth watermark"); + self.bus + .write8(FUNC_BACKPLANE, REG_BACKPLANE_FUNCTION2_WATERMARK, 0x10) + .await; + let watermark = self.bus.read8(FUNC_BACKPLANE, REG_BACKPLANE_FUNCTION2_WATERMARK).await; + debug!("watermark = {:02x}", watermark); + assert!(watermark == 0x10); + debug!("waiting for clock..."); while self.bus.read8(FUNC_BACKPLANE, REG_BACKPLANE_CHIP_CLOCK_CSR).await & BACKPLANE_ALP_AVAIL == 0 {} debug!("clock ok"); + // clear request for ALP + debug!("clear request for ALP"); + self.bus.write8(FUNC_BACKPLANE, REG_BACKPLANE_CHIP_CLOCK_CSR, 0).await; + let chip_id = self.bus.bp_read16(0x1800_0000).await; debug!("chip ID: {}", chip_id); // Upload firmware. self.core_disable(Core::WLAN).await; + self.core_disable(Core::SOCSRAM).await; // TODO: is this needed if we reset right after? self.core_reset(Core::SOCSRAM).await; + + // this is 4343x specific stuff: Disable remap for SRAM_3 self.bus.bp_write32(CHIP.socsram_base_address + 0x10, 3).await; self.bus.bp_write32(CHIP.socsram_base_address + 0x44, 0).await; @@ -98,6 +116,9 @@ where debug!("loading fw"); self.bus.bp_write(ram_addr, firmware).await; + debug!("loading bluetooth fw"); + bluetooth::init_bluetooth(&mut self.bus, bluetooth_firmware).await; + debug!("loading nvram"); // Round up to 4 bytes. let nvram_len = (NVRAM.len() + 3) / 4 * 4; @@ -116,23 +137,31 @@ where self.core_reset(Core::WLAN).await; assert!(self.core_is_up(Core::WLAN).await); + // wait until HT clock is available; takes about 29ms + debug!("wait for HT clock"); while self.bus.read8(FUNC_BACKPLANE, REG_BACKPLANE_CHIP_CLOCK_CSR).await & 0x80 == 0 {} // "Set up the interrupt mask and enable interrupts" - // self.bus.bp_write32(CHIP.sdiod_core_base_address + 0x24, 0xF0).await; + debug!("setup interrupt mask"); + self.bus.bp_write32(CHIP.sdiod_core_base_address + SDIO_INT_HOST_MASK, I_HMB_SW_MASK).await; - self.bus + // Set up the interrupt mask and enable interrupts + debug!("bluetooth setup interrupt mask"); + self.bus.bp_write32(CHIP.sdiod_core_base_address + SDIO_INT_HOST_MASK, I_HMB_FC_CHANGE).await; + + // TODO: turn interrupts on here or in bus.init()? + /*self.bus .write16(FUNC_BUS, REG_BUS_INTERRUPT_ENABLE, IRQ_F2_PACKET_AVAILABLE) - .await; + .await;*/ // "Lower F2 Watermark to avoid DMA Hang in F2 when SD Clock is stopped." // Sounds scary... self.bus - .write8(FUNC_BACKPLANE, REG_BACKPLANE_FUNCTION2_WATERMARK, 32) + .write8(FUNC_BACKPLANE, REG_BACKPLANE_FUNCTION2_WATERMARK, SPI_F2_WATERMARK) .await; - // wait for wifi startup - debug!("waiting for wifi init..."); + // wait for F2 to be ready + debug!("waiting for F2 to be ready..."); while self.bus.read32(FUNC_BUS, REG_BUS_STATUS).await & STATUS_F2_RX_READY == 0 {} // Some random configs related to sleep. @@ -153,14 +182,15 @@ where */ // clear pulls + debug!("clear pad pulls"); self.bus.write8(FUNC_BACKPLANE, REG_BACKPLANE_PULL_UP, 0).await; let _ = self.bus.read8(FUNC_BACKPLANE, REG_BACKPLANE_PULL_UP).await; // start HT clock - //self.bus.write8(FUNC_BACKPLANE, REG_BACKPLANE_CHIP_CLOCK_CSR, 0x10).await; - //debug!("waiting for HT clock..."); - //while self.bus.read8(FUNC_BACKPLANE, REG_BACKPLANE_CHIP_CLOCK_CSR).await & 0x80 == 0 {} - //debug!("clock ok"); + self.bus.write8(FUNC_BACKPLANE, REG_BACKPLANE_CHIP_CLOCK_CSR, 0x10).await; // SBSDIO_HT_AVAIL_REQ + debug!("waiting for HT clock..."); + while self.bus.read8(FUNC_BACKPLANE, REG_BACKPLANE_CHIP_CLOCK_CSR).await & 0x80 == 0 {} + debug!("clock ok"); #[cfg(feature = "firmware-logs")] self.log_init().await; diff --git a/examples/rp/src/bin/wifi_blinky.rs b/examples/rp/src/bin/wifi_blinky.rs index 33d43788..17582e98 100644 --- a/examples/rp/src/bin/wifi_blinky.rs +++ b/examples/rp/src/bin/wifi_blinky.rs @@ -32,6 +32,7 @@ async fn wifi_task( async fn main(spawner: Spawner) { let p = embassy_rp::init(Default::default()); let fw = include_bytes!("../../../../cyw43-firmware/43439A0.bin"); + let bt_fw = include_bytes!("../../../../cyw43-firmware/43439A0_btfw.bin"); let clm = include_bytes!("../../../../cyw43-firmware/43439A0_clm.bin"); // To make flashing faster for development, you may want to flash the firmwares independently @@ -47,7 +48,7 @@ async fn main(spawner: Spawner) { let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p.PIN_24, p.PIN_29, p.DMA_CH0); let state = make_static!(cyw43::State::new()); - let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; + let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw, bt_fw).await; unwrap!(spawner.spawn(wifi_task(runner))); control.init(clm).await;