#include "io.h" #include "fb.h" // UART0 enum { ARM_UART0_BASE = PERIPHERAL_BASE + 0x201000, ARM_UART0_DR = ARM_UART0_BASE + 0x00, ARM_UART0_FR = ARM_UART0_BASE + 0x18, ARM_UART0_IBRD = ARM_UART0_BASE + 0x24, ARM_UART0_FBRD = ARM_UART0_BASE + 0x28, ARM_UART0_LCRH = ARM_UART0_BASE + 0x2C, ARM_UART0_CR = ARM_UART0_BASE + 0x30, ARM_UART0_IFLS = ARM_UART0_BASE + 0x34, ARM_UART0_IMSC = ARM_UART0_BASE + 0x38, ARM_UART0_RIS = ARM_UART0_BASE + 0x3C, ARM_UART0_MIS = ARM_UART0_BASE + 0x40, ARM_UART0_ICR = ARM_UART0_BASE + 0x44 }; unsigned char lo(unsigned int val) { return (unsigned char)(val & 0xff); } unsigned char hi(unsigned int val) { return (unsigned char)((val & 0xff00) >> 8); } unsigned int bt_isReadByteReady() { return (!(mmio_read(ARM_UART0_FR) & 0x10)); } unsigned char bt_readByte() { unsigned char ch = lo(mmio_read(ARM_UART0_DR)); return ch; } unsigned char bt_waitReadByte() { while (!bt_isReadByteReady()); return bt_readByte(); } void bt_writeByte(char byte) { while ((mmio_read(ARM_UART0_FR) & 0x20) != 0); mmio_write(ARM_UART0_DR, (unsigned int)byte); } void bt_flushrx() { while (bt_isReadByteReady()) bt_readByte(); } void bt_init() { gpio_useAsAlt3(30); gpio_useAsAlt3(31); gpio_useAsAlt3(32); gpio_useAsAlt3(33); bt_flushrx(); mmio_write(ARM_UART0_IMSC, 0x00); mmio_write(ARM_UART0_ICR, 0x7ff); mmio_write(ARM_UART0_IBRD, 0x1a); mmio_write(ARM_UART0_FBRD, 0x03); mmio_write(ARM_UART0_IFLS, 0x08); mmio_write(ARM_UART0_LCRH, 0x70); mmio_write(ARM_UART0_CR, 0xB01); mmio_write(ARM_UART0_IMSC, 0x430); wait_msec(0x100000); } // HOST SETUP enum { OGF_HOST_CONTROL = 0x03, OGF_LE_CONTROL = 0x08, OGF_VENDOR = 0x3f, COMMAND_SET_BDADDR = 0x01, COMMAND_RESET_CHIP = 0x03, COMMAND_SET_BAUD = 0x18, COMMAND_LOAD_FIRMWARE = 0x2e, HCI_COMMAND_PKT = 0x01, HCI_ACL_PKT = 0x02, HCI_EVENT_PKT = 0x04, COMMAND_COMPLETE_CODE = 0x0e, CONNECT_COMPLETE_CODE = 0x0f, LL_SCAN_ACTIVE = 0x01, LL_ADV_NONCONN_IND = 0x03 }; int hciCommandBytes(unsigned char *opcodebytes, volatile unsigned char *data, unsigned char length) { unsigned char c=0; bt_writeByte(HCI_COMMAND_PKT); bt_writeByte(opcodebytes[0]); bt_writeByte(opcodebytes[1]); bt_writeByte(length); while (c++