mirror of
git://projects.qi-hardware.com/ben-wpan.git
synced 2024-11-17 20:09:41 +02:00
libatrf: added HardMAC functions
This function set isn't really usable for real communication. Its main purpose is to help with testing the firmware. - tools/lib/driver.h (struct atrf_driver): added driver functions for HardMAC access - tools/include/atrf.h (atrf_rx_mode, atrf_rx, atrf_tx), tools/lib/atrf.c: functions to enable/disable HardMAC mode and to send/receive frames
This commit is contained in:
parent
c1071309d8
commit
862b554e2d
@ -157,8 +157,8 @@ uint8_t irq_serial;
|
|||||||
ISR(INT0_vect)
|
ISR(INT0_vect)
|
||||||
{
|
{
|
||||||
if (mac_irq) {
|
if (mac_irq) {
|
||||||
mac_irq();
|
if (mac_irq())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (eps[1].state == EP_IDLE) {
|
if (eps[1].state == EP_IDLE) {
|
||||||
led(1);
|
led(1);
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include "mac.h"
|
#include "mac.h"
|
||||||
|
|
||||||
|
|
||||||
void (*mac_irq)(void) = NULL;
|
int (*mac_irq)(void) = NULL;
|
||||||
|
|
||||||
|
|
||||||
static uint8_t rx_buf[MAX_PSDU+2]; /* PHDR+payload+LQ */
|
static uint8_t rx_buf[MAX_PSDU+2]; /* PHDR+payload+LQ */
|
||||||
@ -51,35 +51,30 @@ static void reg_write(uint8_t reg, uint8_t value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void handle_irq(void)
|
static int handle_irq(void)
|
||||||
{
|
{
|
||||||
uint8_t irq;
|
uint8_t irq;
|
||||||
uint8_t size, i;
|
uint8_t size, i;
|
||||||
|
|
||||||
irq = reg_read(REG_IRQ_STATUS);
|
|
||||||
if (!(irq & IRQ_TRX_END))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @@@ we probably also have to handle at least IRQ_PLL_UNLOCK, because
|
|
||||||
* a PLL unlock should cause a transition out of BUSY_TX without
|
|
||||||
* TRX_END.
|
|
||||||
*/
|
|
||||||
if (txing) {
|
if (txing) {
|
||||||
txing = 0;
|
txing = 0;
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
irq = reg_read(REG_IRQ_STATUS);
|
||||||
|
if (!(irq & IRQ_TRX_END))
|
||||||
|
return 1;
|
||||||
|
|
||||||
/* unlikely */
|
/* unlikely */
|
||||||
if (eps[1].state != EP_IDLE)
|
if (eps[1].state != EP_IDLE)
|
||||||
return;
|
return 1;
|
||||||
|
|
||||||
spi_begin();
|
spi_begin();
|
||||||
spi_send(AT86RF230_BUF_READ);
|
spi_send(AT86RF230_BUF_READ);
|
||||||
size = spi_recv();
|
size = spi_recv();
|
||||||
if (size & 0x80) {
|
if (size & 0x80) {
|
||||||
spi_end();
|
spi_end();
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
rx_buf[0] = size;
|
rx_buf[0] = size;
|
||||||
@ -87,6 +82,7 @@ static void handle_irq(void)
|
|||||||
rx_buf[i+1] = spi_recv();
|
rx_buf[i+1] = spi_recv();
|
||||||
spi_end();
|
spi_end();
|
||||||
usb_send(&eps[1], rx_buf, size+2, NULL, NULL);
|
usb_send(&eps[1], rx_buf, size+2, NULL, NULL);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
extern void (*mac_irq)(void);
|
extern int (*mac_irq)(void);
|
||||||
|
|
||||||
int mac_rx(int on);
|
int mac_rx(int on);
|
||||||
int mac_tx(uint16_t flags, uint16_t len);
|
int mac_tx(uint16_t flags, uint16_t len);
|
||||||
|
@ -57,4 +57,10 @@ uint8_t atrf_sram_read(struct atrf_dsc *dsc, uint8_t addr);
|
|||||||
|
|
||||||
int atrf_interrupt_wait(struct atrf_dsc *dsc, int timeout_ms);
|
int atrf_interrupt_wait(struct atrf_dsc *dsc, int timeout_ms);
|
||||||
|
|
||||||
|
/* HardMAC operations */
|
||||||
|
|
||||||
|
void atrf_rx_mode(struct atrf_dsc *dsc, int on);
|
||||||
|
int atrf_rx(struct atrf_dsc *dsc, void *buf, int size, uint8_t *lqi);
|
||||||
|
void atrf_tx(struct atrf_dsc *dsc, const void *buf, int size);
|
||||||
|
|
||||||
#endif /* !ATRF_H */
|
#endif /* !ATRF_H */
|
||||||
|
@ -322,3 +322,25 @@ int atrf_interrupt_wait(struct atrf_dsc *dsc, int timeout_ms)
|
|||||||
{
|
{
|
||||||
return dsc->driver->interrupt_wait(dsc->handle, timeout_ms);
|
return dsc->driver->interrupt_wait(dsc->handle, timeout_ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void atrf_rx_mode(struct atrf_dsc *dsc, int on)
|
||||||
|
{
|
||||||
|
if (dsc->driver->rx_mode)
|
||||||
|
dsc->driver->rx_mode(dsc->handle, on);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int atrf_rx(struct atrf_dsc *dsc, void *buf, int size, uint8_t *lqi)
|
||||||
|
{
|
||||||
|
if (!dsc->driver->rx)
|
||||||
|
return 0;
|
||||||
|
return dsc->driver->rx(dsc->handle, buf, size, lqi);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void atrf_tx(struct atrf_dsc *dsc, const void *buf, int size)
|
||||||
|
{
|
||||||
|
if (dsc->driver->tx)
|
||||||
|
dsc->driver->tx(dsc->handle, buf, size);
|
||||||
|
}
|
||||||
|
@ -36,6 +36,9 @@ struct atrf_driver {
|
|||||||
void (*sram_write)(void *dsc, uint8_t addr, uint8_t value);
|
void (*sram_write)(void *dsc, uint8_t addr, uint8_t value);
|
||||||
uint8_t (*sram_read)(void *dsc, uint8_t addr);
|
uint8_t (*sram_read)(void *dsc, uint8_t addr);
|
||||||
int (*interrupt_wait)(void *dsc, int timeout_ms);
|
int (*interrupt_wait)(void *dsc, int timeout_ms);
|
||||||
|
void (*rx_mode)(void *dsc, int on);
|
||||||
|
int (*rx)(void *dsc, void *buf, int size, uint8_t *lqi);
|
||||||
|
void (*tx)(void *dsc, const void *buf, int size);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user