Use of eventflag poll change.

This commit is contained in:
NIIBE Yutaka
2017-11-17 20:10:13 +09:00
parent fe94e1885b
commit 543f28574e
4 changed files with 67 additions and 64 deletions

View File

@@ -1,3 +1,11 @@
2017-11-17 NIIBE Yutaka <gniibe@fsij.org>
* src/stack-def.h (SIZE_0): Decrease.
* src/main.c (emit_led, display_status_code, main): Use
chopstx_poll instead of eventflag_wait_timeout.
2017-11-17 NIIBE Yutaka <gniibe@fsij.org> 2017-11-17 NIIBE Yutaka <gniibe@fsij.org>
* src/stack-def.h (SIZE_0): Increase. * src/stack-def.h (SIZE_0): Increase.

View File

@@ -92,6 +92,10 @@ device_initialize_once (void)
static volatile uint8_t fatal_code; static volatile uint8_t fatal_code;
static struct eventflag led_event; static struct eventflag led_event;
static chopstx_poll_cond_t led_event_poll_desc;
static struct chx_poll_head *const led_event_poll[] = {
(struct chx_poll_head *)&led_event_poll_desc
};
static void display_fatal_code (void) static void display_fatal_code (void)
{ {
@@ -132,52 +136,46 @@ static void display_fatal_code (void)
static uint8_t led_inverted; static uint8_t led_inverted;
static eventmask_t static void
emit_led (int on_time, int off_time) emit_led (uint32_t on_time, uint32_t off_time)
{ {
eventmask_t m;
set_led (!led_inverted); set_led (!led_inverted);
m = eventflag_wait_timeout (&led_event, on_time); chopstx_poll (&on_time, 1, led_event_poll);
set_led (led_inverted); set_led (led_inverted);
if (!m) chopstx_poll (&off_time, 1, led_event_poll);
m = eventflag_wait_timeout (&led_event, off_time);
return m;
} }
static eventmask_t static void
display_status_code (void) display_status_code (void)
{ {
eventmask_t m;
enum ccid_state ccid_state = *ccid_state_p; enum ccid_state ccid_state = *ccid_state_p;
uint32_t usec;
if (ccid_state == CCID_STATE_START) if (ccid_state == CCID_STATE_START)
m = emit_led (LED_TIMEOUT_ONE, LED_TIMEOUT_STOP); emit_led (LED_TIMEOUT_ONE, LED_TIMEOUT_STOP);
else else
/* OpenPGP card thread is running */ /* OpenPGP card thread is running */
{ {
m = emit_led ((auth_status & AC_ADMIN_AUTHORIZED)? emit_led ((auth_status & AC_ADMIN_AUTHORIZED)?
LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_INTERVAL); LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_INTERVAL);
if (m) return m; emit_led ((auth_status & AC_OTHER_AUTHORIZED)?
m = emit_led ((auth_status & AC_OTHER_AUTHORIZED)? LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_INTERVAL);
LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_INTERVAL); emit_led ((auth_status & AC_PSO_CDS_AUTHORIZED)?
if (m) return m; LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_INTERVAL);
m = emit_led ((auth_status & AC_PSO_CDS_AUTHORIZED)?
LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_INTERVAL);
if (m) return m;
if (ccid_state == CCID_STATE_WAIT) if (ccid_state == CCID_STATE_WAIT)
m = eventflag_wait_timeout (&led_event, LED_TIMEOUT_STOP * 2); {
usec = LED_TIMEOUT_STOP * 2;
chopstx_poll (&usec, 1, led_event_poll);
}
else else
{ {
m = eventflag_wait_timeout (&led_event, LED_TIMEOUT_INTERVAL); usec = LED_TIMEOUT_INTERVAL;
if (m) return m; chopstx_poll (&usec, 1, led_event_poll);
m = emit_led (ccid_state == CCID_STATE_RECEIVE? emit_led (ccid_state == CCID_STATE_RECEIVE?
LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_STOP); LED_TIMEOUT_ONE : LED_TIMEOUT_ZERO, LED_TIMEOUT_STOP);
} }
} }
return m;
} }
void void
@@ -352,41 +350,37 @@ main (int argc, const char *argv[])
chopstx_usec_wait (250*1000); chopstx_usec_wait (250*1000);
} }
eventflag_prepare_poll (&led_event, &led_event_poll_desc);
while (1) while (1)
{ {
eventmask_t m; eventmask_t m;
m = eventflag_wait (&led_event); m = eventflag_wait (&led_event);
switch (m)
do {
switch (m) case LED_ONESHOT:
{ emit_led (100*1000, LED_TIMEOUT_STOP);
case LED_ONESHOT: break;
m = emit_led (100*1000, LED_TIMEOUT_STOP); case LED_TWOSHOTS:
break; emit_led (50*1000, 50*1000);
case LED_TWOSHOTS: emit_led (50*1000, LED_TIMEOUT_STOP);
m = emit_led (50*1000, 50*1000); break;
if (m) case LED_SHOW_STATUS:
break; display_status_code ();
m = emit_led (50*1000, LED_TIMEOUT_STOP); break;
break; case LED_FATAL:
case LED_SHOW_STATUS: display_fatal_code ();
m = display_status_code (); break;
break; case LED_SYNC:
case LED_FATAL: set_led (led_inverted);
display_fatal_code (); break;
break; case LED_GNUK_EXEC:
case LED_SYNC: goto exec;
set_led (led_inverted); default:
m = 0; emit_led (LED_TIMEOUT_ZERO, LED_TIMEOUT_STOP);
break; break;
case LED_GNUK_EXEC: }
goto exec;
default:
m = emit_led (LED_TIMEOUT_ZERO, LED_TIMEOUT_STOP);
break;
}
while (m);
} }
exec: exec:

