forked from rad1o/f1rmware
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Initial blinky example - working on the eval board
- Loading branch information
0 parents
commit 60bb28e
Showing
12 changed files
with
504 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
*.org | ||
*.o | ||
*.a | ||
*.swp | ||
*.dfu | ||
*.map | ||
*.elf |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
[submodule "libopencm3"] | ||
path = libopencm3 | ||
url = https://github.com/mossmann/libopencm3.git |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
Required dependency: | ||
|
||
https://github.com/mossmann/libopencm3 | ||
|
||
If you are using git, the preferred way to install libopencm3 is to use the | ||
submodule: | ||
|
||
$ git submodule init | ||
$ git submodule update | ||
$ cd libopencm3 | ||
$ make | ||
|
||
To build blinky: | ||
|
||
$ cd blinky | ||
$ make | ||
$ make program | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
CC = arm-none-eabi-gcc | ||
LD = arm-none-eabi-gcc | ||
AR = arm-none-eabi-ar | ||
AS = arm-none-eabi-as | ||
OBJCOPY = arm-none-eabi-objcopy | ||
OD = arm-none-eabi-objdump | ||
SIZE = arm-none-eabi-size | ||
|
||
OCFLAGS = --strip-unneeded | ||
|
||
CFLAGS = -I../libopencm3/include/ | ||
CFLAGS += -I../common/ | ||
CFLAGS += -I./ -c -fno-common -Os -g -mcpu=cortex-m4 -mthumb -Wall -ffunction-sections -fdata-sections -fno-builtin -Wno-unused-function -ffreestanding | ||
CFLAGS += -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -std=c99 | ||
LFLAGS = -TLPC4330_M4_memory.ld -nostartfiles -Wl,--gc-sections -mthumb | ||
|
||
LFLAGS = -nostartfiles -Wl,--gc-sections -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 | ||
LFLAGS+= -T../ld/LPC4320_M4_memory.ld -T../libopencm3/lib/libopencm3_lpc43xx.ld -T../ld/LPC43xx_M4_M0_image_from_text.ld | ||
LIBS= -L../libopencm3/lib -Xlinker -Map=main.map -L/usr/arm-none-eabi/lib/armv7e-m/fpu -lc -lnosys -lopencm3_lpc43xx -lm | ||
|
||
|
||
|
||
# our code | ||
OBJS = blinky.o | ||
|
||
OBJS += ../common/setup.o | ||
|
||
all: main.dfu | ||
|
||
clean: | ||
-rm -f $(OBJS) main.lst main.elf main.hex main.map main.bin main.list main.dfu _tmp.dfu _header.bin | ||
|
||
main.elf: $(OBJS) | ||
$(LD) $(LFLAGS) -o main.elf $(OBJS) $(LIBS) | ||
-@echo "" | ||
$(SIZE) main.elf | ||
-@echo "" | ||
|
||
%.o : %.c | ||
$(CC) $(CFLAGS) -o $@ $< | ||
|
||
%.bin: %.elf | ||
$(OBJCOPY) $(OCFLAGS) -O binary $< $@ | ||
|
||
%.dfu: %.bin | ||
cp $< _tmp.dfu | ||
dfu-suffix --vid=0x1fc9 --pid=0x000c --did=0x0 -a _tmp.dfu | ||
python2 -c "import os.path; import struct; print('0000000: da ff ' + ' '.join(map(lambda s: '%02x' % ord(s), struct.pack('<H', os.path.getsize('$<') / 512 + 1))) + 'ff ff ff ff ff ff ff ff ff ff ff ff')" | xxd -g1 -r > _header.bin | ||
cat _header.bin _tmp.dfu > $@ | ||
|
||
program: main.dfu | ||
sudo dfu-util --device 1fc9:000c --alt 0 --download main.dfu |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
/* | ||
* Copyright 2010 - 2012 Michael Ossmann | ||
* | ||
* This file is part of HackRF. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2, or (at your option) | ||
* any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; see the file COPYING. If not, write to | ||
* the Free Software Foundation, Inc., 51 Franklin Street, | ||
* Boston, MA 02110-1301, USA. | ||
*/ | ||
|
||
#include <libopencm3/lpc43xx/gpio.h> | ||
#include <libopencm3/lpc43xx/scu.h> | ||
|
||
#include "setup.h" | ||
|
||
#define PORT_LED1 GPIO1 | ||
#define PIN_LED1 (1<<11) | ||
|
||
int main(void) | ||
{ | ||
int i; | ||
cpu_clock_init(); | ||
cpu_clock_pll1_max_speed(); | ||
|
||
scu_pinmux(P2_11,SCU_GPIO_NOPULL|SCU_CONF_FUNCTION0); | ||
GPIO1_DIR |= PIN_LED1; | ||
|
||
/* Blink LED1/2/3 on the board and Read BOOT0/1/2/3 pins. */ | ||
while (1) | ||
{ | ||
gpio_set(PORT_LED1, PIN_LED1); /* LED off */ | ||
delay(2000000); | ||
gpio_clear(PORT_LED1, PIN_LED1); /* LED on */ | ||
delay(2000000); | ||
} | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,203 @@ | ||
/* | ||
* Copyright 2012 Michael Ossmann <mike@ossmann.com> | ||
* Copyright 2012 Jared Boone <jared@sharebrained.com> | ||
* Copyright 2013 Benjamin Vernoux <titanmkd@gmail.com> | ||
* | ||
* This file is part of HackRF. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2, or (at your option) | ||
* any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; see the file COPYING. If not, write to | ||
* the Free Software Foundation, Inc., 51 Franklin Street, | ||
* Boston, MA 02110-1301, USA. | ||
*/ | ||
|
||
#include "setup.h" | ||
#include <libopencm3/lpc43xx/i2c.h> | ||
#include <libopencm3/lpc43xx/cgu.h> | ||
#include <libopencm3/lpc43xx/gpio.h> | ||
#include <libopencm3/lpc43xx/scu.h> | ||
#include <libopencm3/lpc43xx/ssp.h> | ||
|
||
#define WAIT_CPU_CLOCK_INIT_DELAY (10000) | ||
|
||
void delay(uint32_t duration) | ||
{ | ||
uint32_t i; | ||
|
||
for (i = 0; i < duration; i++) | ||
__asm__("nop"); | ||
} | ||
|
||
/* clock startup for Jellybean with Lemondrop attached | ||
Configure PLL1 to max speed (204MHz). | ||
Note: PLL1 clock is used by M4/M0 core, Peripheral, APB1. */ | ||
void cpu_clock_init(void) | ||
{ | ||
/* use IRC as clock source for APB1 (including I2C0) */ | ||
CGU_BASE_APB1_CLK = CGU_BASE_APB1_CLK_CLK_SEL(CGU_SRC_IRC); | ||
|
||
/* use IRC as clock source for APB3 */ | ||
CGU_BASE_APB3_CLK = CGU_BASE_APB3_CLK_CLK_SEL(CGU_SRC_IRC); | ||
|
||
|
||
/* set xtal oscillator to low frequency mode */ | ||
CGU_XTAL_OSC_CTRL &= ~CGU_XTAL_OSC_CTRL_HF_MASK; | ||
|
||
/* power on the oscillator and wait until stable */ | ||
CGU_XTAL_OSC_CTRL &= ~CGU_XTAL_OSC_CTRL_ENABLE_MASK; | ||
|
||
/* Wait about 100us after Crystal Power ON */ | ||
delay(WAIT_CPU_CLOCK_INIT_DELAY); | ||
|
||
/* use XTAL_OSC as clock source for BASE_M4_CLK (CPU) */ | ||
CGU_BASE_M4_CLK = (CGU_BASE_M4_CLK_CLK_SEL(CGU_SRC_XTAL) | CGU_BASE_M4_CLK_AUTOBLOCK(1)); | ||
|
||
/* use XTAL_OSC as clock source for APB1 */ | ||
CGU_BASE_APB1_CLK = CGU_BASE_APB1_CLK_AUTOBLOCK(1) | ||
| CGU_BASE_APB1_CLK_CLK_SEL(CGU_SRC_XTAL); | ||
|
||
/* use XTAL_OSC as clock source for APB3 */ | ||
CGU_BASE_APB3_CLK = CGU_BASE_APB3_CLK_AUTOBLOCK(1) | ||
| CGU_BASE_APB3_CLK_CLK_SEL(CGU_SRC_XTAL); | ||
|
||
cpu_clock_pll1_low_speed(); | ||
|
||
/* use PLL1 as clock source for BASE_M4_CLK (CPU) */ | ||
CGU_BASE_M4_CLK = (CGU_BASE_M4_CLK_CLK_SEL(CGU_SRC_PLL1) | CGU_BASE_M4_CLK_AUTOBLOCK(1)); | ||
|
||
/* use XTAL_OSC as clock source for PLL0USB */ | ||
CGU_PLL0USB_CTRL = CGU_PLL0USB_CTRL_PD(1) | ||
| CGU_PLL0USB_CTRL_AUTOBLOCK(1) | ||
| CGU_PLL0USB_CTRL_CLK_SEL(CGU_SRC_XTAL); | ||
while (CGU_PLL0USB_STAT & CGU_PLL0USB_STAT_LOCK_MASK); | ||
|
||
/* configure PLL0USB to produce 480 MHz clock from 12 MHz XTAL_OSC */ | ||
/* Values from User Manual v1.4 Table 94, for 12MHz oscillator. */ | ||
CGU_PLL0USB_MDIV = 0x06167FFA; | ||
CGU_PLL0USB_NP_DIV = 0x00302062; | ||
CGU_PLL0USB_CTRL |= (CGU_PLL0USB_CTRL_PD(1) | ||
| CGU_PLL0USB_CTRL_DIRECTI(1) | ||
| CGU_PLL0USB_CTRL_DIRECTO(1) | ||
| CGU_PLL0USB_CTRL_CLKEN(1)); | ||
|
||
/* power on PLL0USB and wait until stable */ | ||
CGU_PLL0USB_CTRL &= ~CGU_PLL0USB_CTRL_PD_MASK; | ||
while (!(CGU_PLL0USB_STAT & CGU_PLL0USB_STAT_LOCK_MASK)); | ||
|
||
/* use PLL0USB as clock source for USB0 */ | ||
CGU_BASE_USB0_CLK = CGU_BASE_USB0_CLK_AUTOBLOCK(1) | ||
| CGU_BASE_USB0_CLK_CLK_SEL(CGU_SRC_PLL0USB); | ||
|
||
/* Switch peripheral clock over to use PLL1 (204MHz) */ | ||
CGU_BASE_PERIPH_CLK = CGU_BASE_PERIPH_CLK_AUTOBLOCK(1) | ||
| CGU_BASE_PERIPH_CLK_CLK_SEL(CGU_SRC_PLL1); | ||
|
||
/* Switch APB1 clock over to use PLL1 (204MHz) */ | ||
CGU_BASE_APB1_CLK = CGU_BASE_APB1_CLK_AUTOBLOCK(1) | ||
| CGU_BASE_APB1_CLK_CLK_SEL(CGU_SRC_PLL1); | ||
|
||
/* Switch APB3 clock over to use PLL1 (204MHz) */ | ||
CGU_BASE_APB3_CLK = CGU_BASE_APB3_CLK_AUTOBLOCK(1) | ||
| CGU_BASE_APB3_CLK_CLK_SEL(CGU_SRC_PLL1); | ||
} | ||
|
||
|
||
/* | ||
Configure PLL1 to low speed (48MHz). | ||
Note: PLL1 clock is used by M4/M0 core, Peripheral, APB1. | ||
This function shall be called after cpu_clock_init(). | ||
This function is mainly used to lower power consumption. | ||
*/ | ||
void cpu_clock_pll1_low_speed(void) | ||
{ | ||
uint32_t pll_reg; | ||
|
||
/* Configure PLL1 Clock (48MHz) */ | ||
/* Integer mode: | ||
FCLKOUT = M*(FCLKIN/N) | ||
FCCO = 2*P*FCLKOUT = 2*P*M*(FCLKIN/N) | ||
*/ | ||
pll_reg = CGU_PLL1_CTRL; | ||
/* Clear PLL1 bits */ | ||
pll_reg &= ~( CGU_PLL1_CTRL_CLK_SEL_MASK | CGU_PLL1_CTRL_PD_MASK | CGU_PLL1_CTRL_FBSEL_MASK | /* CLK SEL, PowerDown , FBSEL */ | ||
CGU_PLL1_CTRL_BYPASS_MASK | /* BYPASS */ | ||
CGU_PLL1_CTRL_DIRECT_MASK | /* DIRECT */ | ||
CGU_PLL1_CTRL_PSEL_MASK | CGU_PLL1_CTRL_MSEL_MASK | CGU_PLL1_CTRL_NSEL_MASK ); /* PSEL, MSEL, NSEL- divider ratios */ | ||
/* Set PLL1 up to 12MHz * 4 = 48MHz. */ | ||
pll_reg |= CGU_PLL1_CTRL_CLK_SEL(CGU_SRC_XTAL) | ||
| CGU_PLL1_CTRL_PSEL(0) | ||
| CGU_PLL1_CTRL_NSEL(0) | ||
| CGU_PLL1_CTRL_MSEL(3) | ||
| CGU_PLL1_CTRL_FBSEL(1) | ||
| CGU_PLL1_CTRL_DIRECT(1); | ||
CGU_PLL1_CTRL = pll_reg; | ||
/* wait until stable */ | ||
while (!(CGU_PLL1_STAT & CGU_PLL1_STAT_LOCK_MASK)); | ||
|
||
/* Wait a delay after switch to new frequency with Direct mode */ | ||
delay(WAIT_CPU_CLOCK_INIT_DELAY); | ||
} | ||
|
||
/* | ||
Configure PLL1 (Main MCU Clock) to max speed (204MHz). | ||
Note: PLL1 clock is used by M4/M0 core, Peripheral, APB1. | ||
This function shall be called after cpu_clock_init(). | ||
*/ | ||
void cpu_clock_pll1_max_speed(void) | ||
{ | ||
uint32_t pll_reg; | ||
|
||
/* Configure PLL1 to Intermediate Clock (between 90 MHz and 110 MHz) */ | ||
/* Integer mode: | ||
FCLKOUT = M*(FCLKIN/N) | ||
FCCO = 2*P*FCLKOUT = 2*P*M*(FCLKIN/N) | ||
*/ | ||
pll_reg = CGU_PLL1_CTRL; | ||
/* Clear PLL1 bits */ | ||
pll_reg &= ~( CGU_PLL1_CTRL_CLK_SEL_MASK | CGU_PLL1_CTRL_PD_MASK | CGU_PLL1_CTRL_FBSEL_MASK | /* CLK SEL, PowerDown , FBSEL */ | ||
CGU_PLL1_CTRL_BYPASS_MASK | /* BYPASS */ | ||
CGU_PLL1_CTRL_DIRECT_MASK | /* DIRECT */ | ||
CGU_PLL1_CTRL_PSEL_MASK | CGU_PLL1_CTRL_MSEL_MASK | CGU_PLL1_CTRL_NSEL_MASK ); /* PSEL, MSEL, NSEL- divider ratios */ | ||
/* Set PLL1 up to 12MHz * 8 = 96MHz. */ | ||
pll_reg |= CGU_PLL1_CTRL_CLK_SEL(CGU_SRC_XTAL) | ||
| CGU_PLL1_CTRL_PSEL(0) | ||
| CGU_PLL1_CTRL_NSEL(0) | ||
| CGU_PLL1_CTRL_MSEL(7) | ||
| CGU_PLL1_CTRL_FBSEL(1); | ||
CGU_PLL1_CTRL = pll_reg; | ||
/* wait until stable */ | ||
while (!(CGU_PLL1_STAT & CGU_PLL1_STAT_LOCK_MASK)); | ||
|
||
/* Wait before to switch to max speed */ | ||
delay(WAIT_CPU_CLOCK_INIT_DELAY); | ||
|
||
/* Configure PLL1 Max Speed */ | ||
/* Direct mode: FCLKOUT = FCCO = M*(FCLKIN/N) */ | ||
pll_reg = CGU_PLL1_CTRL; | ||
/* Clear PLL1 bits */ | ||
pll_reg &= ~( CGU_PLL1_CTRL_CLK_SEL_MASK | CGU_PLL1_CTRL_PD_MASK | CGU_PLL1_CTRL_FBSEL_MASK | /* CLK SEL, PowerDown , FBSEL */ | ||
CGU_PLL1_CTRL_BYPASS_MASK | /* BYPASS */ | ||
CGU_PLL1_CTRL_DIRECT_MASK | /* DIRECT */ | ||
CGU_PLL1_CTRL_PSEL_MASK | CGU_PLL1_CTRL_MSEL_MASK | CGU_PLL1_CTRL_NSEL_MASK ); /* PSEL, MSEL, NSEL- divider ratios */ | ||
/* Set PLL1 up to 12MHz * 17 = 204MHz. */ | ||
pll_reg |= CGU_PLL1_CTRL_CLK_SEL(CGU_SRC_XTAL) | ||
| CGU_PLL1_CTRL_PSEL(0) | ||
| CGU_PLL1_CTRL_NSEL(0) | ||
| CGU_PLL1_CTRL_MSEL(16) | ||
| CGU_PLL1_CTRL_FBSEL(1) | ||
| CGU_PLL1_CTRL_DIRECT(1); | ||
CGU_PLL1_CTRL = pll_reg; | ||
/* wait until stable */ | ||
while (!(CGU_PLL1_STAT & CGU_PLL1_STAT_LOCK_MASK)); | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* | ||
* Copyright 2012 Michael Ossmann <mike@ossmann.com> | ||
* Copyright 2012 Benjamin Vernoux <titanmkd@gmail.com> | ||
* Copyright 2012 Jared Boone <jared@sharebrained.com> | ||
* | ||
* This file is part of HackRF. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2, or (at your option) | ||
* any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; see the file COPYING. If not, write to | ||
* the Free Software Foundation, Inc., 51 Franklin Street, | ||
* Boston, MA 02110-1301, USA. | ||
*/ | ||
|
||
#ifndef __SETUP_H | ||
#define __SETUP_H | ||
|
||
#include <stdint.h> | ||
#include <stdbool.h> | ||
|
||
void delay(uint32_t duration); | ||
|
||
void cpu_clock_init(void); | ||
void cpu_clock_pll1_low_speed(void); | ||
void cpu_clock_pll1_max_speed(void); | ||
|
||
#endif /* __HACKRF_CORE_H */ |
Oops, something went wrong.