aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrieder Schrempf <frieder.schrempf@kontron.de>2021-03-11 09:50:20 +0100
committerKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>2023-08-18 12:09:03 +0200
commit77d54f5addc58ba609a556cab8a399db510b370c (patch)
treec5b8af6bc5348be8a3e891902d44dd144978a2e2
parent7ae9d474617b67b17f407ba3a01e88d7a5dd75f9 (diff)
downloadneard-77d54f5addc58ba609a556cab8a399db510b370c.tar.gz
tag: Implement readout of tag UID via DBus interface
This adds a 'Uid' property to the DBus interface for tags, which returns the UID of the tag as byte array. Signed-off-by: Frieder Schrempf <frieder.schrempf@kontron.de> Link: https://lore.kernel.org/r/20210311085020.429987-1-frieder.schrempf@kontron.de Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
-rw-r--r--src/tag.c57
1 files changed, 54 insertions, 3 deletions
diff --git a/src/tag.c b/src/tag.c
index ce8c477..44646d5 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -53,6 +53,7 @@ struct near_tag {
uint8_t nfcid_len;
uint8_t iso15693_dsfid;
+ uint8_t iso15693_uid_len;
uint8_t iso15693_uid[NFC_MAX_ISO15693_UID_LEN];
size_t data_length;
@@ -168,6 +169,29 @@ static const char *type_string(struct near_tag *tag)
return type;
}
+static const uint8_t uid_array(struct near_tag *tag, uint8_t **uid)
+{
+ if (tag->nfcid_len) {
+ DBG("NFCID: ");
+ for(int i = 0; i < tag->nfcid_len; i++)
+ DBG("%x", tag->nfcid[i]);
+
+ *uid = tag->nfcid;
+
+ return tag->nfcid_len;
+ } else if (tag->iso15693_uid_len) {
+ DBG("ISO-UID: ");
+ for(int i = 0; i < tag->iso15693_uid_len; i++)
+ DBG("%x", tag->iso15693_uid[i]);
+
+ *uid = tag->iso15693_uid;
+
+ return tag->iso15693_uid_len;
+ }
+
+ return 0;
+}
+
static const char *protocol_string(struct near_tag *tag)
{
const char *protocol;
@@ -219,6 +243,30 @@ static gboolean property_get_type(const GDBusPropertyTable *property,
return TRUE;
}
+static gboolean property_get_uid(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *user_data)
+{
+ struct near_tag *tag = user_data;
+ DBusMessageIter entry;
+ uint8_t *uid;
+ uint8_t len;
+
+ len = uid_array(tag, &uid);
+ if (!uid || !len)
+ return FALSE;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+ "{y}", &entry);
+
+ for (int i = 0; i < len; i++)
+ dbus_message_iter_append_basic(&entry, DBUS_TYPE_BYTE,
+ (void *)&uid[i]);
+
+ dbus_message_iter_close_container(iter, &entry);
+
+ return TRUE;
+}
+
static gboolean property_get_protocol(const GDBusPropertyTable *property,
DBusMessageIter *iter, void *user_data)
{
@@ -524,6 +572,7 @@ static const GDBusPropertyTable tag_properties[] = {
{ "Protocol", "s", property_get_protocol },
{ "ReadOnly", "b", property_get_readonly },
{ "Adapter", "o", property_get_adapter },
+ { "Uid", "ay", property_get_uid },
{ }
};
@@ -669,8 +718,10 @@ static int tag_initialize(struct near_tag *tag,
if (nfcid_len && nfcid_len <= NFC_MAX_NFCID1_LEN) {
tag->nfcid_len = nfcid_len;
memcpy(tag->nfcid, nfcid, nfcid_len);
- } else if (iso15693_uid_len) {
+ } else if (iso15693_uid_len &&
+ iso15693_uid_len <= NFC_MAX_ISO15693_UID_LEN) {
tag->iso15693_dsfid = iso15693_dsfid;
+ tag->iso15693_uid_len = iso15693_uid_len;
memcpy(tag->iso15693_uid, iso15693_uid, iso15693_uid_len);
}
@@ -835,11 +886,11 @@ uint8_t *near_tag_get_iso15693_uid(uint32_t adapter_idx, uint32_t target_idx)
if (!tag)
goto fail;
- iso15693_uid = g_try_malloc0(NFC_MAX_ISO15693_UID_LEN);
+ iso15693_uid = g_try_malloc0(tag->iso15693_uid_len);
if (!iso15693_uid)
goto fail;
- memcpy(iso15693_uid, tag->iso15693_uid, NFC_MAX_ISO15693_UID_LEN);
+ memcpy(iso15693_uid, tag->iso15693_uid, tag->iso15693_uid_len);
return iso15693_uid;