Kaynağa Gözat

[BSP] fix the mmu lock issue in ISR of ART-Pi smart bsp.

Bernard Xiong 3 yıl önce
ebeveyn
işleme
4277a65868

+ 14 - 0
bsp/imx6ull-artpi-smart/drivers/board.c

@@ -82,6 +82,19 @@ int board_reboot(int argc, char **argv)
 }
 MSH_CMD_EXPORT_ALIAS(board_reboot, reboot, reboot system);
 
+void assert_handler(const char *ex_string, const char *func, rt_size_t line)
+{
+    volatile char dummy = 0;
+    extern int list_thread(void);
+    extern void rt_backtrace(void);
+
+    list_thread();
+    rt_backtrace();
+    rt_kprintf("(%s) assertion failed at function:%s, line number:%d \n", ex_string, func, line);
+    while (dummy == 0)
+        ;
+}
+
 void rt_hw_board_init(void)
 {
 #ifdef RT_USING_USERSPACE
@@ -109,4 +122,5 @@ void rt_hw_board_init(void)
     rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
 
     rt_thread_idle_sethook(idle_wfi);
+    rt_assert_set_hook(assert_handler);
 }

+ 3 - 2
bsp/imx6ull-artpi-smart/drivers/drv_adc.c

@@ -50,12 +50,13 @@ static rt_err_t imx6ull_adc_convert(struct rt_adc_device *device, rt_uint32_t ch
     return RT_EOK;
 }
 
+#if defined(BSP_USING_ADC1_1) || defined(BSP_USING_ADC1_2) || defined(BSP_USING_ADC1_3) || defined(BSP_USING_ADC1_4)
 static struct rt_adc_ops imx6ull_adc_ops =
 {
     .enabled = imx6ull_adc_enabled,
     .convert = imx6ull_adc_convert,
 };
