Newer
Older
#include <mutek/startup.h>
#include <mutek/thread.h>
#include <mutek/printk.h>
#include <device/class/char.h>
#include <device/class/timer.h>
#include <device/class/pwm.h>
#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);
err = device_get_accessor_by_path(&pwm.base, NULL, "/pwm*", DRIVER_CLASS_PWM);
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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 = {
};
thread_create(nfc_main, 0, &attr);
}