mirror of
https://github.com/isometimes/rpi4-osdev
synced 2024-11-22 02:00:40 +00:00
part7 now completely working
This commit is contained in:
parent
f33240cb96
commit
70c0c85c67
6 changed files with 145 additions and 60 deletions
|
@ -1,7 +1,7 @@
|
||||||
CFILES = $(wildcard *.c)
|
CFILES = $(wildcard *.c)
|
||||||
OFILES = $(CFILES:.c=.o)
|
OFILES = $(CFILES:.c=.o)
|
||||||
LLVMPATH = /opt/homebrew/opt/llvm/bin
|
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
|
all: clean kernel8.img
|
||||||
|
|
||||||
|
|
|
@ -350,15 +350,23 @@ void connect(unsigned char *addr)
|
||||||
float BleGranularity = 1.25;
|
float BleGranularity = 1.25;
|
||||||
|
|
||||||
unsigned int p = BleScanInterval / BleScanDivisor;
|
unsigned int p = BleScanInterval / BleScanDivisor;
|
||||||
|
unsigned char lp = lo(p);
|
||||||
|
unsigned char hp = hi(p);
|
||||||
unsigned int q = BleScanWindow / BleScanDivisor;
|
unsigned int q = BleScanWindow / BleScanDivisor;
|
||||||
|
unsigned char lq = lo(q);
|
||||||
|
unsigned char hq = hi(q);
|
||||||
|
|
||||||
unsigned int min_interval = connMinFreq / BleGranularity;
|
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 int max_interval = connMaxFreq / BleGranularity;
|
||||||
|
unsigned char lmaxi = lo(max_interval);
|
||||||
|
unsigned char hmaxi = hi(max_interval);
|
||||||
|
|
||||||
params[0] = lo(p);
|
params[0] = lp;
|
||||||
params[1] = hi(p);
|
params[1] = hp;
|
||||||
params[2] = lo(q);
|
params[2] = lq;
|
||||||
params[3] = hi(q);
|
params[3] = hq;
|
||||||
params[4] = 0;
|
params[4] = 0;
|
||||||
params[5] = 0;
|
params[5] = 0;
|
||||||
params[6] = addr[5];
|
params[6] = addr[5];
|
||||||
|
@ -368,10 +376,10 @@ void connect(unsigned char *addr)
|
||||||
params[10] = addr[1];
|
params[10] = addr[1];
|
||||||
params[11] = addr[0];
|
params[11] = addr[0];
|
||||||
params[12] = 0;
|
params[12] = 0;
|
||||||
params[13] = lo(min_interval);
|
params[13] = lmini;
|
||||||
params[14] = hi(min_interval);
|
params[14] = hmini;
|
||||||
params[15] = lo(max_interval);
|
params[15] = lmaxi;
|
||||||
params[16] = hi(max_interval);
|
params[16] = hmaxi;
|
||||||
params[17] = 0;
|
params[17] = 0;
|
||||||
params[18] = 0;
|
params[18] = 0;
|
||||||
params[19] = 0x2a;
|
params[19] = 0x2a;
|
||||||
|
@ -380,5 +388,6 @@ void connect(unsigned char *addr)
|
||||||
params[22] = 0;
|
params[22] = 0;
|
||||||
params[23] = 0;
|
params[23] = 0;
|
||||||
params[24] = 0;
|
params[24] = 0;
|
||||||
|
|
||||||
if (hciCommand(OGF_LE_CONTROL, 0x0d, params, 25)) uart_writeText("createLEconnection failed\n");
|
if (hciCommand(OGF_LE_CONTROL, 0x0d, params, 25)) uart_writeText("createLEconnection failed\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
unsigned int width, height, pitch, isrgb;
|
unsigned int width, height, pitch, isrgb;
|
||||||
unsigned char *fb;
|
unsigned char *fb;
|
||||||
|
|
||||||
|
int curx = 0;
|
||||||
|
int cury = 0;
|
||||||
|
|
||||||
void fb_init()
|
void fb_init()
|
||||||
{
|
{
|
||||||
mbox[0] = 35*4; // Length of message in bytes
|
mbox[0] = 35*4; // Length of message in bytes
|
||||||
|
@ -211,3 +214,47 @@ void wait_msec(unsigned int n)
|
||||||
t+=((f/1000)*n)/1000;
|
t+=((f/1000)*n)/1000;
|
||||||
do{asm volatile ("mrs %0, cntpct_el0" : "=r"(r));}while(r<t);
|
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(" ");
|
||||||
|
}
|
||||||
|
|
|
@ -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 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 moveRect(int oldx, int oldy, int width, int height, int shiftx, int shifty, unsigned char attr);
|
||||||
void wait_msec(unsigned int n);
|
void wait_msec(unsigned int n);
|
||||||
|
void debugstr(char *str);
|
||||||
|
void debugcrlf(void);
|
||||||
|
void debugch(unsigned char b);
|
||||||
|
void debughex(unsigned int d);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#define PERIPHERAL_BASE 0xFE000000
|
#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_init();
|
||||||
void uart_writeText(char *buffer);
|
void uart_writeText(char *buffer);
|
||||||
|
|
|
@ -2,9 +2,6 @@
|
||||||
#include "bt.h"
|
#include "bt.h"
|
||||||
#include "fb.h"
|
#include "fb.h"
|
||||||
|
|
||||||
int curx = 0;
|
|
||||||
int cury = 0;
|
|
||||||
|
|
||||||
#define MAX_MSG_LEN 50
|
#define MAX_MSG_LEN 50
|
||||||
#define MAX_READ_RUN 100
|
#define MAX_READ_RUN 100
|
||||||
|
|
||||||
|
@ -25,12 +22,8 @@ unsigned int got_echo_sid = 0;
|
||||||
unsigned int got_echo_name = 0;
|
unsigned int got_echo_name = 0;
|
||||||
unsigned char echo_addr[6];
|
unsigned char echo_addr[6];
|
||||||
|
|
||||||
int strlen(const char *str) {
|
unsigned int connected = 0;
|
||||||
const char *s;
|
unsigned int connection_handle = 0;
|
||||||
|
|
||||||
for (s = str; *s; ++s);
|
|
||||||
return (s - str);
|
|
||||||
}
|
|
||||||
|
|
||||||
int memcmp(const char *str1, const char *str2, int count) {
|
int memcmp(const char *str1, const char *str2, int count) {
|
||||||
const char *s1 = (const char*)str1;
|
const char *s1 = (const char*)str1;
|
||||||
|
@ -42,43 +35,6 @@ int memcmp(const char *str1, const char *str2, int count) {
|
||||||
return 0;
|
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)
|
void hci_poll2(unsigned char byte)
|
||||||
{
|
{
|
||||||
switch (poll_state) {
|
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) {
|
void run_search(void) {
|
||||||
// Start scanning for echo
|
// Start scanning
|
||||||
debugstr("Setting event mask... ");
|
debugstr("Setting event mask... ");
|
||||||
setLEeventmask(0xff);
|
setLEeventmask(0xff);
|
||||||
debugstr("Starting scanning... ");
|
debugstr("Starting scanning... ");
|
||||||
startActiveScanning();
|
startActiveScanning();
|
||||||
|
|
||||||
// Enter an infinite loop
|
// Search for the echo
|
||||||
debugstr("Going loopy...");
|
debugstr("Waiting...");
|
||||||
debugcrlf();
|
debugcrlf();
|
||||||
|
|
||||||
while (!(got_echo_sid && got_echo_name)) bt_search();
|
while (!(got_echo_sid && got_echo_name)) bt_search();
|
||||||
stopScanning();
|
stopScanning();
|
||||||
for (int c=0;c<=5;c++) debugch(echo_addr[c]);
|
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) {
|
while (1) {
|
||||||
|
acl_poll();
|
||||||
uart_update();
|
uart_update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue