blob: 779020a0dd927298e5686a3ae2e02327c6469f96 [file] [log] [blame]
/*
* Copyright (C) 2014, Michele Balistreri
*
* Derived from code originally Copyright (C) 2011, Alex Hornung
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Modified by Qiang Gu(Qiang.Gu@synopsys.com) for embARC
* \version 2017.03
* \date 2016-07-29
*/
/**
* \file
* \ingroup BOARD_EMSK_DRV_RF_MRF24J40
* \brief RF MRF24J40 driver
* \details implement MRF24J40 driver header file
*/
#ifndef _MRF24J40_H_
#define _MRF24J40_H_
#include <stdint.h>
#include <stdbool.h>
#define MRF24J40_RXFIFO_SIZE 144
/* Return values */
#define MRF24J40_INT_RX 0x01
#define MRF24J40_INT_TX 0x02
#define MRF24J40_INT_SEC 0x04
#define MRF24J40_INT_SLP 0x08
#define MRF24J40_INT_ENC 0x10
#define MRF24J40_INT_DEC 0x20
#define MRF24J40_EIO 1
#define MRF24J40_EBUSY 2
/* IEEE 802.15.4 constants needed for some flags */
#define IEEE_802_15_4_HAS_SEC(x) ((x >> 3) & 0x01)
#define IEEE_802_15_4_WANTS_ACK(x) ((x >> 5) & 0x01)
/* enc dec parameters */
#define MRF24J40_TX_KEY 0x01
#define MRF24J40_RX_KEY 0x02
#define MRF24J40_UP_KEY MRF24J40_TX_KEY
#define MRF24J40_AES_CBC_MAC32 0x07
#define MRF24J40_AES_CBC_MAC64 0x06
#define MRF24J40_AES_CBC_MAC128 0x05
#define MRF24J40_AES_CCM32 0x04
#define MRF24J40_AES_CCM64 0x03
#define MRF24J40_AES_CCM128 0x02
#define MRF24J40_AES_CTR 0x01
#define MRF24J40_ALGO_NONE 0x00
/* Short Address Control Register Map */
#define MRF24J40_RXMCR 0x00
#define MRF24J40_PANIDL 0x01
#define MRF24J40_PANIDH 0x02
#define MRF24J40_SADRL 0x03
#define MRF24J40_SADRH 0x04
#define MRF24J40_EADR0 0x05
#define MRF24J40_EADR1 0x06
#define MRF24J40_EADR2 0x07
#define MRF24J40_EADR3 0x08
#define MRF24J40_EADR4 0x09
#define MRF24J40_EADR5 0x0A
#define MRF24J40_EADR6 0x0B
#define MRF24J40_EADR7 0x0C
#define MRF24J40_RXFLUSH 0x0D
#define MRF24J40_ORDER 0x10
#define MRF24J40_TXMCR 0x11
#define MRF24J40_ACKTMOUT 0x12
#define MRF24J40_ESLOTG1 0x13
#define MRF24J40_SYMTICKL 0x14
#define MRF24J40_SYMTICKH 0x15
#define MRF24J40_PACON0 0x16
#define MRF24J40_PACON1 0x17
#define MRF24J40_PACON2 0x18
#define MRF24J40_TXBCON0 0x1A
#define MRF24J40_TXNCON 0x1B
#define MRF24J40_TXG1CON 0x1C
#define MRF24J40_TXG2CON 0x1D
#define MRF24J40_ESLOTG23 0x1E
#define MRF24J40_ESLOTG45 0x1F
#define MRF24J40_ESLOTG67 0x20
#define MRF24J40_TXPEND 0x21
#define MRF24J40_WAKECON 0x22
#define MRF24J40_FRMOFFSET 0x23
#define MRF24J40_TXSTAT 0x24
#define MRF24J40_TXBCON1 0x25
#define MRF24J40_GATECLK 0x26
#define MRF24J40_TXTIME 0x27
#define MRF24J40_HSYMTMRL 0x28
#define MRF24J40_HSYMTMRH 0x29
#define MRF24J40_SOFTRST 0x2A
#define MRF24J40_SECCON0 0x2c
#define MRF24J40_SECCON1 0x2d
#define MRF24J40_TXSTBL 0x2e
#define MRF24J40_RXSR 0x30
#define MRF24J40_INTSTAT 0x31
#define MRF24J40_INTCON 0x32
#define MRF24J40_GPIO 0x33
#define MRF24J40_TRISGPIO 0x34
#define MRF24J40_SLPACK 0x35
#define MRF24J40_RFCTL 0x36
#define MRF24J40_SECCR2 0x37
#define MRF24J40_BBREG0 0x38
#define MRF24J40_BBREG1 0x39
#define MRF24J40_BBREG2 0x3A
#define MRF24J40_BBREG3 0x3B
#define MRF24J40_BBREG4 0x3C
#define MRF24J40_BBREG6 0x3E
#define MRF24J40_CCAEDTH 0x3F
/* Long Address Control Register Map */
#define MRF24J40_RFCON0 0x200
#define MRF24J40_RFCON1 0x201
#define MRF24J40_RFCON2 0x202
#define MRF24J40_RFCON3 0x203
#define MRF24J40_RFCON5 0x205
#define MRF24J40_RFCON6 0x206
#define MRF24J40_RFCON7 0x207
#define MRF24J40_RFCON8 0x208
#define MRF24J40_RFSTATE 0x20F
#define MRF24J40_RSSI 0x210
#define MRF24J40_SLPCON0 0x211
#define MRF24J40_SLPCON1 0x220
#define MRF24J40_WAKETIMEL 0x222
#define MRF24J40_WAKETIMEH 0x223
#define MRF24J40_AINCNT0 0x226
#define MRF24J40_AINCNT1 0x227
#define MRF24J40_AINCNT2 0x228
#define MRF24J40_AINCNT3 0x229
#define MRF24J40_ASSOEADR0 0x230
#define MRF24J40_ASSOEADR1 0x231
#define MRF24J40_ASSOEADR2 0x232
#define MRF24J40_ASSOEADR3 0x233
#define MRF24J40_ASSOEADR4 0x234
#define MRF24J40_ASSOEADR5 0x235
#define MRF24J40_ASSOEADR6 0x236
#define MRF24J40_ASSOEADR7 0x237
#define MRF24J40_ASSOSADR0 0x238
#define MRF24J40_ASSOSADR1 0x239
#define MRF24J40_UPNONCE0 0x240
#define MRF24J40_UPNONCE1 0x241
#define MRF24J40_UPNONCE2 0x242
#define MRF24J40_UPNONCE3 0x243
#define MRF24J40_UPNONCE4 0x244
#define MRF24J40_UPNONCE5 0x245
#define MRF24J40_UPNONCE6 0x246
#define MRF24J40_UPNONCE7 0x247
#define MRF24J40_UPNONCE8 0x248
#define MRF24J40_UPNONCE9 0x249
#define MRF24J40_UPNONCE10 0x24A
#define MRF24J40_UPNONCE11 0x24B
#define MRF24J40_UPNONCE12 0x24C
/* Long Address Memory Map */
#define MRF24J40_TXNFIFO 0x000 /* - 0x07F, 128 bytes */
#define MRF24J40_TXBFIFO 0x080 /* - 0x0FF, 128 bytes */
#define MRF24J40_TXG1FIFO 0x100 /* - 0x17F, 128 bytes */
#define MRF24J40_TXG2FIFO 0x180 /* - 0x1FF, 128 bytes */
#define MRF24J40_SECKFIFO 0x280 /* - 0x2BF, 64 bytes */
#define MRF24J40_SECKTXNFIFO 0x280 /* - 0x28F, 16 bytes */
#define MRF24J40_SECKRXFIFO 0x2B0 /* - 0x2BF, 16 bytes */
#define MRF24J40_RXFIFO 0x300 /* - 0x38F, 144 bytes */
/* RXMCR */
#define MRF24J40_NOACKRSP (1<<5)
#define MRF24J40_PANCOORD (1<<3)
#define MRF24J40_COORD (1<<2)
#define MRF24J40_ERRPKT (1<<1)
#define MRF24J40_PROMI (1)
/* RXFLUSH */
#define MRF24J40_WAKEPOL (1<<6)
#define MRF24J40_WAKEPAD (1<<5)
#define MRF24J40_CMDONLY (1<<3)
#define MRF24J40_DATAONLY (1<<2)
#define MRF24J40_BCNONLY (1<<1)
#define MRF24J40__RXFLUSH (1)
/* TXMCR */
#define MRF24J40_NOCSMA (1<<7)
#define MRF24J40_BATLIFEXT (1<<6)
#define MRF24J40_SLOTTED (1<<5)
#define MRF24J40_MACMINBE(x) ((x & 0x03)<<3)
#define MRF24J40_CSMABF(x) (x & 0x07)
/* ACKTMOUT */
#define MRF24J40_DRPACK (1<<7)
/* PACON2 */
#define MRF24J40_FIFOEN (1<<7)
#define MRF24J40_TXONTS(x) (x & 0x3F)
/* TXNCON */
#define MRF24J40_FPSTAT (1<<4)
#define MRF24J40_INDIRECT (1<<3)
#define MRF24J40_TXNACKREQ (1<<2)
#define MRF24J40_TXNSECEN (1<<1)
#define MRF24J40_TXNTRIG (1)
/* TXPEND */
#define MRF24J40_FPACK (1)
/* WAKECON */
#define MRF24J40_IMMWAKE (1<<7)
#define MRF24J40_REGWAKE (1<<6)
/* TXSTAT */
#define MRF24J40_CCAFAIL (1<<5)
#define MRF24J40_TXNSTAT (1)
/* SOFTRST */
#define MRF24J40_RSTPWR (1<<2)
#define MRF24J40_RSTBB (1<<1)
#define MRF24J40_RSTMAC (1)
/* SECCON0 */
#define MRF24J40_SECIGNORE (1<<7)
#define MRF24J40_SECSTART (1<<6)
#define MRF24J40_RXCIPHER(x) ((x & 0x07) << 3)
#define MRF24J40_TXNCIPHER(x) ((x & 0x07))
/* SECCON1 */
#define MRF24J40_DISDEC (1<<1)
#define MRF24J40_DISENC (1)
/* TXSTBL */
#define MRF24J40_RFSTBL(x) ((x & 0x0f) << 4)
#define MRF24J40_MSIFS(x) ((x & 0x0f))
/* RXSR */
#define MRF24J40_UPSECERR (1<<6)
#define MRF24J40_SECDECERR (1<<2)
/* INTSTAT */
#define MRF24J40_SLPIF (1<<7)
#define MRF24J40_WAKEIF (1<<6)
#define MRF24J40_HSYMTMRIF (1<<5)
#define MRF24J40_SECIF (1<<4)
#define MRF24J40_RXIF (1<<3)
#define MRF24J40_TXG2IF (1<<2)
#define MRF24J40_TXG1IF (1<<1)
#define MRF24J40_TXNIF (1)
/* INTCON */
#define MRF24J40_SLPIE (1<<7)
#define MRF24J40_WAKEIE (1<<6)
#define MRF24J40_HSYMTMRIE (1<<5)
#define MRF24J40_SECIE (1<<4)
#define MRF24J40_RXIE (1<<3)
#define MRF24J40_TXG2IE (1<<2)
#define MRF24J40_TXG1IE (1<<1)
#define MRF24J40_TXNIE (1)
/* SLPACK */
#define MRF24J40__SLPACK (1<<7)
#define MRF24J40_WAKECNT_L(x) (x & 0x03F)
/* RFCTL */
#define MRF24J40_WAKECNT_H(x) ((x & 0x03) << 3)
#define MRF24J40_RFRST (1<<2)
#define MRF24J40_RFTXMODE (1<<1)
#define MRF24J40_RFRXMODE (1)
/* SECCR2 */
#define MRF24J40_UPDEC (1<<7)
#define MRF24J40_UPENC (1<<6)
/* BBREG0 */
#define MRF24J40_TURBO (1)
/* BBREG1 */
#define MRF24J40_RXDECINV (1<<2)
/* BBREG2 */
#define MRF24J40_CCAMODE(x) ((x & 0x03) <<6)
#define MRF24J40_CCASTH(x) ((x & 0x0F) <<2)
/* BBREG3 */
#define MRF24J40_PREVALIDTH(x) ((x & 0x0F) <<4)
/* BBREG4 */
#define MRF24J40_CSTH(x) ((x & 0x07) << 5)
/* BBREG6 */
#define MRF24J40_RSSIMODE1 (1 << 7)
#define MRF24J40_RSSIMODE2 (1<<6)
#define MRF24J40_RSSIRDY (1)
/* RFCON0 */
#define MRF24J40_CHANNEL(x) ((x & 0x0F) << 4)
#define MRF24J40_RFOPT(x) ((x & 0x0F))
/* RFCON1 */
#define MRF24J40_VCOOPT(x) ((x & 0xFF))
/* RFCON2 */
#define MRF24J40_PLLEN (1<<7)
/* RFCON3 */
#define MRF24J40_TXPWRL(x) ((x & 0x03) << 6)
#define MRF24J40_TXPWRS(x) ((x & 0x07) << 3)
/* RFCON6 */
#define MRF24J40_TXFIL (1 << 7)
#define MRF24J40__20MRECVR (1 << 4)
#define MRF24J40_BATEN (1 << 3)
/* RFCON 7 */
#define MRF24J40_SLPCLKSEL(x) ((x & 0x03) << 6)
#define MRF24J40_SLPCLKSEL_100k (MRF24J40_SLPCLKSEL(0x02))
#define MRF24J40_SLPCLKSEL_32k (MRF24J40_SLPCLKSEL(0x01))
/* RFCON8 */
#define MRF24J40_RFVCO (1 << 4)
/* SLPCON0 */
#define MRF24J40_SLPCLKEN (1)
/* SLPCON1 */
#define MRF24J40_CLKOUTDIS (1 << 5) /* CLKOUTEN' */
#define MRF24J40_SLPCLKDIV(x) ((x & 0x1F)) /* division ratio: 2^(SLPCLKDIV) */
#ifdef __cplusplus
extern "C" {
#endif
uint8_t mrf24j40_read_long_ctrl_reg(uint16_t addr);
uint8_t mrf24j40_read_short_ctrl_reg(uint8_t addr);
void mrf24j40_write_long_ctrl_reg(uint16_t addr, uint8_t value);
void mrf24j40_write_short_ctrl_reg(uint8_t addr, uint8_t value);
void mrf24j40_rxfifo_flush(void);
uint8_t mrf24j40_get_pending_frame(void);
void mrf24j40_hard_reset(void);
void mrf24j40_initialize(void);
void mrf24j40_sleep();
void mrf24j40_wakeup();
void mrf24j40_set_short_addr(uint8_t *addr);
void mrf24j40_set_coordinator_short_addr(uint8_t *addr);
void mrf24j40_set_coordinator_eui(uint8_t *eui);
void mrf24j40_set_eui(uint8_t *eui);
void mrf24j40_set_pan(uint8_t *pan);
void mrf24j40_set_key(uint16_t address, uint8_t *key);
#define mrf24j40_tx_key(key) mrf24j40_set_key(SECKTXNFIFO, key);
#define mrf24j40_rx_key(key) mrf24j40_set_key(SECKRXFIFO, key);
void mrf24j40_set_channel(int16_t ch);
void mrf24j40_set_promiscuous(bool crc_check);
void mrf24j40_set_coordinator(void);
void mrf24j40_clear_coordinator(void);
void mrf24j40_txpkt(uint8_t *frame, int16_t hdr_len, int16_t sec_hdr_len, int16_t payload_len);
void mrf24j40_set_cipher(uint8_t rxcipher, uint8_t txcipher);
bool mrf24j40_rx_sec_fail();
uint8_t mrf24j40_get_channel(void);
int16_t mrf24j40_int_tasks(void);
int16_t mrf24j40_rxpkt_intcb(uint8_t *buf, uint8_t *plqi, uint8_t *prssi);
int16_t mrf24j40_txpkt_intcb(void);
void mrf24j40_sec_intcb(bool accept);
void mrf24j40_txfifo_write(uint16_t address, uint8_t *data, uint8_t hdr_len, uint8_t len);
void mrf24j40_transmit(void);
#ifdef __cplusplus
}
#endif
#endif /* _MRF24J40_H_ */