- Added error checking for trng_get_bytes function;

- Added curly brackets to single line conditions in gpio_qpi.c and gpio_irq_api.c;
- Changed rx and tx buffers in serial module as local variables;
- Minor i2c & spi updates for github pull request;
- Added function definition for spi_master_block_write.
pull/5144/head
Dave Wu 2017-10-09 17:13:58 +11:00
parent d1b81b2161
commit 5ea792cc9a
6 changed files with 74 additions and 27 deletions

View File

@ -71,13 +71,15 @@ void gpio_init(gpio_t *obj, PinName pin)
{
obj->pin = pin;
if (pin == (PinName)NC)
if (pin == (PinName)NC) {
return;
}
// Initialize the GPIO driver. This function
// initializes the GPIO driver only once globally.
if (!gpio_initialized)
if (!gpio_initialized) {
adi_gpio_Init(gpioMemory, ADI_GPIO_MEMORY_SIZE);
}
pin_function(pin, MUX_FUNC_0);
}
@ -134,11 +136,12 @@ int gpio_read(gpio_t *obj)
uint16_t Data;
// check whether the pin is configured as input or output
if ((gpio_oen[port] >> pin_num) & 1)
if ((gpio_oen[port] >> pin_num) & 1) {
Data = gpio_output_val[port] & (1 << pin_num);
else
} else {
// otherwise call GetData
adi_gpio_GetData((ADI_GPIO_PORT)port, (1 << pin_num), &Data);
}
return ((((uint32_t)Data) >> pin_num) & 1);
}

View File

@ -183,8 +183,9 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
uint32_t pin_num = pin & 0xFF;
// check for valid pin and ID
if ((pin == NC) || (id == 0))
if ((pin == NC) || (id == 0)) {
return -1;
}
// make sure gpio driver has been initialized
if (!gpio_initialized) {
@ -193,8 +194,9 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
}
// save the handler
if (handler)
if (handler) {
irq_handler = handler;
}
// disable the interrupt for the given pin
disable_pin_interrupt((ADI_GPIO_PORT)port, pin_num);
@ -242,16 +244,18 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
uint32_t port = obj->pinname >> GPIO_PORT_SHIFT;
uint32_t pin_num = obj->pinname & 0xFF;
if (event == IRQ_NONE)
if (event == IRQ_NONE) {
return;
}
// read the current polarity register
adi_gpio_GetGroupInterruptPolarity((ADI_GPIO_PORT)port, 1 << pin_num, &int_polarity_reg);
if (event == IRQ_RISE)
if (event == IRQ_RISE) {
int_polarity_reg |= (1 << pin_num);
else
} else {
int_polarity_reg &= ~(1 << pin_num);
}
// set the polarity register
adi_gpio_SetGroupInterruptPolarity((ADI_GPIO_PORT)port, int_polarity_reg);
@ -259,10 +263,11 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
channel_ids[port][pin_num].event = event;
// enable interrupt for this pin if enable flag is set
if (enable)
if (enable) {
gpio_irq_enable(obj);
else
} else {
gpio_irq_disable(obj);
}
}
/** Enable GPIO IRQ
@ -275,8 +280,9 @@ void gpio_irq_enable(gpio_irq_t *obj)
uint32_t port = obj->pinname >> GPIO_PORT_SHIFT;
uint32_t pin_num = obj->pinname & 0xFF;
if (channel_ids[port][pin_num].event == IRQ_NONE)
if (channel_ids[port][pin_num].event == IRQ_NONE) {
return;
}
// Group all RISE interrupts in INTA and FALL interrupts in INTB
if (channel_ids[port][pin_num].event == IRQ_RISE) {
@ -302,14 +308,17 @@ void gpio_irq_disable(gpio_irq_t *obj)
uint32_t port = obj->pinname >> GPIO_PORT_SHIFT;
uint32_t pin_num = obj->pinname & 0xFF;
if (channel_ids[port][pin_num].event == IRQ_NONE)
if (channel_ids[port][pin_num].event == IRQ_NONE) {
return;
}
// Group all RISE interrupts in INTA and FALL interrupts in INTB
if (channel_ids[port][pin_num].event == IRQ_RISE)
if (channel_ids[port][pin_num].event == IRQ_RISE) {
disable_pin_interrupt((ADI_GPIO_PORT)port, pin_num);
else if (channel_ids[port][pin_num].event == IRQ_FALL)
}
else if (channel_ids[port][pin_num].event == IRQ_FALL) {
disable_pin_interrupt((ADI_GPIO_PORT)port, pin_num);
}
channel_ids[port][pin_num].int_enable = 0;
}

View File

@ -110,13 +110,15 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
int i2c_start(i2c_t *obj)
{
return 0;
/* The Hardware does not support this feature. */
return -1;
}
int i2c_stop(i2c_t *obj)
{
return 0;
/* The Hardware does not support this feature. */
return -1;
}
@ -204,13 +206,15 @@ void i2c_reset(i2c_t *obj)
int i2c_byte_read(i2c_t *obj, int last)
{
return 0;
/* The Hardware does not support this feature. */
return -1;
}
int i2c_byte_write(i2c_t *obj, int data)
{
return 0;
/* The Hardware does not support this feature. */
return -1;
}
#endif // #if DEVICE_I2C