-
+#endif
 
 int imx6ull_adc_gpio_init(void)
 {
@@ -165,6 +166,7 @@ void set_adc_default(void *parameter)
 {
     int result = 0;
 
+    result = result;
 #ifdef BSP_USING_ADC1_1
     do {
         struct rt_adc_device *device = RT_NULL;
@@ -229,7 +231,6 @@ void set_adc_default(void *parameter)
         rt_kprintf("adc ch4 read result is %d\n",result);
     } while(0);
 #endif
-
 }
 
 static int set_adc_init(void)

+ 11 - 8
bsp/imx6ull-artpi-smart/drivers/drv_i2c.c

@@ -49,8 +49,11 @@ static uint32_t g_MasterCompletionFlag[4] = {0,0,0,0};
 static void i2c_master_callback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData)
 {
     /* Signal transfer success when received success status. */
-    
-    uint32_t instance = I2C_GetInstance(imx6ull_get_periph_paddr((uint32_t)base));
+    struct imx6ull_i2c_config *config;
+
+    config = (struct imx6ull_i2c_config*)userData;
+
+    uint32_t instance = I2C_GetInstance(config->hw_base);
     if (status == kStatus_Success)
     {
         g_MasterCompletionFlag[instance-1] = 1;
@@ -70,7 +73,7 @@ static rt_size_t imx6ull_i2c_mst_xfer(struct rt_i2c_bus_device *bus, struct rt_i
     uint32_t instance = 0;
     i2c_bus = (struct imx6ull_i2c_bus *)bus;
 
-    instance = I2C_GetInstance(imx6ull_get_periph_paddr((uint32_t)i2c_bus->config->I2C));
+    instance = I2C_GetInstance(i2c_bus->config->hw_base);
     for(i = 0 ;i < num; i++)
     {
         if(msgs[i].flags & RT_I2C_RD)
@@ -174,7 +177,8 @@ int rt_hw_i2c_init(void)
     for(int i = 0; i < obj_num; i++)
     {
         i2c_obj[i].config = &i2c_config[i];
-        i2c_obj[i].config->I2C = (I2C_Type *)imx6ull_get_periph_vaddr((rt_uint32_t)(i2c_obj[i].config->I2C));
+        i2c_obj[i].config->hw_base = i2c_obj[i].config->I2C;
+        i2c_obj[i].config->I2C = (I2C_Type *)imx6ull_get_periph_vaddr((rt_uint32_t)i2c_obj[i].config->hw_base);
         i2c_obj[i].parent.ops = &imx6ull_i2c_ops;
         imx6ull_i2c_gpio_init(&i2c_obj[i]);
 
@@ -187,11 +191,10 @@ int rt_hw_i2c_init(void)
 
         rt_i2c_bus_device_register(&i2c_obj[i].parent, i2c_obj[i].config->name);
 
-#ifdef IMX_I2C_IRQ_MODE        
-        I2C_MasterTransferCreateHandle(imx6ull_get_periph_paddr((uint32_t)(i2c_obj[i].config->I2C)), &i2c_obj[i].config->master_handle, i2c_master_callback, NULL);
-        rt_hw_interrupt_install(i2c_obj[i].config->irq_num, (rt_isr_handler_t)I2C_DriverIRQHandler, (void *)i2c_obj[i].config->I2C,i2c_obj[i].config->name);
+#ifdef IMX_I2C_IRQ_MODE
+        I2C_MasterTransferCreateHandle(i2c_obj[i].config->hw_base, &i2c_obj[i].config->master_handle, i2c_master_callback, i2c_obj[i].config);
+        rt_hw_interrupt_install(i2c_obj[i].config->irq_num, (rt_isr_handler_t)I2C_DriverIRQHandler, i2c_obj[i].config, i2c_obj[i].config->name);
 #endif
-
     }
 
     return RT_EOK;

+ 1 - 0
bsp/imx6ull-artpi-smart/drivers/drv_i2c.h

@@ -23,6 +23,7 @@
 
 struct imx6ull_i2c_config
 {
+    void *hw_base;  /* hardware physical address base */
     I2C_Type *I2C;
     char *name;
     rt_uint32_t baud_rate;   

+ 19 - 6
bsp/imx6ull-artpi-smart/drivers/drv_usbd.c

@@ -15,6 +15,9 @@
 #include <usb/device/usb_device_dci.h>
 #include <rtdevice.h>
 #include <imx6ull.h>
+
+#define USB0_IRQNUM 75
+
 /* USB PHY condfiguration */
 #define BOARD_USB_PHY_D_CAL (0x0CU)
 #define BOARD_USB_PHY_TXCAL45DP (0x06U)
@@ -27,9 +30,6 @@ static struct udcd _fsl_udc_0;
 static usb_status_t usb_device_callback(usb_device_handle handle, uint32_t callbackEvent, void *eventParam);
 static usb_status_t usb_device_endpoint_callback(usb_device_handle handle, usb_device_endpoint_callback_message_struct_t *message, void *callbackParam);
 
-#define virtual_to_physical(v) ((void *)((size_t)v + PV_OFFSET))
-#define physical_to_virtual(p) ((void *)((size_t)p - PV_OFFSET))
-
 static void USB_DeviceIsrEnable(uint8_t controllerId)
 {
     uint8_t irqNumber;
@@ -98,9 +98,19 @@ static struct ep_id _ehci0_ep_pool[] =
  *
  * @return None.
  */
-void USB_OTG1_IRQHandler(int irq, void *base)
+static struct rt_workqueue *usb0_wq = NULL;
+static struct rt_work usb0_work;
+void ehci0_work(struct rt_work *work, void *work_data)
 {
     USB_DeviceEhciIsrFunction(ehci0_handle);
+    rt_hw_interrupt_umask(USB0_IRQNUM);
+}
+
+void USB_OTG1_IRQHandler(int irq, void *base)
+{
+    // USB_DeviceEhciIsrFunction(ehci0_handle);
+    rt_hw_interrupt_mask(USB0_IRQNUM);
+    rt_workqueue_dowork(usb0_wq, &usb0_work);
 }
 
 static rt_err_t _ehci0_ep_set_stall(rt_uint8_t address)
@@ -216,8 +226,11 @@ static rt_err_t drv_ehci0_usbd_init(rt_device_t device)
     RT_ASSERT(ehci0_handle);
     if(result == kStatus_USB_Success)
     {
-        rt_hw_interrupt_install(75, USB_OTG1_IRQHandler, (void *)ehci0_handle,"usb1_intr");
-        rt_hw_interrupt_umask(75);
+        usb0_wq = rt_workqueue_create("u0wq", 4096, 3);
+        rt_work_init(&usb0_work, ehci0_work, NULL);
+
+        rt_hw_interrupt_install(USB0_IRQNUM, USB_OTG1_IRQHandler, (void *)ehci0_handle, "usb1_intr");
+        rt_hw_interrupt_umask(USB0_IRQNUM);
         USB_DeviceRun(ehci0_handle);
     }
     else

+ 7 - 3
bsp/imx6ull-artpi-smart/libraries/sdk/devices/MCIMX6Y2/drivers/fsl_i2c.c

@@ -1373,10 +1373,14 @@ void I2C4_DriverIRQHandler(void)
 }
 #endif
 
-extern void *imx6ull_get_periph_paddr(uint32_t vaddr);
+#include <drv_i2c.h>
 void I2C_DriverIRQHandler(int irq, void *base)
 {
+    struct imx6ull_i2c_config *config;
     uint32_t i2c_instance = 0;
-    i2c_instance = I2C_GetInstance(imx6ull_get_periph_paddr((uint32_t)base));
-    I2C_TransferCommonIRQHandler(base, s_i2cHandle[i2c_instance]);
+
+    config = (struct imx6ull_i2c_config*)base;
+
+    i2c_instance = I2C_GetInstance(config->hw_base);
+    I2C_TransferCommonIRQHandler(config->I2C, s_i2cHandle[i2c_instance]);
 }