LED blink change

This commit is contained in:
NIIBE Yutaka
2016-05-18 21:57:34 +09:00
parent 51d4b754e6
commit d5c5571423
5 changed files with 27 additions and 72 deletions

View File

@@ -424,8 +424,7 @@ extern const uint8_t gnuk_string_serial[];
#define LED_START_COMMAND 8 #define LED_START_COMMAND 8
#define LED_FINISH_COMMAND 16 #define LED_FINISH_COMMAND 16
#define LED_FATAL 32 #define LED_FATAL 32
#define LED_USB_RESET 64 #define LED_GNUK_EXEC 64
#define LED_GNUK_EXEC 128
void led_blink (int spec); void led_blink (int spec);
#if defined(PINPAD_SUPPORT) #if defined(PINPAD_SUPPORT)

View File

@@ -2,7 +2,7 @@
* ST32F103 memory setup. * ST32F103 memory setup.
*/ */
__main_stack_size__ = 0x0080; /* Exception handlers */ __main_stack_size__ = 0x0080; /* Exception handlers */
__process0_stack_size__ = 0x0180; /* main */ __process0_stack_size__ = 0x0120; /* main */
__process1_stack_size__ = 0x0160; /* ccid */ __process1_stack_size__ = 0x0160; /* ccid */
__process2_stack_size__ = 0x0160; /* rng */ __process2_stack_size__ = 0x0160; /* rng */
__process3_stack_size__ = 0x1640; /* gpg */ __process3_stack_size__ = 0x1640; /* gpg */

View File

