summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorroot <root@new-selene.erebei.org>2015-12-01 10:51:56 +0000
committerroot <root@new-selene.erebei.org>2015-12-01 10:51:56 +0000
commitbc832d6d342922a828aebb997d1d9c6626898487 (patch)
tree655249961aa9abdc64e9a0227ddb0d114d4b7fd5 /app
parent15f6f34fe239b0b71cb2ef4fd16f278a23b52506 (diff)
downloadcandlestick-bc832d6d342922a828aebb997d1d9c6626898487.tar.gz
candlestick-bc832d6d342922a828aebb997d1d9c6626898487.tar.bz2
candlestick-bc832d6d342922a828aebb997d1d9c6626898487.zip
fish
Diffstat (limited to 'app')
-rw-r--r--app/crypto.c31
-rw-r--r--app/main.c1
-rw-r--r--app/project.h3
-rw-r--r--app/prototypes.h23
-rw-r--r--app/state.c10
-rw-r--r--app/ticker.c7
-rw-r--r--app/usb.c24
7 files changed, 64 insertions, 35 deletions
diff --git a/app/crypto.c b/app/crypto.c
index 494e5ab..a725def 100644
--- a/app/crypto.c
+++ b/app/crypto.c
@@ -2,6 +2,9 @@
#include "../common/vendor_req.h"
+static int key_send_timer = 0;
+static int start_key_send = 0;
+
int
crypto_control (uint8_t request, uint16_t value, uint16_t index, void *buf,
size_t len)
@@ -18,10 +21,15 @@ crypto_control (uint8_t request, uint16_t value, uint16_t index, void *buf,
send_ascii (value);
return 1;
case VENDOR_REQ_SET_KEY:
+ state_init ();
key_set (buf, len);
return 1;
case VENDOR_REQ_SEND_KEY:
- key_send ();
+
+ if (!value)
+ start_key_send = 1;
+ else
+ key_send_timer = value;
return 1;
case VENDOR_REQ_CLEAR_KEY:
key_wipe ();
@@ -46,3 +54,24 @@ vendor_control_request (usbd_device * usbd_dev, struct usb_setup_data *req,
return crypto_control (req->bRequest, req->wValue, req->wIndex, *buf, *len);
}
+
+void
+crypto_tick (void)
+{
+ if (!key_send_timer)
+ return;
+ key_send_timer--;
+
+ if (!key_send_timer)
+ start_key_send = 1;
+}
+
+void
+crypto_poll (void)
+{
+ if (start_key_send)
+ {
+ start_key_send = 0;
+ key_send ();
+ }
+}
diff --git a/app/main.c b/app/main.c
index 4f8f6f7..8c51c90 100644
--- a/app/main.c
+++ b/app/main.c
@@ -20,6 +20,7 @@ main (void)
rcc_periph_clock_enable (RCC_GPIOC);
rcc_periph_clock_enable (RCC_AFIO);
+
ticker_init ();
led_init ();
#ifndef SLIM
diff --git a/app/project.h b/app/project.h
index a8b773b..6fccdc5 100644
--- a/app/project.h
+++ b/app/project.h
@@ -30,6 +30,9 @@
#define POWER_RETENTION_TIME 10
#define USB_RETENTION_TIME 60
+#define POWER_LOCK_TIME 500
+#define USB_LOCK_TIME 500
+
#ifndef USB_REQ_TYPE_OUT
#define USB_REQ_TYPE_OUT 0x0
#endif
diff --git a/app/prototypes.h b/app/prototypes.h
index 34d7863..2e78350 100644
--- a/app/prototypes.h
+++ b/app/prototypes.h
@@ -28,26 +28,7 @@ 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);
/* lcd.c */
-extern uint8_t fb[2][16];
-extern uint8_t shadow[2][16];
-extern void lcd_refresh(void);
-extern void lcd_tick(void);
-extern void lcd_write_char(uint8_t c, int x, int y);
-extern void lcd_erase(int x, int y, int w);
-extern void lcd_erase_line(int w, int y);
-extern void lcd_erase_all(void);
-extern void lcd_write(char *c, int x, int y);
-extern void lcd_backlight(int i);
-extern void lcd_reset(void);
-extern void lcd_init(void);
-extern void lcd_shutdown(void);
/* adc.c */
extern int host_has_power;
extern void adc_tick(void);
@@ -55,6 +36,8 @@ extern void adc_init(void);
/* state.c */
extern uint32_t up_time;
extern uint32_t down_time;
+extern uint32_t usb_up_time;
+extern uint32_t usb_down_time;
extern int locked;
extern void state_show(void);
extern void state_tick(void);
@@ -73,6 +56,8 @@ extern void keyboard_keypress(int m, int k);
/* crypto.c */
extern int crypto_control(uint8_t request, uint16_t value, uint16_t index, void *buf, size_t len);
extern int vendor_control_request(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, int (**complete)(usbd_device *usbd_dev, struct usb_setup_data *req));
+extern void crypto_tick(void);
+extern void crypto_poll(void);
/* map.c */
extern void send_ascii(unsigned char a);
extern void send_str(const char *c);
diff --git a/app/state.c b/app/state.c
index 0c23260..eb033ac 100644
--- a/app/state.c
+++ b/app/state.c
@@ -1,6 +1,6 @@
#include "project.h"
-uint32_t up_time, down_time,usb_up_time,usb_down_time;
+uint32_t up_time, down_time, usb_up_time, usb_down_time;
int locked;
@@ -77,6 +77,11 @@ state_tick (void)
key_wipe ();
}
+ if ((usb_up_time > USB_LOCK_TIME) && !locked)
+ locked = 1;
+ if ((up_time > POWER_LOCK_TIME) && !locked)
+ locked = 1;
+
state_show ();
}
@@ -87,5 +92,8 @@ state_init (void)
{
down_time = 0;
up_time = 0;
+ usb_down_time = 0;
+ usb_up_time = 0;
+ up_time = 0;
locked = 0;
}
diff --git a/app/ticker.c b/app/ticker.c
index 3e25c12..6ef8a5f 100644
--- a/app/ticker.c
+++ b/app/ticker.c
@@ -22,6 +22,7 @@ s_tick_handler (void)
{
adc_tick ();
state_tick ();
+ crypto_tick ();
}
void
@@ -39,18 +40,14 @@ sys_tick_handler (void)
lcd_tick ();
#endif
- usb_tick();
+ usb_tick ();
-#if 1
s_count++;
if (s_count >= 1000)
{
s_count = 0;
s_tick_handler ();
}
-#else
- s_tick_handler ();
-#endif
}
diff --git a/app/usb.c b/app/usb.c
index 3f5404a..9a84389 100644
--- a/app/usb.c
+++ b/app/usb.c
@@ -58,22 +58,25 @@ usbd_device *usbd_dev;
int usb_is_suspended = 0;
-int usb_running =0;
+int usb_running = 0;
static int time_since_sof;
-void usb_tick(void)
+void
+usb_tick (void)
{
-time_since_sof++;
-if (time_since_sof>3000) usb_running=0;
+ time_since_sof++;
+ if (time_since_sof > 3000)
+ usb_running = 0;
}
-static void usb_sof(void)
+static void
+usb_sof (void)
{
-usb_running=1;
-time_since_sof=0;
+ usb_running = 1;
+ time_since_sof = 0;
}
static void
@@ -184,7 +187,7 @@ usb_init (void)
usbd_register_set_config_callback (usbd_dev, usb_set_config);
usbd_register_suspend_callback (usbd_dev, usb_suspended);
usbd_register_resume_callback (usbd_dev, usb_resumed);
- usbd_register_sof_callback(usbd_dev, usb_sof);
+ usbd_register_sof_callback (usbd_dev, usb_sof);
}
@@ -192,5 +195,8 @@ void
usb_run (void)
{
for (;;)
- usbd_poll (usbd_dev);
+ {
+ usbd_poll (usbd_dev);
+ crypto_poll ();
+ }
}