View File

@ -53,16 +53,16 @@
#include "PeripheralPins.h"
#include "drivers/uart/adi_uart.h"
#define ADI_UART_MEMORY_SIZE (ADI_UART_BIDIR_MEMORY_SIZE)
#define ADI_UART_NUM_DEVICES 2
#define ADI_UART_NUM_DEVICES 2
static ADI_UART_HANDLE hDevice[ADI_UART_NUM_DEVICES];
static ADI_UART_HANDLE hDevice[ADI_UART_NUM_DEVICES];
static uint32_t UartDeviceMem[ADI_UART_NUM_DEVICES][(ADI_UART_MEMORY_SIZE + 3)/4];
static uint32_t serial_irq_ids[ADI_UART_NUM_DEVICES] = {0};
static uart_irq_handler irq_handler = NULL;
int stdio_uart_inited = 0;
serial_t stdio_uart;
int rxbuffer[2];
int txbuffer[2];
static int rxbuffer[2];
static int txbuffer[2];
static void uart_callback(void *pCBParam, uint32_t Event, void *pArg)
{

View File

@ -305,7 +305,28 @@ int spi_master_write(spi_t *obj, int value)
*/
int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, char write_fill)
{
return 0;
ADI_SPI_TRANSCEIVER transceive;
ADI_SPI_HANDLE SPI_Handle;
ADI_SPI_RESULT SPI_Return = ADI_SPI_SUCCESS;
transceive.pReceiver = rx_buffer;
transceive.ReceiverBytes = rx_length; /* link transceive data size to the remaining count */
transceive.nRxIncrement = 1; /* auto increment buffer */
transceive.pTransmitter = tx_buffer; /* initialize data attributes */
transceive.TransmitterBytes = tx_length; /* link transceive data size to the remaining count */
transceive.nTxIncrement = 1; /* auto increment buffer */
transceive.bDMA = false;
transceive.bRD_CTL = false;
SPI_Handle = *obj->pSPI_Handle;
SPI_Return = adi_spi_MasterReadWrite(SPI_Handle, &transceive);
if (SPI_Return) {
obj->error = SPI_EVENT_ERROR;
return -1;
}
else {
return((int)tx_length);
}
}
#endif

View File

@ -88,18 +88,28 @@ int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_l
ADI_RNG_HANDLE RNGhDevice = obj->RNGhDevice;
bool bRNGRdy;
uint32_t nRandomNum, i;
ADI_RNG_RESULT result;
for (i = 0; i < length; i++) {
// Loop until the device has data to be read
do {
adi_rng_GetRdyStatus(RNGhDevice, &bRNGRdy);
result = adi_rng_GetRdyStatus(RNGhDevice, &bRNGRdy);
if (result != ADI_RNG_SUCCESS)
{
return -1;
}
} while (!bRNGRdy);
// Read the RNG
adi_rng_GetRngData(RNGhDevice, &nRandomNum);
result = adi_rng_GetRngData(RNGhDevice, &nRandomNum);
if (result != ADI_RNG_SUCCESS)
{
return -1;
}
// Save the output
output[i] = (uint8_t)nRandomNum;
output[i] = (uint8_t)(nRandomNum & 0xFF);
}
*output_length = length;