@@ -41,8 +41,6 @@
/* /*
* main thread does 1-bit LED display output * main thread does 1-bit LED display output
*/ */
#define MAIN_TIMEOUT_INTERVAL (5000*1000)
#define LED_TIMEOUT_INTERVAL (75*1000) #define LED_TIMEOUT_INTERVAL (75*1000)
#define LED_TIMEOUT_ZERO (25*1000) #define LED_TIMEOUT_ZERO (25*1000)
#define LED_TIMEOUT_ONE (100*1000) #define LED_TIMEOUT_ONE (100*1000)
@@ -122,59 +120,38 @@ static void display_fatal_code (void)
static uint8_t led_inverted; static uint8_t led_inverted;
static eventmask_t emit_led (int on_time, int off_time) static void emit_led (int on_time, int off_time)
{ {
eventmask_t m;
set_led (!led_inverted); set_led (!led_inverted);
m = eventflag_wait_timeout (&led_event, on_time); chopstx_usec_wait (on_time);
set_led (led_inverted); set_led (led_inverted);
if (m) return m; chopstx_usec_wait (off_time);
if ((m = eventflag_wait_timeout (&led_event, off_time)))
return m;
return 0;
} }
static eventmask_t display_status_code (void) static void display_status_code (void)
{ {
eventmask_t m;
enum icc_state icc_state = *icc_state_p; enum icc_state icc_state = *icc_state_p;
if (icc_state == ICC_STATE_START) if (icc_state == ICC_STATE_START)
return emit_led (LED_TIMEOUT_ONE, LED_TIMEOUT_STOP); emit_led (LED_TIMEOUT_ONE, LED_TIMEOUT_STOP);
else else
/* OpenPGP card thread running */ /* OpenPGP card thread is running */
{ {
if ((m = emit_led ((auth_status & AC_ADMIN_AUTHORIZED)? emit_led ((auth_status & AC_ADMIN_AUTHORIZED)?
LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_INTERVAL);
LED_TIMEOUT_INTERVAL))) emit_led ((auth_status & AC_OTHER_AUTHORIZED)?
return m; LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_INTERVAL);
if ((m = emit_led ((auth_status & AC_OTHER_AUTHORIZED)? emit_led ((auth_status & AC_PSO_CDS_AUTHORIZED)?
LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_INTERVAL);
LED_TIMEOUT_INTERVAL)))
return m;
if ((m = emit_led ((auth_status & AC_PSO_CDS_AUTHORIZED)?
LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO,
LED_TIMEOUT_INTERVAL)))
return m;
if (icc_state == ICC_STATE_WAIT) if (icc_state == ICC_STATE_WAIT)
{ chopstx_usec_wait (LED_TIMEOUT_STOP * 2);
if ((m = eventflag_wait_timeout (&led_event, LED_TIMEOUT_STOP * 2)))
return m;
}
else else
{ {
if ((m = eventflag_wait_timeout (&led_event, LED_TIMEOUT_INTERVAL))) chopstx_usec_wait (LED_TIMEOUT_INTERVAL);
return m; emit_led (icc_state == ICC_STATE_RECEIVE?
LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_STOP);
if ((m = emit_led (icc_state == ICC_STATE_RECEIVE?
LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO,
LED_TIMEOUT_STOP)))
return m;
} }
return 0;
} }
} }
@@ -221,7 +198,6 @@ extern uint32_t bDeviceState;
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
unsigned int count = 0;
uint32_t entry; uint32_t entry;
chopstx_t ccid_thd; chopstx_t ccid_thd;
@@ -267,56 +243,37 @@ main (int argc, char *argv[])
{ {
eventmask_t m; eventmask_t m;
m = eventflag_wait_timeout (&led_event, MAIN_TIMEOUT_INTERVAL); m = eventflag_wait (&led_event);
got_it:
count++;
switch (m) switch (m)
{ {
case LED_ONESHOT: case LED_ONESHOT:
if ((m = emit_led (100*1000, MAIN_TIMEOUT_INTERVAL))) goto got_it; emit_led (100*1000, LED_TIMEOUT_STOP);
break; break;
case LED_TWOSHOTS: case LED_TWOSHOTS:
if ((m = emit_led (50*1000, 50*1000))) goto got_it; emit_led (50*1000, 50*1000);
if ((m = emit_led (50*1000, MAIN_TIMEOUT_INTERVAL))) goto got_it; emit_led (50*1000, LED_TIMEOUT_STOP);
break; break;
case LED_SHOW_STATUS: case LED_SHOW_STATUS:
if ((count & 0x07) != 0) continue; /* Display once for eight times */ display_status_code ();
if ((m = display_status_code ())) goto got_it;
break; break;
case LED_START_COMMAND: case LED_START_COMMAND:
set_led (1); set_led (1);
led_inverted = 1; led_inverted = 1;
break; break;
case LED_FINISH_COMMAND: case LED_FINISH_COMMAND:
m = eventflag_wait_timeout (&led_event, LED_TIMEOUT_STOP); chopstx_usec_wait (LED_TIMEOUT_STOP);
led_inverted = 0; led_inverted = 0;
set_led (0); set_led (0);
if (m)
goto got_it;
break; break;
case LED_FATAL: case LED_FATAL:
display_fatal_code (); display_fatal_code ();
break; break;
case LED_USB_RESET:
ccid_usb_reset ();
break;
case LED_GNUK_EXEC: case LED_GNUK_EXEC:
goto exec; goto exec;
default: default:
if ((m = emit_led (LED_TIMEOUT_ZERO, LED_TIMEOUT_STOP))) emit_led (LED_TIMEOUT_ZERO, LED_TIMEOUT_STOP);
goto got_it;
break; break;
} }
#ifdef DEBUG_MORE
if (stdout.connected && (count % 10) == 0)
{
DEBUG_SHORT (count / 10);
_write ("\r\nThis is Gnuk on STM32F103.\r\n"
"Testing USB driver.\n\n"
"Hello world\r\n\r\n", 30+21+15);
}
#endif
} }
exec: exec:

View File

@@ -849,7 +849,6 @@ icc_send_status (struct ccid *c)
c->epi->tx_done = 1; c->epi->tx_done = 1;
usb_lld_write (c->epi->ep_num, icc_reply, ICC_MSG_HEADER_SIZE); usb_lld_write (c->epi->ep_num, icc_reply, ICC_MSG_HEADER_SIZE);
led_blink (LED_SHOW_STATUS);
#ifdef DEBUG_MORE #ifdef DEBUG_MORE
DEBUG_INFO ("St\r\n"); DEBUG_INFO ("St\r\n");
#endif #endif
@@ -1331,12 +1330,12 @@ icc_handle_timeout (struct ccid *c)
{ {
case ICC_STATE_EXECUTE: case ICC_STATE_EXECUTE:
icc_send_data_block_time_extension (c); icc_send_data_block_time_extension (c);
led_blink (LED_ONESHOT);
break; break;
default: default:
break; break;
} }
led_blink (LED_SHOW_STATUS);
return next_state; return next_state;
} }

View File

@@ -210,7 +210,7 @@ usb_cb_device_reset (void)
gnuk_setup_endpoints_for_interface (i, 1); gnuk_setup_endpoints_for_interface (i, 1);
bDeviceState = ATTACHED; bDeviceState = ATTACHED;
led_blink (LED_USB_RESET); /* Notify the main. */ ccid_usb_reset ();
} }
#define USB_CCID_REQ_ABORT 0x01 #define USB_CCID_REQ_ABORT 0x01