samples: mgmt/osdp: Add new OSDP PD sample

This commit adds a PD sample for drivers/osdp. It receives OSDP commands
and prints a message to console.

Signed-off-by: Siddharth Chandrasekaran <siddharth@embedjournal.com>
This commit is contained in:
Siddharth Chandrasekaran 2020-06-29 11:08:41 +05:30 committed by Carles Cufí
parent 9a91b4adf9
commit 0ae2f2f2f8
4 changed files with 120 additions and 0 deletions

View file

@ -0,0 +1,12 @@
#
# Copyright (c) 2020 Siddharth Chandrasekaran <siddharth@embedjournal.com>
#
# SPDX-License-Identifier: Apache-2.0
#
cmake_minimum_required(VERSION 3.13.1)
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
project(osdp_sample)
target_sources(app PRIVATE src/main.c)

View file

@ -0,0 +1,26 @@
.. _osdp-sample:
OSDP
####
OSDP describes the communication interface one or more Peripheral Devices (PD)
to a Control Panel (CP). The specification describes the protocol
implementation over a two-wire RS-485 multi-drop serial communication channel.
Nevertheless, this protocol can be used to transfer secure byte stream over any
physical channel in low memory embedded devices.
Although OSDP is steered towards the Access and Security industries, it can be
used as a general communication protocol for devices in a secure way without
too much resource requirements. The security is not top-notch (AES-128) but it
is reasonable enough, given that the alternative is no security at all.
OSDP Supports the control of the following components on a PD:
- LED
- Buzzer
- Keypad
- Output (GPIOs)
- Input Control (GPIOs)
- Displays
- Device status (tamper, power, etc.,)
- Card Reader
- Fingerprint Reader

View file

@ -0,0 +1,11 @@
#
# Copyright (c) 2020 Siddharth Chandrasekaran <siddharth@embedjournal.com>
#
# SPDX-License-Identifier: Apache-2.0
#
CONFIG_PRINTK=y
CONFIG_LOG=y
# OSDP config
CONFIG_OSDP=y

View file

@ -0,0 +1,71 @@
/*
* Copyright (c) 2020 Siddharth Chandrasekaran <siddharth@embedjournal.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr.h>
#include <device.h>
#include <drivers/gpio.h>
#include <mgmt/osdp.h>
/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)
#if DT_NODE_HAS_STATUS(LED0_NODE, okay)
#define LED0 DT_GPIO_LABEL(LED0_NODE, gpios)
#define PIN DT_GPIO_PIN(LED0_NODE, gpios)
#if DT_PHA_HAS_CELL(LED0_NODE, gpios, flags)
#define FLAGS DT_GPIO_FLAGS(LED0_NODE, gpios)
#endif
#else
#error "BOARD does not define a debug LED"
#define LED0 ""
#define PIN 0
#endif
#ifndef FLAGS
#define FLAGS 0
#endif
#define SLEEP_TIME_MS 10
int cmd_handler(struct osdp_cmd *p)
{
printk("App received command %d\n", p->id);
return 0;
}
void main(void)
{
int ret, led_state;
uint32_t cnt = 0;
struct device *dev;
struct osdp_cmd cmd;
dev = device_get_binding(LED0);
if (dev == NULL) {
printk("Failed to get LED0 binding\n");
return;
}
ret = gpio_pin_configure(dev, PIN, GPIO_OUTPUT_ACTIVE | FLAGS);
if (ret < 0) {
printk("Failed to configure gpio pin\n");
return;
}
led_state = 0;
while (1) {
if ((cnt & 0x7f) == 0x7f) {
/* show a sign of life */
led_state = !led_state;
}
if (osdp_pd_get_cmd(&cmd) == 0) {
cmd_handler(&cmd);
}
gpio_pin_set(dev, PIN, led_state);
k_msleep(SLEEP_TIME_MS);
cnt++;
}
}