mirror of
https://github.com/apache/nuttx.git
synced 2026-06-04 23:03:27 +08:00
wireless/ieee802.15.4: Refactors ieee802154_dev character driver to be radio802154_device
This commit is contained in:
@@ -1,9 +1,10 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* drivers/ieee802154/ieee802154_device.c
|
* drivers/ieee802154/radio802154_device.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014-2015 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2014-2015 Gregory Nutt. All rights reserved.
|
||||||
* Copyright (C) 2014-2015 Sebastien Lorquet. All rights reserved.
|
* Copyright (C) 2014-2015 Sebastien Lorquet. All rights reserved.
|
||||||
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
|
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
|
||||||
|
* Author: Anthony Merlino <anthony@vergeaero.com>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -56,7 +57,7 @@
|
|||||||
* Private Types
|
* Private Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
struct ieee802154_devwrapper_s
|
struct radio802154_devwrapper_s
|
||||||
{
|
{
|
||||||
FAR struct ieee802154_radio_s *child;
|
FAR struct ieee802154_radio_s *child;
|
||||||
sem_t devsem; /* Device access serialization semaphore */
|
sem_t devsem; /* Device access serialization semaphore */
|
||||||
@@ -67,28 +68,28 @@ struct ieee802154_devwrapper_s
|
|||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void ieee802154dev_semtake(FAR struct ieee802154_devwrapper_s *dev);
|
static void radio802154dev_semtake(FAR struct radio802154_devwrapper_s *dev);
|
||||||
static int ieee802154dev_open(FAR struct file *filep);
|
static int radio802154dev_open(FAR struct file *filep);
|
||||||
static int ieee802154dev_close(FAR struct file *filep);
|
static int radio802154dev_close(FAR struct file *filep);
|
||||||
static ssize_t ieee802154dev_read(FAR struct file *filep, FAR char *buffer,
|
static ssize_t radio802154dev_read(FAR struct file *filep, FAR char *buffer,
|
||||||
size_t len);
|
size_t len);
|
||||||
static ssize_t ieee802154dev_write(FAR struct file *filep,
|
static ssize_t radio802154dev_write(FAR struct file *filep,
|
||||||
FAR const char *buffer, size_t len);
|
FAR const char *buffer, size_t len);
|
||||||
static int ieee802154dev_ioctl(FAR struct file *filep, int cmd,
|
static int radio802154dev_ioctl(FAR struct file *filep, int cmd,
|
||||||
unsigned long arg);
|
unsigned long arg);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Data
|
* Private Data
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static const struct file_operations ieee802154dev_fops =
|
static const struct file_operations radio802154dev_fops =
|
||||||
{
|
{
|
||||||
ieee802154dev_open , /* open */
|
radio802154dev_open , /* open */
|
||||||
ieee802154dev_close, /* close */
|
radio802154dev_close, /* close */
|
||||||
ieee802154dev_read , /* read */
|
radio802154dev_read , /* read */
|
||||||
ieee802154dev_write, /* write */
|
radio802154dev_write, /* write */
|
||||||
NULL, /* seek */
|
NULL, /* seek */
|
||||||
ieee802154dev_ioctl /* ioctl */
|
radio802154dev_ioctl /* ioctl */
|
||||||
#ifndef CONFIG_DISABLE_POLL
|
#ifndef CONFIG_DISABLE_POLL
|
||||||
, NULL /* poll */
|
, NULL /* poll */
|
||||||
#endif
|
#endif
|
||||||
@@ -102,14 +103,14 @@ static const struct file_operations ieee802154dev_fops =
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ieee802154dev_semtake
|
* Name: radio802154dev_semtake
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Acquire the semaphore used for access serialization.
|
* Acquire the semaphore used for access serialization.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void ieee802154dev_semtake(FAR struct ieee802154_devwrapper_s *dev)
|
static void radio802154dev_semtake(FAR struct radio802154_devwrapper_s *dev)
|
||||||
{
|
{
|
||||||
/* Take the semaphore (perhaps waiting) */
|
/* Take the semaphore (perhaps waiting) */
|
||||||
|
|
||||||
@@ -124,30 +125,30 @@ static void ieee802154dev_semtake(FAR struct ieee802154_devwrapper_s *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ieee802154dev_semgive
|
* Name: radio802154dev_semgive
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Release the semaphore used for access serialization.
|
* Release the semaphore used for access serialization.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static inline void ieee802154dev_semgive(FAR struct ieee802154_devwrapper_s *dev)
|
static inline void radio802154dev_semgive(FAR struct radio802154_devwrapper_s *dev)
|
||||||
{
|
{
|
||||||
sem_post(&dev->devsem);
|
sem_post(&dev->devsem);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ieee802154dev_open
|
* Name: radio802154dev_open
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Open the MRF24J40 device.
|
* Open the 802.15.4 radio character device.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int ieee802154dev_open(FAR struct file *filep)
|
static int radio802154dev_open(FAR struct file *filep)
|
||||||
{
|
{
|
||||||
FAR struct inode *inode;
|
FAR struct inode *inode;
|
||||||
FAR struct ieee802154_devwrapper_s *dev;
|
FAR struct radio802154_devwrapper_s *dev;
|
||||||
|
|
||||||
DEBUGASSERT(filep != NULL && filep->f_inode != NULL);
|
DEBUGASSERT(filep != NULL && filep->f_inode != NULL);
|
||||||
inode = filep->f_inode;
|
inode = filep->f_inode;
|
||||||
@@ -156,7 +157,7 @@ static int ieee802154dev_open(FAR struct file *filep)
|
|||||||
|
|
||||||
/* Get exclusive access to the driver data structures */
|
/* Get exclusive access to the driver data structures */
|
||||||
|
|
||||||
ieee802154dev_semtake(dev);
|
radio802154dev_semtake(dev);
|
||||||
|
|
||||||
if (dev->opened)
|
if (dev->opened)
|
||||||
{
|
{
|
||||||
@@ -174,22 +175,22 @@ static int ieee802154dev_open(FAR struct file *filep)
|
|||||||
dev->opened = true;
|
dev->opened = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ieee802154dev_semgive(dev);
|
radio802154dev_semgive(dev);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ieee802154dev_close
|
* Name: radio802154dev_close
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Close the MRF24J40 device.
|
* Close the 802.15.4 radio character device.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int ieee802154dev_close(FAR struct file *filep)
|
static int radio802154dev_close(FAR struct file *filep)
|
||||||
{
|
{
|
||||||
FAR struct inode *inode;
|
FAR struct inode *inode;
|
||||||
FAR struct ieee802154_devwrapper_s *dev;
|
FAR struct radio802154_devwrapper_s *dev;
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
|
||||||
DEBUGASSERT(filep != NULL && filep->f_inode != NULL);
|
DEBUGASSERT(filep != NULL && filep->f_inode != NULL);
|
||||||
@@ -199,7 +200,7 @@ static int ieee802154dev_close(FAR struct file *filep)
|
|||||||
|
|
||||||
/* Get exclusive access to the driver data structures */
|
/* Get exclusive access to the driver data structures */
|
||||||
|
|
||||||
ieee802154dev_semtake(dev);
|
radio802154dev_semtake(dev);
|
||||||
|
|
||||||
if (!dev->opened)
|
if (!dev->opened)
|
||||||
{
|
{
|
||||||
@@ -217,12 +218,12 @@ static int ieee802154dev_close(FAR struct file *filep)
|
|||||||
dev->opened = false;
|
dev->opened = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ieee802154dev_semgive(dev);
|
radio802154dev_semgive(dev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ieee802154dev_read
|
* Name: radio802154dev_read
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Return the last received packet.
|
* Return the last received packet.
|
||||||
@@ -231,10 +232,10 @@ static int ieee802154dev_close(FAR struct file *filep)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static ssize_t ieee802154dev_read(FAR struct file *filep, FAR char *buffer, size_t len)
|
static ssize_t radio802154dev_read(FAR struct file *filep, FAR char *buffer, size_t len)
|
||||||
{
|
{
|
||||||
FAR struct inode *inode;
|
FAR struct inode *inode;
|
||||||
FAR struct ieee802154_devwrapper_s *dev;
|
FAR struct radio802154_devwrapper_s *dev;
|
||||||
FAR struct ieee802154_packet_s *buf;
|
FAR struct ieee802154_packet_s *buf;
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
|
||||||
@@ -285,21 +286,21 @@ done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ieee802154dev_write
|
* Name: radio802154dev_write
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Send a packet immediately.
|
* Send a packet immediately.
|
||||||
* TODO: Put a packet in the send queue. The packet will be sent as soon
|
* TODO: Put a packet in the send queue. The packet will be sent as soon
|
||||||
* as possible. The buffer must point to a struct ieee802154_packet_s
|
* as possible. The buffer must point to a struct radio802154_packet_s
|
||||||
* with the correct length.
|
* with the correct length.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static ssize_t ieee802154dev_write(FAR struct file *filep,
|
static ssize_t radio802154dev_write(FAR struct file *filep,
|
||||||
FAR const char *buffer, size_t len)
|
FAR const char *buffer, size_t len)
|
||||||
{
|
{
|
||||||
FAR struct inode *inode;
|
FAR struct inode *inode;
|
||||||
FAR struct ieee802154_devwrapper_s *dev;
|
FAR struct radio802154_devwrapper_s *dev;
|
||||||
FAR struct ieee802154_packet_s *packet;
|
FAR struct ieee802154_packet_s *packet;
|
||||||
FAR struct timespec timeout;
|
FAR struct timespec timeout;
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
@@ -364,18 +365,18 @@ done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ieee802154dev_ioctl
|
* Name: radio802154dev_ioctl
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Control the MRF24J40 device. This is where the real operations happen.
|
* Control the MRF24J40 device. This is where the real operations happen.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int ieee802154dev_ioctl(FAR struct file *filep, int cmd,
|
static int radio802154dev_ioctl(FAR struct file *filep, int cmd,
|
||||||
unsigned long arg)
|
unsigned long arg)
|
||||||
{
|
{
|
||||||
FAR struct inode *inode;
|
FAR struct inode *inode;
|
||||||
FAR struct ieee802154_devwrapper_s *dev;
|
FAR struct radio802154_devwrapper_s *dev;
|
||||||
FAR struct ieee802154_radio_s *child;
|
FAR struct ieee802154_radio_s *child;
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
|
||||||
@@ -466,30 +467,35 @@ static int ieee802154dev_ioctl(FAR struct file *filep, int cmd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ieee802154dev_register
|
* Name: radio802154dev_register
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Register /dev/ieee%d
|
* Register a character driver to access the IEEE 802.15.4 radio from
|
||||||
|
* user-space
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* radio - Pointer to the radio struct to be registerd.
|
||||||
|
* devname - The name of the IEEE 802.15.4 radio to be registered.
|
||||||
|
*
|
||||||
|
* Returned Values:
|
||||||
|
* Zero (OK) is returned on success. Otherwise a negated errno value is
|
||||||
|
* returned to indicate the nature of the failure.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int ieee802154_register(FAR struct ieee802154_radio_s *ieee,
|
int radio802154dev_register(FAR struct ieee802154_radio_s *radio, FAR char *devname)
|
||||||
unsigned int minor)
|
|
||||||
{
|
{
|
||||||
FAR struct ieee802154_devwrapper_s *dev;
|
FAR struct radio802154_devwrapper_s *dev;
|
||||||
char devname[16];
|
|
||||||
|
|
||||||
dev = kmm_zalloc(sizeof(struct ieee802154_devwrapper_s));
|
dev = kmm_zalloc(sizeof(struct radio802154_devwrapper_s));
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
{
|
{
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->child = ieee;
|
dev->child = radio;
|
||||||
|
|
||||||
sem_init(&dev->devsem, 0, 1); /* Allow the device to be opened once before blocking */
|
sem_init(&dev->devsem, 0, 1); /* Allow the device to be opened once before blocking */
|
||||||
|
|
||||||
sprintf(devname, "/dev/ieee%d", minor);
|
return register_driver(devname, &radio802154dev_fops, 0666, dev);
|
||||||
|
|
||||||
return register_driver(devname, &ieee802154dev_fops, 0666, dev);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user