mirror of
git://projects.qi-hardware.com/ben-wpan.git
synced 2024-11-25 15:45:56 +02:00
atusb/fw: add EUI64 read and write fw interface to permanently set an EUI64
The kernel driver will now ask for ATUSB_EUI64_READ during init and sets this extended address if available. Use the atusb-eui64 utility from the tools folder to read or set the permanent address. After a new address is set the device will reset to make sure we are in a sane state after the change.
This commit is contained in:
parent
55de8c6373
commit
583a7b72ee
@ -3,6 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Written 2008-2011, 2013 by Werner Almesberger
|
* Written 2008-2011, 2013 by Werner Almesberger
|
||||||
* Copyright 2008-2011, 2013 Werner Almesberger
|
* Copyright 2008-2011, 2013 Werner Almesberger
|
||||||
|
* Copyright 2015-2016 Stefan Schmidt
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -16,6 +17,10 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
#include <avr/eeprom.h>
|
||||||
|
|
||||||
|
#define F_CPU 8000000UL
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
#ifndef NULL
|
#ifndef NULL
|
||||||
#define NULL 0
|
#define NULL 0
|
||||||
@ -44,6 +49,14 @@ static uint8_t buf[MAX_PSDU+3]; /* command, PHDR, and LQI */
|
|||||||
static uint8_t size;
|
static uint8_t size;
|
||||||
|
|
||||||
|
|
||||||
|
static void do_eeprom_write(void *user)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
eeprom_update_byte((uint8_t*)i, buf[i]);
|
||||||
|
}
|
||||||
|
|
||||||
static void do_buf_write(void *user)
|
static void do_buf_write(void *user)
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
@ -246,6 +259,18 @@ static bool my_setup(const struct setup_request *setup)
|
|||||||
return mac_rx(setup->wValue);
|
return mac_rx(setup->wValue);
|
||||||
case ATUSB_TO_DEV(ATUSB_TX):
|
case ATUSB_TO_DEV(ATUSB_TX):
|
||||||
return mac_tx(setup->wValue, setup->wIndex, setup->wLength);
|
return mac_tx(setup->wValue, setup->wIndex, setup->wLength);
|
||||||
|
case ATUSB_TO_DEV(ATUSB_EUI64_WRITE):
|
||||||
|
debug("ATUSB_EUI64_WRITE\n");
|
||||||
|
usb_recv(&eps[0], buf, setup->wLength, do_eeprom_write, NULL);
|
||||||
|
_delay_ms(100);
|
||||||
|
reset_cpu();
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case ATUSB_FROM_DEV(ATUSB_EUI64_READ):
|
||||||
|
debug("ATUSB_EUI64_READ\n");
|
||||||
|
eeprom_read_block(buf, (const void*)0, 8);
|
||||||
|
usb_send(&eps[0], buf, 8, NULL, NULL);
|
||||||
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
error("Unrecognized SETUP: 0x%02x 0x%02x ...\n",
|
error("Unrecognized SETUP: 0x%02x 0x%02x ...\n",
|
||||||
|
@ -46,6 +46,8 @@ enum atusb_requests {
|
|||||||
ATUSB_SPI_WRITE2_SYNC,
|
ATUSB_SPI_WRITE2_SYNC,
|
||||||
ATUSB_RX_MODE = 0x40, /* HardMAC group */
|
ATUSB_RX_MODE = 0x40, /* HardMAC group */
|
||||||
ATUSB_TX,
|
ATUSB_TX,
|
||||||
|
ATUSB_EUI64_WRITE = 0x50, /* Parameter in EEPROM grp */
|
||||||
|
ATUSB_EUI64_READ,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -77,6 +79,8 @@ enum atusb_requests {
|
|||||||
*
|
*
|
||||||
* host-> ATUSB_RX_MODE on - 0
|
* host-> ATUSB_RX_MODE on - 0
|
||||||
* host-> ATUSB_TX flags ack_seq #bytes
|
* host-> ATUSB_TX flags ack_seq #bytes
|
||||||
|
* host-> ATUSB_EUI64_WRITE - - #bytes (8)
|
||||||
|
* ->host ATUSB_EUI64_READ - - #bytes (8)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define ATUSB_REQ_FROM_DEV (USB_TYPE_VENDOR | USB_DIR_IN)
|
#define ATUSB_REQ_FROM_DEV (USB_TYPE_VENDOR | USB_DIR_IN)
|
||||||
|
Loading…
Reference in New Issue
Block a user