View File

@@ -3,7 +3,7 @@
#define SIZE_2 4096 #define SIZE_2 4096
#define SIZE_3 (5 * 4096) #define SIZE_3 (5 * 4096)
#else #else
#define SIZE_0 0x0160 /* Main */ #define SIZE_0 0x0150 /* Main */
#define SIZE_1 0x01a0 /* CCID */ #define SIZE_1 0x01a0 /* CCID */
#define SIZE_2 0x0180 /* RNG */ #define SIZE_2 0x0180 /* RNG */
#if MEMORY_SIZE >= 32 #if MEMORY_SIZE >= 32

View File

@@ -1675,12 +1675,12 @@ usb_event_handle (struct usb_dev *dev)
static chopstx_intr_t interrupt; static chopstx_intr_t interrupt;
static chopstx_poll_cond_t cond_poll_desc; static chopstx_poll_cond_t ccid_event_poll_desc;
static struct chx_poll_head *const pd_array[] = { static struct chx_poll_head *const ccid_poll[] = {
(struct chx_poll_head *const)&interrupt, (struct chx_poll_head *const)&interrupt,
(struct chx_poll_head *const)&cond_poll_desc (struct chx_poll_head *const)&ccid_event_poll_desc
}; };
#define PD_SIZE (sizeof (pd_array)/sizeof (struct chx_poll_head *)) #define CCID_POLL_NUM (sizeof (ccid_poll)/sizeof (struct chx_poll_head *))
void * void *
ccid_thread (void *arg) ccid_thread (void *arg)
@@ -1699,6 +1699,8 @@ ccid_thread (void *arg)
chopstx_claim_irq (&interrupt, INTR_REQ_USB); chopstx_claim_irq (&interrupt, INTR_REQ_USB);
usb_event_handle (&dev); /* For old SYS < 3.0 */ usb_event_handle (&dev); /* For old SYS < 3.0 */
eventflag_prepare_poll (&c->ccid_comm, &ccid_event_poll_desc);
reset: reset:
{ {
struct ep_in *epi = &endpoint_in; struct ep_in *epi = &endpoint_in;
@@ -1727,8 +1729,7 @@ ccid_thread (void *arg)
else else
timeout_p = NULL; timeout_p = NULL;
eventflag_prepare_poll (&c->ccid_comm, &cond_poll_desc); chopstx_poll (timeout_p, CCID_POLL_NUM, ccid_poll);
chopstx_poll (timeout_p, PD_SIZE, pd_array);
if (interrupt.ready) if (interrupt.ready)
{ {