From ff7e2824011f787acd730ac788b06610c6e40132 Mon Sep 17 00:00:00 2001 From: James McKenzie Date: Sun, 2 Aug 2015 23:37:49 +0100 Subject: fish --- .gitignore | 7 +++ app/Makefile | 2 +- app/crypto.ld | 15 ++++--- app/i2c.c | 132 ------------------------------------------------------- app/i2c1.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/i2c2.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/lcd.c | 24 +++++----- app/main.c | 8 +++- app/prototypes.h | 12 ++--- boot/usbdfu.ld | 6 +-- 10 files changed, 309 insertions(+), 161 deletions(-) create mode 100644 .gitignore delete mode 100644 app/i2c.c create mode 100644 app/i2c1.c create mode 100644 app/i2c2.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e530e6a --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.map +*.d +*.o +*~ +*.elf +*.hex +*.dfu diff --git a/app/Makefile b/app/Makefile index 7b4e978..3bdb8d4 100644 --- a/app/Makefile +++ b/app/Makefile @@ -24,7 +24,7 @@ PROG=crypto V=1 default: ${PROG}.elf -CSRCS=dfu.c crypto.c main.c usb.c led.c ticker.c i2c.c lcd.c +CSRCS=dfu.c crypto.c main.c usb.c led.c ticker.c i2c1.c i2c2.c lcd.c keypad.c BINARY = ${PROG} diff --git a/app/crypto.ld b/app/crypto.ld index b36fefa..a2d5a9c 100644 --- a/app/crypto.ld +++ b/app/crypto.ld @@ -17,13 +17,13 @@ * along with this library. If not, see . */ -/* Linker script for STM32F101C8T6, 64K flash, 20K RAM). */ +/* Linker script for Olimex STM32-H103 (STM32F103RBT6, 128K flash, 20K RAM). */ /* Define memory regions. */ MEMORY { - rom (rx) : ORIGIN = 0x08000000, LENGTH = 64K - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 10K + rom (rx) : ORIGIN = 0x08002000, LENGTH = 120K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K } /* Include the common ld script. */ @@ -31,10 +31,13 @@ INCLUDE libopencm3_stm32f1.ld dfu_shared_location = ORIGIN(ram) + LENGTH(ram) - 1024; +/* PROVIDE(_stack = dfu_shared_location ); */ + SECTIONS { - .dfu_shared dfu_shared_location :{ - dfu_flag = .; - } + .dfu_shared dfu_shared_location :{ + dfu_flag = .; + } } + diff --git a/app/i2c.c b/app/i2c.c deleted file mode 100644 index 89249d0..0000000 --- a/app/i2c.c +++ /dev/null @@ -1,132 +0,0 @@ -#include "project.h" - - -#define GPIO_SCL GPIOB -#define GPIO_SDA GPIOB -#define SCL GPIO13 -#define SDA GPIO14 - -#define I2C_BB_DELAY do { delay_us(1); } while (0) - -int -i2c_bb (int scl, int sda) -{ - if (scl) - gpio_set (GPIO_SCL, SCL); - else - gpio_clear (GPIO_SCL, SCL); - if (sda) - gpio_set (GPIO_SDA, SDA); - else - gpio_clear (GPIO_SDA, SDA); - - return ! !(gpio_get (GPIO_SDA, SDA) & SDA); - -} - - -void -i2c_bb_start (void) -{ - i2c_bb (1, 1); - I2C_BB_DELAY; - i2c_bb (1, 0); - I2C_BB_DELAY; - i2c_bb (0, 0); - I2C_BB_DELAY; -} - - -void -i2c_bb_stop (void) -{ - i2c_bb (0, 0); - I2C_BB_DELAY; - i2c_bb (1, 0); - I2C_BB_DELAY; - i2c_bb (1, 1); - I2C_BB_DELAY; -} - -int -i2c_bb_send_data (uint8_t v) -{ - int c; - - - for (c = 0x80; c; c >>= 1) - { - i2c_bb (0, c & v); - I2C_BB_DELAY; - i2c_bb (1, c & v); - I2C_BB_DELAY; - i2c_bb (0, c & v); - I2C_BB_DELAY; - } - - i2c_bb (0, 1); - I2C_BB_DELAY; - i2c_bb (1, 1); - I2C_BB_DELAY; - c = i2c_bb (1, 1); - i2c_bb (0, 1); - - return c; -} - - -int -i2c_bb_start_transaction (uint8_t a, int wnr) -{ - int ret; - - i2c_bb_start (); - ret = i2c_bb_send_data (a << 1 | ! !(wnr)); - - - return ret; -} - -#if 0 -void -i2c_bb_scan (void) -{ - int i, r; - - return; - i2cp_reset (); - - printf ("Probing bus\r\n"); - for (i = 0; i < 128; ++i) - { - while (i2cp_lock ()); - i2cp_start (); - i2cp_abort_start (); - i2cp_stop (); - i2cp_abort_stop (); - r = i2cp_start_transaction (i, I2C_WRITE); - i2cp_stop (); - i2cp_unlock (); - if (!r) - printf ("Found device at address 0x%x\r\n", i); - usart1_drain (); - } - printf ("Done\r\n"); - i2cp_reset (); - -} -#endif - -void -i2c_bb_init (void) -{ - gpio_set_mode (GPIO_SCL, GPIO_MODE_OUTPUT_50_MHZ, - GPIO_CNF_OUTPUT_OPENDRAIN, SCL); - gpio_set_mode (GPIO_SDA, GPIO_MODE_OUTPUT_50_MHZ, - GPIO_CNF_OUTPUT_OPENDRAIN, SDA); - - i2c_bb_start (); - i2c_bb_stop (); - - -} diff --git a/app/i2c1.c b/app/i2c1.c new file mode 100644 index 0000000..db60931 --- /dev/null +++ b/app/i2c1.c @@ -0,0 +1,132 @@ +#include "project.h" + + +#define GPIO_SCL GPIOB +#define GPIO_SDA GPIOB +#define SCL GPIO13 +#define SDA GPIO14 + +#define I2C_BB_DELAY do { delay_us(1); } while (0) + +int +i2c1_bb (int scl, int sda) +{ + if (scl) + gpio_set (GPIO_SCL, SCL); + else + gpio_clear (GPIO_SCL, SCL); + if (sda) + gpio_set (GPIO_SDA, SDA); + else + gpio_clear (GPIO_SDA, SDA); + + return ! !(gpio_get (GPIO_SDA, SDA) & SDA); + +} + + +void +i2c1_bb_start (void) +{ + i2c1_bb (1, 1); + I2C_BB_DELAY; + i2c1_bb (1, 0); + I2C_BB_DELAY; + i2c1_bb (0, 0); + I2C_BB_DELAY; +} + + +void +i2c1_bb_stop (void) +{ + i2c1_bb (0, 0); + I2C_BB_DELAY; + i2c1_bb (1, 0); + I2C_BB_DELAY; + i2c1_bb (1, 1); + I2C_BB_DELAY; +} + +int +i2c1_bb_send_data (uint8_t v) +{ + int c; + + + for (c = 0x80; c; c >>= 1) + { + i2c1_bb (0, c & v); + I2C_BB_DELAY; + i2c1_bb (1, c & v); + I2C_BB_DELAY; + i2c1_bb (0, c & v); + I2C_BB_DELAY; + } + + i2c1_bb (0, 1); + I2C_BB_DELAY; + i2c1_bb (1, 1); + I2C_BB_DELAY; + c = i2c1_bb (1, 1); + i2c1_bb (0, 1); + + return c; +} + + +int +i2c1_bb_start_transaction (uint8_t a, int wnr) +{ + int ret; + + i2c1_bb_start (); + ret = i2c1_bb_send_data (a << 1 | ! !(wnr)); + + + return ret; +} + +#if 0 +void +i2c1_bb_scan (void) +{ + int i, r; + + return; + i2cp_reset (); + + printf ("Probing bus\r\n"); + for (i = 0; i < 128; ++i) + { + while (i2cp_lock ()); + i2cp_start (); + i2cp_abort_start (); + i2cp_stop (); + i2cp_abort_stop (); + r = i2cp_start_transaction (i, I2C_WRITE); + i2cp_stop (); + i2cp_unlock (); + if (!r) + printf ("Found device at address 0x%x\r\n", i); + usart1_drain (); + } + printf ("Done\r\n"); + i2cp_reset (); + +} +#endif + +void +i2c1_bb_init (void) +{ + gpio_set_mode (GPIO_SCL, GPIO_MODE_OUTPUT_50_MHZ, + GPIO_CNF_OUTPUT_OPENDRAIN, SCL); + gpio_set_mode (GPIO_SDA, GPIO_MODE_OUTPUT_50_MHZ, + GPIO_CNF_OUTPUT_OPENDRAIN, SDA); + + i2c1_bb_start (); + i2c1_bb_stop (); + + +} diff --git a/app/i2c2.c b/app/i2c2.c new file mode 100644 index 0000000..77701cc --- /dev/null +++ b/app/i2c2.c @@ -0,0 +1,132 @@ +#include "project.h" + + +#define GPIO_SCL GPIOA +#define GPIO_SDA GPIOB +#define SCL GPIO5 +#define SDA GPIO11 + +#define I2C_BB_DELAY do { delay_us(1); } while (0) + +int +i2c2_bb (int scl, int sda) +{ + if (scl) + gpio_set (GPIO_SCL, SCL); + else + gpio_clear (GPIO_SCL, SCL); + if (sda) + gpio_set (GPIO_SDA, SDA); + else + gpio_clear (GPIO_SDA, SDA); + + return ! !(gpio_get (GPIO_SDA, SDA) & SDA); + +} + + +void +i2c2_bb_start (void) +{ + i2c2_bb (1, 1); + I2C_BB_DELAY; + i2c2_bb (1, 0); + I2C_BB_DELAY; + i2c2_bb (0, 0); + I2C_BB_DELAY; +} + + +void +i2c2_bb_stop (void) +{ + i2c2_bb (0, 0); + I2C_BB_DELAY; + i2c2_bb (1, 0); + I2C_BB_DELAY; + i2c2_bb (1, 1); + I2C_BB_DELAY; +} + +int +i2c2_bb_send_data (uint8_t v) +{ + int c; + + + for (c = 0x80; c; c >>= 1) + { + i2c2_bb (0, c & v); + I2C_BB_DELAY; + i2c2_bb (1, c & v); + I2C_BB_DELAY; + i2c2_bb (0, c & v); + I2C_BB_DELAY; + } + + i2c2_bb (0, 1); + I2C_BB_DELAY; + i2c2_bb (1, 1); + I2C_BB_DELAY; + c = i2c2_bb (1, 1); + i2c2_bb (0, 1); + + return c; +} + + +int +i2c2_bb_start_transaction (uint8_t a, int wnr) +{ + int ret; + + i2c2_bb_start (); + ret = i2c2_bb_send_data (a << 1 | ! !(wnr)); + + + return ret; +} + +#if 0 +void +i2c2_bb_scan (void) +{ + int i, r; + + return; + i2cp_reset (); + + printf ("Probing bus\r\n"); + for (i = 0; i < 128; ++i) + { + while (i2cp_lock ()); + i2cp_start (); + i2cp_abort_start (); + i2cp_stop (); + i2cp_abort_stop (); + r = i2cp_start_transaction (i, I2C_WRITE); + i2cp_stop (); + i2cp_unlock (); + if (!r) + printf ("Found device at address 0x%x\r\n", i); + usart1_drain (); + } + printf ("Done\r\n"); + i2cp_reset (); + +} +#endif + +void +i2c2_bb_init (void) +{ + gpio_set_mode (GPIO_SCL, GPIO_MODE_OUTPUT_50_MHZ, + GPIO_CNF_OUTPUT_OPENDRAIN, SCL); + gpio_set_mode (GPIO_SDA, GPIO_MODE_OUTPUT_50_MHZ, + GPIO_CNF_OUTPUT_OPENDRAIN, SDA); + + i2c2_bb_start (); + i2c2_bb_stop (); + + +} diff --git a/app/lcd.c b/app/lcd.c index 714e850..5fc0b03 100644 --- a/app/lcd.c +++ b/app/lcd.c @@ -52,9 +52,9 @@ clock_nibble (uint8_t n) { if (backlight) n |= LINE_BACKLIGHT; - i2c_bb_send_data (n); - i2c_bb_send_data (LINE_EN | n); - i2c_bb_send_data (n); + i2c1_bb_send_data (n); + i2c1_bb_send_data (LINE_EN | n); + i2c1_bb_send_data (n); } @@ -92,9 +92,9 @@ send_command (uint8_t c) static void send_one_command (uint8_t cmd, int delay) { - i2c_bb_start_transaction (PCF8574_I2C_ADDRESS, I2C_WRITE); + i2c1_bb_start_transaction (PCF8574_I2C_ADDRESS, I2C_WRITE); send_command (cmd); - i2c_bb_stop (); + i2c1_bb_stop (); if (delay) delay_ms (delay); } @@ -150,7 +150,7 @@ lcd_refresh (void) int addr; - i2c_bb_start_transaction (PCF8574_I2C_ADDRESS, I2C_WRITE); + i2c1_bb_start_transaction (PCF8574_I2C_ADDRESS, I2C_WRITE); for (r = 0; r < LCD_H; ++r) @@ -178,7 +178,7 @@ lcd_refresh (void) } } - i2c_bb_stop (); + i2c1_bb_stop (); } void @@ -299,9 +299,9 @@ lcd_backlight (int i) { backlight = i; - i2c_bb_start_transaction (PCF8574_I2C_ADDRESS, I2C_WRITE); - i2c_bb_send_data (backlight ? LINE_BACKLIGHT : 0); - i2c_bb_stop (); + i2c1_bb_start_transaction (PCF8574_I2C_ADDRESS, I2C_WRITE); + i2c1_bb_send_data (backlight ? LINE_BACKLIGHT : 0); + i2c1_bb_stop (); } @@ -312,7 +312,7 @@ lcd_backlight (int i) void lcd_reset (void) { - i2c_bb_start_transaction (PCF8574_I2C_ADDRESS, I2C_WRITE); + i2c1_bb_start_transaction (PCF8574_I2C_ADDRESS, I2C_WRITE); clock_nibble (0x30); delay_ms (5); clock_nibble (0x30); @@ -322,7 +322,7 @@ lcd_reset (void) clock_nibble (0x20); send_command (LCD_FUNC | LCD_FUNC_4BIT | LCD_FUNC_2ROWS | LCD_FUNC_5X7); - i2c_bb_stop (); + i2c1_bb_stop (); on (); cls (); } diff --git a/app/main.c b/app/main.c index 053aa75..0d683e7 100644 --- a/app/main.c +++ b/app/main.c @@ -17,15 +17,21 @@ main (void) ticker_init (); led_init (); - i2c_bb_init (); + i2c1_bb_init (); lcd_init (); + i2c2_bb_init (); + keypad_init(); + lcd_backlight (1); + +#if 0 { char buf[16]; sprintf(buf,"%x",dfu_flag); lcd_write(buf,0,1); } +#endif lcd_write ("hello world", 0, 0); diff --git a/app/prototypes.h b/app/prototypes.h index f977d61..78a0e8b 100644 --- a/app/prototypes.h +++ b/app/prototypes.h @@ -31,12 +31,12 @@ extern void delay_ms(uint32_t d); extern int timed_out(uint32_t then, unsigned int ms); extern void ticker_init(void); /* i2c.c */ -extern int i2c_bb(int scl, int sda); -extern void i2c_bb_start(void); -extern void i2c_bb_stop(void); -extern int i2c_bb_send_data(uint8_t v); -extern int i2c_bb_start_transaction(uint8_t a, int wnr); -extern void i2c_bb_init(void); +extern int i2c1_bb(int scl, int sda); +extern void i2c1_bb_start(void); +extern void i2c1_bb_stop(void); +extern int i2c1_bb_send_data(uint8_t v); +extern int i2c1_bb_start_transaction(uint8_t a, int wnr); +extern void i2c1_bb_init(void); /* lcd.c */ extern uint8_t fb[2][16]; extern uint8_t shadow[2][16]; diff --git a/boot/usbdfu.ld b/boot/usbdfu.ld index b36fefa..8680dc9 100644 --- a/boot/usbdfu.ld +++ b/boot/usbdfu.ld @@ -17,13 +17,13 @@ * along with this library. If not, see . */ -/* Linker script for STM32F101C8T6, 64K flash, 20K RAM). */ +/* Linker script for Olimex STM32-H103 (STM32F103RBT6, 128K flash, 20K RAM). */ /* Define memory regions. */ MEMORY { - rom (rx) : ORIGIN = 0x08000000, LENGTH = 64K - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 10K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K } /* Include the common ld script. */ -- cgit v1.2.3