mirror of
https://github.com/isometimes/rpi4-osdev
synced 2024-11-24 19:20:40 +00:00
Migrating to clang for native builds on MBP M1 - parts1-6 working, part7 incomplete, part8 untouched
This commit is contained in:
parent
46b197dbe5
commit
072b5453b4
17 changed files with 267 additions and 283 deletions
|
@ -1,19 +1,19 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
LLVMPATH = /opt/homebrew/opt/llvm/bin
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES)
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
$(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
||||
|
|
19
part2-building/Makefile.gcc
Normal file
19
part2-building/Makefile.gcc
Normal file
|
@ -0,0 +1,19 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES)
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
|
@ -1,19 +1,19 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
LLVMPATH = /opt/homebrew/opt/llvm/bin
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES)
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
$(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
||||
|
|
19
part3-helloworld/Makefile.gcc
Normal file
19
part3-helloworld/Makefile.gcc
Normal file
|
@ -0,0 +1,19 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES)
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
|
@ -1,19 +1,19 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
LLVMPATH = /opt/homebrew/opt/llvm/bin
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES)
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
$(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
||||
|
|
19
part4-miniuart/Makefile.gcc
Normal file
19
part4-miniuart/Makefile.gcc
Normal file
|
@ -0,0 +1,19 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES)
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
|
@ -1,19 +1,19 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
LLVMPATH = /opt/homebrew/opt/llvm/bin
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES)
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
$(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
||||
|
|
19
part5-framebuffer/Makefile.gcc
Normal file
19
part5-framebuffer/Makefile.gcc
Normal file
|
@ -0,0 +1,19 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES)
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
|
@ -1,19 +1,19 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
LLVMPATH = /opt/homebrew/opt/llvm/bin
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES)
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
$(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
||||
|
|
19
part6-breakout/Makefile.gcc
Normal file
19
part6-breakout/Makefile.gcc
Normal file
|
@ -0,0 +1,19 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES)
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
|
@ -147,8 +147,8 @@ void uart_writeByteBlocking(unsigned char ch) {
|
|||
|
||||
void uart_writeText(char *buffer) {
|
||||
while (*buffer) {
|
||||
if (*buffer == '\n') uart_writeByteBlocking('\r');
|
||||
uart_writeByteBlocking(*buffer++);
|
||||
if (*buffer == '\n') uart_writeByteBlockingActual('\r');
|
||||
uart_writeByteBlockingActual(*buffer++);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -35,8 +35,10 @@ enum {
|
|||
OBJ_BALL = 3
|
||||
};
|
||||
|
||||
#define OBJS_ADDRESS 0x02100000 // Somewhere safe to store a lot of data
|
||||
|
||||
unsigned int numobjs = 0;
|
||||
struct Object objects[(ROWS * COLS) + (2 * NUM_LIVES)];
|
||||
struct Object *objects = (struct Object *)OBJS_ADDRESS;
|
||||
struct Object *ball;
|
||||
struct Object *paddle;
|
||||
|
||||
|
@ -149,13 +151,10 @@ void drawScoreboard(int score, int lives)
|
|||
char tens = score / 10; score -= (10 * tens);
|
||||
char ones = score;
|
||||
|
||||
char string[] = "Score: 0xx Lives: x\0\0";
|
||||
|
||||
string[8] = tens + 0x30;
|
||||
string[9] = ones + 0x30;
|
||||
string[20] = (char)lives + 0x30;
|
||||
|
||||
drawString((WIDTH/2)-252, MARGIN-25, string, 0x0f, 3);
|
||||
drawString((WIDTH/2)-252, MARGIN-25, "Score: 0 Lives: ", 0x0f, 3);
|
||||
drawChar(tens + 0x30, (WIDTH/2)-252 + (8*8*3), MARGIN-25, 0x0f, 3);
|
||||
drawChar(ones + 0x30, (WIDTH/2)-252 + (8*9*3), MARGIN-25, 0x0f, 3);
|
||||
drawChar((char)lives + 0x30, (WIDTH/2)-252 + (8*20*3), MARGIN-25, 0x0f, 3);
|
||||
}
|
||||
|
||||
void main()
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
LLVMPATH = /opt/homebrew/opt/llvm/bin
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
BCM4345C0.o : BCM4345C0.hcd
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@
|
||||
$(LLVMPATH)/llvm-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
clang --target=aarch64-elf $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES) BCM4345C0.o
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) BCM4345C0.o -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
$(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) BCM4345C0.o -T link.ld -o kernel8.elf
|
||||
$(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
||||
|
|
22
part7-bluetooth/Makefile.gcc
Normal file
22
part7-bluetooth/Makefile.gcc
Normal file
|
@ -0,0 +1,22 @@
|
|||
CFILES = $(wildcard *.c)
|
||||
OFILES = $(CFILES:.c=.o)
|
||||
GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles
|
||||
GCCPATH = ../../gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin
|
||||
|
||||
all: clean kernel8.img
|
||||
|
||||
boot.o: boot.S
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o
|
||||
|
||||
BCM4345C0.o : BCM4345C0.hcd
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@
|
||||
|
||||
%.o: %.c
|
||||
$(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@
|
||||
|
||||
kernel8.img: boot.o $(OFILES) BCM4345C0.o
|
||||
$(GCCPATH)/aarch64-none-elf-ld -nostdlib -nostartfiles boot.o $(OFILES) BCM4345C0.o -T link.ld -o kernel8.elf
|
||||
$(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img
|
||||
|
||||
clean:
|
||||
/bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true
|
|
@ -1,6 +1,8 @@
|
|||
#include "io.h"
|
||||
#include "fb.h"
|
||||
|
||||
unsigned char *params = (unsigned char *)SAFE_ADDRESS;
|
||||
|
||||
// UART0
|
||||
|
||||
enum {
|
||||
|
@ -151,11 +153,12 @@ void bt_loadfirmware()
|
|||
unsigned int size = (long)&_binary_BCM4345C0_hcd_size;
|
||||
|
||||
while (c < size) {
|
||||
unsigned char opcodebytes[] = { _binary_BCM4345C0_hcd_start[c], _binary_BCM4345C0_hcd_start[c+1] };
|
||||
params[0] = _binary_BCM4345C0_hcd_start[c];
|
||||
params[1] = _binary_BCM4345C0_hcd_start[c+1];
|
||||
unsigned char length = _binary_BCM4345C0_hcd_start[c+2];
|
||||
unsigned char *data = &(_binary_BCM4345C0_hcd_start[c+3]);
|
||||
|
||||
if (hciCommandBytes(opcodebytes, data, length)) {
|
||||
if (hciCommandBytes(params, data, length)) {
|
||||
uart_writeText("Firmware data load failed\n");
|
||||
break;
|
||||
}
|
||||
|
@ -167,13 +170,23 @@ void bt_loadfirmware()
|
|||
|
||||
void bt_setbaud()
|
||||
{
|
||||
static unsigned char params[] = { 0, 0, 0x00, 0xc2, 0x01, 0x00 }; // little endian, 115200
|
||||
params[0] = 0;
|
||||
params[1] = 0;
|
||||
params[2] = 0x00;
|
||||
params[3] = 0xc2;
|
||||
params[4] = 0x01;
|
||||
params[5] = 0x00; // little endian, 115200
|
||||
if (hciCommand(OGF_VENDOR, COMMAND_SET_BAUD, params, 6)) uart_writeText("bt_setbaud() failed\n");
|
||||
}
|
||||
|
||||
void bt_setbdaddr()
|
||||
{
|
||||
static unsigned char params[] = { 0xee, 0xff, 0xc0, 0xee, 0xff, 0xc0 }; // reversed
|
||||
params[0] = 0xee;
|
||||
params[1] = 0xff;
|
||||
params[2] = 0xc0;
|
||||
params[3] = 0xee;
|
||||
params[4] = 0xff;
|
||||
params[5] = 0xc0; // reversed
|
||||
if (hciCommand(OGF_VENDOR, COMMAND_SET_BDADDR, params, 6)) uart_writeText("bt_setbdaddr() failed\n");
|
||||
}
|
||||
|
||||
|
@ -213,7 +226,11 @@ void sendACLsubscribe(unsigned int handle)
|
|||
bt_writeByte(lo(channel));
|
||||
bt_writeByte(hi(channel));
|
||||
|
||||
unsigned char params[] = { 0x12, 0x2b, 0x00, 0x01, 0x00 };
|
||||
params[0] = 0x12;
|
||||
params[1] = 0x2b;
|
||||
params[2] = 0x00;
|
||||
params[3] = 0x01;
|
||||
params[4] = 0x00;
|
||||
|
||||
unsigned int c=0;
|
||||
while (c++<data_length) bt_writeByte(params[c-1]);
|
||||
|
@ -221,51 +238,74 @@ void sendACLsubscribe(unsigned int handle)
|
|||
|
||||
void setLEeventmask(unsigned char mask)
|
||||
{
|
||||
unsigned char params[] = { mask, 0, 0, 0, 0, 0, 0, 0 };
|
||||
params[0] = mask;
|
||||
params[1] = 0;
|
||||
params[2] = 0;
|
||||
params[3] = 0;
|
||||
params[4] = 0;
|
||||
params[5] = 0;
|
||||
params[6] = 0;
|
||||
params[7] = 0;
|
||||
if (hciCommand(OGF_LE_CONTROL, 0x01, params, 8)) uart_writeText("setLEeventmask failed\n");
|
||||
}
|
||||
|
||||
void setLEscanenable(unsigned char state, unsigned char duplicates) {
|
||||
unsigned char params[] = { state, duplicates };
|
||||
params[0] = state;
|
||||
params[1] = duplicates;
|
||||
if (hciCommand(OGF_LE_CONTROL, 0x0c, params, 2)) uart_writeText(" setLEscanenable failed\n");
|
||||
}
|
||||
|
||||
void setLEscanparameters(unsigned char type, unsigned char linterval, unsigned char hinterval, unsigned char lwindow, unsigned char hwindow, unsigned char own_address_type, unsigned char filter_policy) {
|
||||
unsigned char params[] = { type, linterval, hinterval, lwindow, hwindow, own_address_type, filter_policy };
|
||||
params[0] = type;
|
||||
params[1] = linterval;
|
||||
params[2] = hinterval;
|
||||
params[3] = lwindow;
|
||||
params[4] = hwindow;
|
||||
params[5] = own_address_type;
|
||||
params[6] = filter_policy;
|
||||
if (hciCommand(OGF_LE_CONTROL, 0x0b, params, 7)) uart_writeText("setLEscanparameters failed\n");
|
||||
}
|
||||
|
||||
void setLEadvertenable(unsigned char state) {
|
||||
unsigned char params[] = { state };
|
||||
uart_writeText("doing the HCIcommand\n");
|
||||
params[0] = state;
|
||||
if (hciCommand(OGF_LE_CONTROL, 0x0a, params, 1)) uart_writeText("setLEadvertenable failed\n");
|
||||
}
|
||||
|
||||
void setLEadvertparameters(unsigned char type, unsigned char linterval_min, unsigned char hinterval_min, unsigned char linterval_max, unsigned char hinterval_max, unsigned char own_address_type, unsigned char filter_policy) {
|
||||
unsigned char params[16] = { linterval_min, hinterval_min, linterval_max, hinterval_max, type, own_address_type, 0, 0, 0, 0, 0, 0, 0, 0x07, filter_policy };
|
||||
uart_writeText("doing the HCIcommand\n");
|
||||
params[0] = linterval_min;
|
||||
params[1] = hinterval_min;
|
||||
params[2] = linterval_max;
|
||||
params[3] = hinterval_max;
|
||||
params[4] = type;
|
||||
params[5] = own_address_type;
|
||||
params[6] = 0;
|
||||
params[7] = 0;
|
||||
params[8] = 0;
|
||||
params[9] = 0;
|
||||
params[10] = 0;
|
||||
params[11] = 0;
|
||||
params[12] = 0;
|
||||
params[13] = 0x07;
|
||||
params[14] = filter_policy;
|
||||
if (hciCommand(OGF_LE_CONTROL, 0x06, params, 15)) uart_writeText("setLEadvertparameters failed\n");
|
||||
}
|
||||
|
||||
void setLEadvertdata() {
|
||||
static unsigned char params[] = { 0x19,
|
||||
0x02, 0x01, 0x06,
|
||||
0x03, 0x03, 0xAA, 0xFE,
|
||||
0x11, 0x16, 0xAA, 0xFE, 0x10, 0x00, 0x03, 0x69, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x69, 0x6d, 0x2e, 0x65, 0x73,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
params[0] = 0x19;
|
||||
params[1] = 0x02; params[2] = 0x01; params[3] = 0x06;
|
||||
params[4] = 0x03; params[5] = 0x03; params[6] = 0xAA; params[7] = 0xFE;
|
||||
params[8] = 0x11; params[9] = 0x16; params[10] = 0xAA; params[11] = 0xFE; params[12] = 0x10; params[13] = 0x00; params[14] = 0x03;
|
||||
params[15] = 0x69; params[16] = 0x73; params[17] = 0x6f; params[18] = 0x6d; params[19] = 0x65; params[20] = 0x74; params[21] = 0x69; params[22] = 0x6d;
|
||||
params[23] = 0x2e; params[24] = 0x65; params[25] = 0x73;
|
||||
params[26] = 0x00;
|
||||
params[27] = 0x00;
|
||||
params[28] = 0x00;
|
||||
params[29] = 0x00;
|
||||
params[30] = 0x00;
|
||||
params[31] = 0x00;
|
||||
if (hciCommand(OGF_LE_CONTROL, 0x08, params, 32)) uart_writeText("setLEadvertdata failed\n");
|
||||
}
|
||||
|
||||
void createLEconnection(unsigned char a1, unsigned char a2, unsigned char a3, unsigned char a4, unsigned char a5, unsigned char a6, unsigned char linterval, unsigned char hinterval, unsigned char lwindow, unsigned char hwindow, unsigned char own_address_type, unsigned char filter_policy, unsigned char linterval_min, unsigned char hinterval_min, unsigned char linterval_max, unsigned char hinterval_max) {
|
||||
unsigned char params[26] = { linterval, hinterval, lwindow, hwindow,
|
||||
filter_policy,
|
||||
0, a1, a2, a3, a4, a5, a6,
|
||||
own_address_type,
|
||||
linterval_min, hinterval_min, linterval_max, hinterval_max,
|
||||
0, 0, 0x2a, 0x00, 0, 0, 0, 0 };
|
||||
if (hciCommand(OGF_LE_CONTROL, 0x0d, params, 25)) uart_writeText("createLEconnection failed\n");
|
||||
}
|
||||
|
||||
void stopScanning() {
|
||||
setLEscanenable(0, 0);
|
||||
}
|
||||
|
@ -315,5 +355,30 @@ void connect(unsigned char *addr)
|
|||
unsigned int min_interval = connMinFreq / BleGranularity;
|
||||
unsigned int max_interval = connMaxFreq / BleGranularity;
|
||||
|
||||
createLEconnection(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0], lo(p), hi(p), lo(q), hi(q), 0, 0, lo(min_interval), hi(min_interval), lo(max_interval), hi(max_interval));
|
||||
params[0] = lo(p);
|
||||
params[1] = hi(p);
|
||||
params[2] = lo(q);
|
||||
params[3] = hi(q);
|
||||
params[4] = 0;
|
||||
params[5] = 0;
|
||||
params[6] = addr[5];
|
||||
params[7] = addr[4];
|
||||
params[8] = addr[3];
|
||||
params[9] = addr[2];
|
||||
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[17] = 0;
|
||||
params[18] = 0;
|
||||
params[19] = 0x2a;
|
||||
params[20] = 0x00;
|
||||
params[21] = 0;
|
||||
params[22] = 0;
|
||||
params[23] = 0;
|
||||
params[24] = 0;
|
||||
if (hciCommand(OGF_LE_CONTROL, 0x0d, params, 25)) uart_writeText("createLEconnection failed\n");
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#define PERIPHERAL_BASE 0xFE000000
|
||||
#define SAFE_ADDRESS 0x02100000 // Somewhere safe to store a lot of data
|
||||
|
||||
void uart_init();
|
||||
void uart_writeText(char *buffer);
|
||||
|
|
|
@ -1,202 +1,19 @@
|
|||
#include "io.h"
|
||||
#include "bt.h"
|
||||
|
||||
#define memcmp __builtin_memcmp
|
||||
|
||||
#define MAX_MSG_LEN 50
|
||||
#define MAX_READ_RUN 100
|
||||
|
||||
unsigned char data_buf[MAX_MSG_LEN];
|
||||
unsigned int data_len;
|
||||
unsigned int messages_received = 0;
|
||||
unsigned int poll_state = 0;
|
||||
|
||||
enum {
|
||||
LE_EVENT_CODE = 0x3e,
|
||||
LE_CONNECT_CODE = 0x01,
|
||||
LE_ADREPORT_CODE = 0x02,
|
||||
HCI_ACL_PKT = 0x02,
|
||||
HCI_EVENT_PKT = 0x04
|
||||
};
|
||||
|
||||
unsigned int got_echo_sid = 0;
|
||||
unsigned int got_echo_name = 0;
|
||||
unsigned char echo_addr[6];
|
||||
|
||||
unsigned int connected = 0;
|
||||
unsigned int connection_handle = 0;
|
||||
|
||||
void hci_poll2(unsigned char byte)
|
||||
{
|
||||
switch (poll_state) {
|
||||
case 0:
|
||||
if (byte != HCI_EVENT_PKT) poll_state = 0;
|
||||
else poll_state = 1;
|
||||
break;
|
||||
case 1:
|
||||
if (byte != LE_EVENT_CODE) poll_state = 0;
|
||||
else poll_state = 2;
|
||||
break;
|
||||
case 2:
|
||||
if (byte > MAX_MSG_LEN) poll_state = 0;
|
||||
else {
|
||||
poll_state = 3;
|
||||
data_len = byte;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
data_buf[poll_state - 3] = byte;
|
||||
if (poll_state == data_len + 3 - 1) {
|
||||
messages_received++;
|
||||
poll_state = 0;
|
||||
} else poll_state++;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned char *hci_poll()
|
||||
{
|
||||
unsigned int goal = messages_received + 1;
|
||||
|
||||
if (bt_isReadByteReady()) {
|
||||
unsigned int run = 0;
|
||||
|
||||
while (run < MAX_READ_RUN && messages_received < goal && bt_isReadByteReady()) {
|
||||
unsigned char byte = bt_readByte();
|
||||
hci_poll2(byte);
|
||||
run++;
|
||||
}
|
||||
if (run == MAX_READ_RUN) return 0;
|
||||
else return data_buf;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bt_search()
|
||||
{
|
||||
unsigned char *buf;
|
||||
|
||||
while ( (buf = hci_poll()) ) {
|
||||
if (data_len >= 2) {
|
||||
if (buf[0] == LE_ADREPORT_CODE) {
|
||||
unsigned char numreports = buf[1];
|
||||
|
||||
if (numreports == 1) {
|
||||
unsigned char event_type = buf[2];
|
||||
|
||||
if (event_type == 0x00) {
|
||||
unsigned char buf_len = buf[10];
|
||||
unsigned char ad_len = buf[11];
|
||||
|
||||
if (ad_len < data_len && buf_len + 11 == data_len - 1) {
|
||||
for (int c=9;c>=4;c--) echo_addr[9-c] = buf[c];
|
||||
buf += 11;
|
||||
|
||||
got_echo_sid = 0; got_echo_name = 0; // Reset the search state machine
|
||||
do {
|
||||
ad_len = buf[0];
|
||||
unsigned char ad_type = buf[1];
|
||||
buf += 2;
|
||||
|
||||
if (ad_len >= 2) {
|
||||
if (ad_type == 0x03) {
|
||||
unsigned int sid=0;
|
||||
|
||||
for (int d=0;d<ad_len - 1;d+=2) {
|
||||
sid = buf[d] | (buf[d+1] << 8);
|
||||
if (sid == 0xEC00) {
|
||||
uart_hex(sid); uart_writeText(" ");
|
||||
got_echo_sid = 1;
|
||||
}
|
||||
}
|
||||
} else if (ad_type == 0x09) {
|
||||
char remote_name[ad_len - 1];
|
||||
unsigned int d=0;
|
||||
|
||||
while (d<ad_len - 1) {
|
||||
remote_name[d] = buf[d];
|
||||
d++;
|
||||
}
|
||||
if (!memcmp(remote_name,"echo",4)) {
|
||||
uart_writeText(remote_name); uart_writeText(" ");
|
||||
got_echo_name = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buf += ad_len - 1;
|
||||
} while (buf[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void bt_conn()
|
||||
{
|
||||
unsigned char *buf;
|
||||
|
||||
while ( (buf = hci_poll()) ) {
|
||||
if (data_len >= 2) {
|
||||
if (buf[0] == LE_CONNECT_CODE && !connected) {
|
||||
connected = !buf[1];
|
||||
uart_hex(connected); uart_writeText(" ");
|
||||
connection_handle = buf[2] | (buf[3] << 8);
|
||||
uart_hex(connection_handle); uart_writeText(" ");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void acl_poll()
|
||||
{
|
||||
while (bt_isReadByteReady()) {
|
||||
unsigned char byte = bt_readByte();
|
||||
|
||||
if (byte == HCI_EVENT_PKT) {
|
||||
unsigned char opcode = bt_waitReadByte();
|
||||
unsigned char length = bt_waitReadByte();
|
||||
for (int i=0;i<length;i++) bt_waitReadByte();
|
||||
} else if (byte == HCI_ACL_PKT) {
|
||||
unsigned char h1 = bt_waitReadByte();
|
||||
unsigned char h2 = bt_waitReadByte();
|
||||
|
||||
unsigned int handle = h1 | (h2 & 0x0f);
|
||||
unsigned char flags = (h2 & 0xf0) >> 4;
|
||||
|
||||
h1 = bt_waitReadByte();
|
||||
h2 = bt_waitReadByte();
|
||||
|
||||
unsigned int length = h1 | (h2 << 8);
|
||||
unsigned char data[length];
|
||||
|
||||
for (int i=0;i<length;i++) data[i] = bt_waitReadByte();
|
||||
|
||||
length = data[0] | (data[1] << 8);
|
||||
|
||||
unsigned int channel = data[2] | (data[3] << 8);
|
||||
unsigned char opcode = data[4];
|
||||
|
||||
if (opcode == 0x1b) {
|
||||
unsigned int from_handle = data[5] | (data[6] << 8);
|
||||
|
||||
for (int c=0;c<length-3;c++) uart_byte(data[7+c]);
|
||||
uart_writeText("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
uart_init();
|
||||
bt_init();
|
||||
|
||||
uart_writeText("Initialising Bluetooth: ");
|
||||
uart_writeText(">> reset: ");
|
||||
bt_reset();
|
||||
uart_writeText(">> firmware load: ");
|
||||
bt_loadfirmware();
|
||||
uart_writeText(">> set baud: ");
|
||||
bt_setbaud();
|
||||
uart_writeText(">> set bdaddr: ");
|
||||
bt_setbdaddr();
|
||||
|
||||
// Print the BD_ADDR
|
||||
|
@ -205,30 +22,15 @@ void main()
|
|||
for (int c=5;c>=0;c--) uart_byte(local_addr[c]);
|
||||
uart_writeText("\n");
|
||||
|
||||
// Start scanning for echo
|
||||
// Start advertising
|
||||
uart_writeText("Setting event mask... ");
|
||||
setLEeventmask(0xff);
|
||||
startActiveScanning();
|
||||
uart_writeText("Waiting for echo: ");
|
||||
while (!(got_echo_sid && got_echo_name)) bt_search();
|
||||
stopScanning();
|
||||
for (int c=0;c<=5;c++) uart_byte(echo_addr[c]);
|
||||
uart_writeText("\n");
|
||||
uart_writeText("Starting advertsing... ");
|
||||
startActiveAdvertising();
|
||||
|
||||
// Ask to connect to the echo
|
||||
uart_writeText("Connecting to echo: ");
|
||||
connect(echo_addr);
|
||||
while (!connected) bt_conn();
|
||||
uart_writeText("\n");
|
||||
|
||||
// Get the characteristic value
|
||||
uart_writeText("Sending read request: ");
|
||||
uart_hex(connection_handle); uart_writeText("\n");
|
||||
sendACLsubscribe(connection_handle);
|
||||
|
||||
// Into the main infinite loop
|
||||
uart_writeText("Waiting for input...\n");
|
||||
// Enter an infinite loop
|
||||
uart_writeText("Going loopy...");
|
||||
while (1) {
|
||||
acl_poll();
|
||||
uart_update();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue