part7 now completely working

This commit is contained in:
Adam Greenwood-Byrne 2021-02-08 13:51:20 +00:00
parent f33240cb96
commit 70c0c85c67
6 changed files with 145 additions and 60 deletions

View file

@ -1,7 +1,7 @@
CFILES = $(wildcard *.c)
OFILES = $(CFILES:.c=.o)
LLVMPATH = /opt/homebrew/opt/llvm/bin
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd
GCCFLAGS = -Wall -O0 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd
all: clean kernel8.img

View file

@ -350,15 +350,23 @@ void connect(unsigned char *addr)
float BleGranularity = 1.25;
unsigned int p = BleScanInterval / BleScanDivisor;
unsigned char lp = lo(p);
unsigned char hp = hi(p);
unsigned int q = BleScanWindow / BleScanDivisor;
unsigned char lq = lo(q);
unsigned char hq = hi(q);
unsigned int min_interval = connMinFreq / BleGranularity;
unsigned char lmini = lo(min_interval);
unsigned char hmini = hi(min_interval);
unsigned int max_interval = connMaxFreq / BleGranularity;
unsigned char lmaxi = lo(max_interval);
unsigned char hmaxi = hi(max_interval);
params[0] = lo(p);
params[1] = hi(p);
params[2] = lo(q);
params[3] = hi(q);
params[0] = lp;
params[1] = hp;
params[2] = lq;
params[3] = hq;
params[4] = 0;
params[5] = 0;
params[6] = addr[5];
@ -368,10 +376,10 @@ void connect(unsigned char *addr)
params[10] = addr[1];
params[11] = addr[0];
params[12] = 0;
params[13] = lo(min_interval);
params[14] = hi(min_interval);
params[15] = lo(max_interval);
params[16] = hi(max_interval);
params[13] = lmini;
params[14] = hmini;
params[15] = lmaxi;
params[16] = hmaxi;
params[17] = 0;
params[18] = 0;
params[19] = 0x2a;
@ -380,5 +388,6 @@ void connect(unsigned char *addr)
params[22] = 0;
params[23] = 0;
params[24] = 0;
if (hciCommand(OGF_LE_CONTROL, 0x0d, params, 25)) uart_writeText("createLEconnection failed\n");
}

View file

@ -5,6 +5,9 @@
unsigned int width, height, pitch, isrgb;
unsigned char *fb;
int curx = 0;
int cury = 0;
void fb_init()
{
mbox[0] = 35*4; // Length of message in bytes
@ -211,3 +214,47 @@ void wait_msec(unsigned int n)
t+=((f/1000)*n)/1000;
do{asm volatile ("mrs %0, cntpct_el0" : "=r"(r));}while(r<t);
}
int strlen(const char *str) {
const char *s;
for (s = str; *s; ++s);
return (s - str);
}
void debugstr(char *str) {
if (curx + (strlen(str) * 8) >= 1920) {
curx = 0; cury += 8;
}
if (cury + 8 >= 1080) {
cury = 0;
}
drawString(curx, cury, str, 0x0f, 1);
curx += (strlen(str) * 8);
}
void debugcrlf(void) {
curx = 0; cury += 8;
}
void debugch(unsigned char b) {
unsigned int n;
int c;
for(c=4;c>=0;c-=4) {
n=(b>>c)&0xF;
n+=n>9?0x37:0x30;
debugstr((char *)&n);
}
debugstr(" ");
}
void debughex(unsigned int d) {
unsigned int n;
int c;
for(c=28;c>=0;c-=4) {
n=(d>>c)&0xF;
n+=n>9?0x37:0x30;
debugstr((char *)&n);
}
debugstr(" ");
}

View file

@ -7,3 +7,7 @@ void drawCircle(int x0, int y0, int radius, unsigned char attr, int fill);
void drawLine(int x1, int y1, int x2, int y2, unsigned char attr);
void moveRect(int oldx, int oldy, int width, int height, int shiftx, int shifty, unsigned char attr);
void wait_msec(unsigned int n);
void debugstr(char *str);
void debugcrlf(void);
void debugch(unsigned char b);
void debughex(unsigned int d);

View file

@ -1,5 +1,5 @@
#define PERIPHERAL_BASE 0xFE000000
#define SAFE_ADDRESS 0x02100000 // Somewhere safe to store a lot of data
#define SAFE_ADDRESS 0x00210000 // Somewhere safe to store a lot of data
void uart_init();
void uart_writeText(char *buffer);

View file

@ -2,9 +2,6 @@
#include "bt.h"
#include "fb.h"
int curx = 0;
int cury = 0;
#define MAX_MSG_LEN 50
#define MAX_READ_RUN 100
@ -25,12 +22,8 @@ unsigned int got_echo_sid = 0;
unsigned int got_echo_name = 0;
unsigned char echo_addr[6];
int strlen(const char *str) {
const char *s;
for (s = str; *s; ++s);
return (s - str);
}
unsigned int connected = 0;
unsigned int connection_handle = 0;
int memcmp(const char *str1, const char *str2, int count) {
const char *s1 = (const char*)str1;
@ -42,43 +35,6 @@ int memcmp(const char *str1, const char *str2, int count) {
return 0;
}
void debugstr(char *str) {
if (curx + (strlen(str) * 8) >= 1920) {
curx = 0; cury += 8;
}
if (cury + 8 >= 1080) {
cury = 0;
}
drawString(curx, cury, str, 0x0f, 1);
curx += (strlen(str) * 8);
}
void debugcrlf(void) {
curx = 0; cury += 8;
}
void debugch(unsigned char b) {
unsigned int n;
int c;
for(c=4;c>=0;c-=4) {
n=(b>>c)&0xF;
n+=n>9?0x37:0x30;
debugstr((char *)&n);
}
debugstr(" ");
}
void debughex(unsigned int d) {
unsigned int n;
int c;
for(c=28;c>=0;c-=4) {
n=(d>>c)&0xF;
n+=n>9?0x37:0x30;
debugstr((char *)&n);
}
debugstr(" ");
}
void hci_poll2(unsigned char byte)
{
switch (poll_state) {
@ -175,22 +131,91 @@ void bt_search(void) {
}
}
void bt_conn()
{
unsigned char *buf;
while ( (buf = hci_poll()) ) {
if (data_len >= 2) {
if (buf[0] == LE_CONNECT_CODE && !connected) {
connected = !buf[1];
debughex(connected); debugstr(" ");
connection_handle = buf[2] | (buf[3] << 8);
debughex(connection_handle); debugstr(" ");
}
}
}
}
void acl_poll()
{
while (bt_isReadByteReady()) {
unsigned char byte = bt_readByte();
if (byte == HCI_EVENT_PKT) {
bt_waitReadByte(); // opcode
unsigned char length = bt_waitReadByte();
for (int i=0;i<length;i++) bt_waitReadByte();
} else if (byte == HCI_ACL_PKT) {
bt_waitReadByte(); // handle1
bt_waitReadByte(); // handle2
unsigned char h1 = bt_waitReadByte();
unsigned char h2 = bt_waitReadByte();
unsigned int dlen = h1 | (h2 << 8);
unsigned char data[dlen];
if (dlen > 7) {
for (int i=0;i<dlen;i++) data[i] = bt_waitReadByte();
unsigned int length = data[0] | (data[1] << 8);
unsigned int channel = data[2] | (data[3] << 8);
unsigned char opcode = data[4];
if (length == 4 && opcode == 0x1b) {
if (channel == 4 && data[5] == 0x2a && data[6] == 0x00) {
debugcrlf();
debugstr("Got ACL packet... ");
debugch(data[7]);
}
}
}
}
}
}
void run_search(void) {
// Start scanning for echo
// Start scanning
debugstr("Setting event mask... ");
setLEeventmask(0xff);
debugstr("Starting scanning... ");
startActiveScanning();
// Enter an infinite loop
debugstr("Going loopy...");
// Search for the echo
debugstr("Waiting...");
debugcrlf();
while (!(got_echo_sid && got_echo_name)) bt_search();
stopScanning();
for (int c=0;c<=5;c++) debugch(echo_addr[c]);
debugcrlf();
// Connecting to echo
debugstr("Connecting to echo: ");
connect(echo_addr);
while (!connected) bt_conn();
debugstr("Connected!");
debugcrlf();
// Get the characteristic value
debugstr("Sending read request: ");
debughex(connection_handle); debugcrlf();
sendACLsubscribe(connection_handle);
// Enter an infinite loop
debugstr("Going loopy...");
while (1) {
acl_poll();
uart_update();
}
}