Explorar el Código

Add lock for iomem;Fix spi slave.

xiangbingj hace 6 años
padre
commit
c2ffed1a2a
Se han modificado 2 ficheros con 16 adiciones y 3 borrados
  1. 15 3
      lib/drivers/iomem.c
  2. 1 0
      lib/drivers/spi.c

+ 15 - 3
lib/drivers/iomem.c

@@ -17,8 +17,11 @@ typedef struct _iomem_malloc_t
     uint32_t memtblsize;
     uint16_t *memmap;
     uint8_t  memrdy;
+    _lock_t *lock;
 } iomem_malloc_t;
 
+static _lock_t iomem_lock;
+
 static void iomem_init();
 static uint32_t k_unused();
 extern char *_ioheap_line;
@@ -34,7 +37,8 @@ iomem_malloc_t malloc_cortol =
     0,
     0,
     NULL,
-    0
+    0,
+    &iomem_lock
 };
 
 static void iomem_set(void *s, uint8_t c, uint32_t num)
@@ -134,17 +138,21 @@ void iomem_free(void *paddr)
     uint32_t offset;
     if(paddr == NULL)
         return;
+    _lock_acquire_recursive(malloc_cortol.lock);
     offset=(uintptr_t)paddr - (uintptr_t)malloc_cortol.membase;
     k_free(offset);
+    _lock_release_recursive(malloc_cortol.lock);
 }
 
 void *iomem_malloc(uint32_t size)
 {
+    _lock_acquire_recursive(malloc_cortol.lock);
     uint32_t offset;
     offset=k_malloc(size);
     if(offset == 0XFFFFFFFF)
     {
         printk("IOMEM malloc OUT of MEMORY!\r\n");
+        _lock_release_recursive(malloc_cortol.lock);
          return NULL;
     }
     else 
@@ -154,10 +162,14 @@ void *iomem_malloc(uint32_t size)
             _ioheap_line = (char *)((uintptr_t)malloc_cortol.membase + offset);
             if((uintptr_t)_ioheap_line < (uintptr_t)_heap_line-0x40000000)
             {
-                printk("WARNING: iomem heap line < cache heap line!\r\n");
+                printk("Error: OUT of MEMORY!\r\n");
+                printk("_heap_line = %p\r\n", _heap_line);
+                printk("_ioheap_line = %p\r\n", _ioheap_line);
+                while(1)
+                    ;
             }
         };
-
+        _lock_release_recursive(malloc_cortol.lock);
         return (void*)((uintptr_t)malloc_cortol.membase + offset);
     }
 }

+ 1 - 0
lib/drivers/spi.c

@@ -1270,6 +1270,7 @@ static void spi_slave_command_mode(void)
         return;
     }
     gpiohs_set_pin(g_instance.ready_pin, GPIO_PV_LOW);
+    dmac_wait_done(g_instance.dmac_channel);
 }
 
 static void spi_slave_transfer_mode(void)