#include #include #include #include #include #include #include #include #define BACKLIGHT 12 static CONTEXT_ENTRY(nfc_main) { error_t err; struct device_char_s lcd; struct device_timer_s timer; struct device_pwm_s pwm; dev_timer_delay_t sec; struct dev_pwm_config_s pwm_config; struct device_nfc_s nfc; struct dev_nfc_rq_s req; struct dev_nfc_peer_s peer; char buffer[64]; pwm_config.freq.num = 16000; pwm_config.freq.denom = 1; pwm_config.duty.num = 0; pwm_config.duty.denom = 16; pwm_config.pol = DEV_PWM_POL_HIGH; req.peer = &peer; peer.side = DEV_NFC_PASSIVE_PICC; peer.protocol = DEV_NFC_14443A; peer.atqa = 0; err = device_get_accessor_by_path(&nfc.base, NULL, "/nfc0", DRIVER_CLASS_NFC); assert(!err); err = device_get_accessor_by_path(&lcd.base, NULL, "/lcd*", DRIVER_CLASS_CHAR); assert(!err); err = device_get_accessor_by_path(&pwm.base, NULL, "/pwm*", DRIVER_CLASS_PWM); assert(!err); err = device_get_accessor_by_path(&timer.base, NULL, "/rtc* /timer*", DRIVER_CLASS_TIMER); assert(!err); device_start(&pwm.base); dev_pwm_wait_config(&pwm, &pwm_config, DEV_PWM_MASK_DUTY|DEV_PWM_MASK_FREQ|DEV_PWM_MASK_POL); dev_timer_init_sec(&timer, &sec, 0, 1, 10); while (1) { size_t n; req.type = DEV_NFC_FIND_ANY; err = dev_nfc_wait_request(&nfc, &req); n = snprintf(buffer, sizeof(buffer), "\x1b[2J" "\x1b[0;0H" "Please put a tag", peer.uid, peer.uid_size, peer.sak, peer.atqa); dev_char_wait_op(&lcd, DEV_CHAR_WRITE_FLUSH, (void *)buffer, n); if (err == 0) { pwm_config.duty.num = 16; dev_pwm_wait_config(&pwm, &pwm_config, DEV_PWM_MASK_DUTY); n = snprintf(buffer, sizeof(buffer), "\x1b[2J" "\x1b[0;0H" "UID %08x" "\x1b[1;0H" "SAK %02x ATQA %04x", endian_le32_na_load(peer.uid), peer.sak, peer.atqa); dev_char_wait_op(&lcd, DEV_CHAR_WRITE_FLUSH, (void *)buffer, n); dev_timer_wait_delay(&timer, sec, 0); } else { pwm_config.duty.num = 1; dev_pwm_wait_config(&pwm, &pwm_config, DEV_PWM_MASK_DUTY); } } } void app_start(void) { struct thread_attr_s attr = { .stack_size = 2048, }; thread_create(nfc_main, 0, &attr); }