From 5320f2ac196e784c795f622b3dcf24b1aac94b96 Mon Sep 17 00:00:00 2001
From: "ucart@co3050-12" <dawehr@iastate.edu>
Date: Sat, 22 Apr 2017 14:05:23 -0500
Subject: [PATCH] wip: addressing more issues with new uart

---
 .../real_quad/src/hw_impl_zybo.c              |  7 +----
 .../real_quad/src/hw_impl_zybo_imu.c          |  5 ++--
 .../real_quad/src/hw_impl_zybo_uart.c         | 26 +++++++++----------
 quad/xsdk_workspace/real_quad/src/main.c      |  4 +--
 4 files changed, 17 insertions(+), 25 deletions(-)

diff --git a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo.c b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo.c
index 093b67ef7..df4cd13a3 100644
--- a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo.c
+++ b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo.c
@@ -5,12 +5,7 @@ struct UARTDriver create_zybo_uart(int devId) {
   uart.state = malloc(sizeof(struct ZyboUARTState));
   struct ZyboUARTState *state = uart.state;
   state->inst = malloc(sizeof(XUartPs));
-
-  // We are cheating. We put the Queue on the callback field,
-  // because that was the only way we could get the Queue
-  // into the interupt handler. And the callback field was a void
-  // pointer so we can do whatever we want with it...
-  state->inst->CallBackRef = queue_malloc(MAX_UART_BUFFER_SIZE);
+  state->queue = queue_malloc(MAX_UART_BUFFER_SIZE);
   state->devId = devId;
 
   uart.reset = zybo_uart_reset;
diff --git a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c
index 3bfc6c08d..67177ace7 100644
--- a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c
+++ b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c
@@ -57,8 +57,7 @@ int mpu9150_read_mag(struct IMUDriver *self, gam_t* gam);
 int mpu9150_read_gyro_accel(gam_t* gam);
 
 int zybo_imu_reset(struct IMUDriver *self, gam_t *gam) {
-  // TODO: initialize gam
-	 memset(gam, 0, sizeof(gam_t));
+  memset(gam, 0, sizeof(gam_t));
 
   struct I2CDriver *i2c = self->i2c;
 
@@ -143,7 +142,7 @@ int mpu9150_write(struct I2CDriver *i2c, u8 register_addr, u8 data){
 
   // Check if within register range
   if(register_addr < 0 || register_addr > 0x75){
-    return;
+    return -1;
   }
 
   if(register_addr <= 0x12){
diff --git a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_uart.c b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_uart.c
index dd9a2ca17..940ef0abb 100644
--- a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_uart.c
+++ b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_uart.c
@@ -4,9 +4,8 @@
 
 
 int XUartPs_SetBaudRate_ours(XUartPs *InstancePtr, u32 BaudRate);
-void uart_interrupt_handler(XUartPs *InstancePtr);
-int SetupInterruptSystem(XUartPs *UartInstancePtr, u16 UartIntrId, Xil_ExceptionHandler handler);
-void uart_interrupt_handler(XUartPs *InstancePtr);
+int SetupInterruptSystem(XUartPs *UartInstancePtr, u16 UartIntrId, Xil_ExceptionHandler handler, struct ZyboUARTState *state);
+void uart_interrupt_handler(struct ZyboUARTState *state);
 
 int zybo_uart_reset(struct UARTDriver *self) {
   // Ensure all required memory is allocated
@@ -33,7 +32,7 @@ int zybo_uart_reset(struct UARTDriver *self) {
   *uart_ctrl_reg |= 0x00000003; // clear TX & RX
 
   // Setup Interrupts
-  if (SetupInterruptSystem(inst, XPAR_PS7_UART_0_INTR, (Xil_ExceptionHandler) uart_interrupt_handler) != XST_SUCCESS) {
+  if (SetupInterruptSystem(inst, XPAR_PS7_UART_0_INTR, (Xil_ExceptionHandler) uart_interrupt_handler, state) != XST_SUCCESS) {
     return -1;
   }
 
@@ -60,16 +59,16 @@ int zybo_uart_reset(struct UARTDriver *self) {
   return 0;
 }
 
-int zybo_uart_write(struct UARTDriver *self, unsigned char c) {\
-  XUartPs *inst = self->state;
+int zybo_uart_write(struct UARTDriver *self, unsigned char c) {
+  struct ZyboUARTState *state = self->state;
+  XUartPs *inst = state->inst;
   XUartPs_SendByte(inst->Config.BaseAddress, c);
   return 0;
 }
 
 int zybo_uart_read(struct UARTDriver *self, unsigned char *c) {
   struct ZyboUARTState *state = self->state;
-  // We put the queue on the void pointer callback reference
-  struct Queue *queue = state->inst->CallBackRef;
+  struct Queue *queue = state->queue;
   if (queue_remove(queue, c)) return -1;
   else return 0;
 }
@@ -183,11 +182,10 @@ int XUartPs_SetBaudRate_ours(XUartPs *InstancePtr, u32 BaudRate)
 
 }
 
-void uart_interrupt_handler(XUartPs *InstancePtr) {
+void uart_interrupt_handler(struct ZyboUARTState *state) {
   u32 IsrStatus;
-
-  // We put the queue on the void pointer callback reference
-  struct Queue *queue = InstancePtr->CallBackRef;
+  XUartPs *InstancePtr = state->inst;
+  struct Queue *queue = state->queue;
 
   /*
    * Read the interrupt ID register to determine which
@@ -236,7 +234,7 @@ void uart_interrupt_handler(XUartPs *InstancePtr) {
 * @note		None.
 *
 ****************************************************************************/
-int SetupInterruptSystem(XUartPs *UartInstancePtr, u16 UartIntrId, Xil_ExceptionHandler handler)
+int SetupInterruptSystem(XUartPs *UartInstancePtr, u16 UartIntrId, Xil_ExceptionHandler handler, struct ZyboUARTState *state)
 {
 	int Status;
 	XScuGic xscugic;
@@ -269,7 +267,7 @@ int SetupInterruptSystem(XUartPs *UartInstancePtr, u16 UartIntrId, Xil_Exception
 	 */
 	Status = XScuGic_Connect(&xscugic, UartIntrId,
 				  handler,
-				  (void *) UartInstancePtr);
+				  (void *) state);
 	if (Status != XST_SUCCESS) {
 		return XST_FAILURE;
 	}
diff --git a/quad/xsdk_workspace/real_quad/src/main.c b/quad/xsdk_workspace/real_quad/src/main.c
index 599a602d3..ee7e493f4 100644
--- a/quad/xsdk_workspace/real_quad/src/main.c
+++ b/quad/xsdk_workspace/real_quad/src/main.c
@@ -51,12 +51,12 @@ int main()
   //test_zybo_i2c_imu();
   //test_zybo_i2c_px4flow();
   //test_zybo_i2c_lidar();
-  test_zybo_i2c_all();
+  //test_zybo_i2c_all();
   //test_zybo_rc_receiver();
   //test_zybo_motors();
   //test_zybo_uart();
   //test_zybo_axi_timer();
-  //test_zybo_uart();
+  test_zybo_uart_comm();
   return 0;
 #endif
 
-- 
GitLab