Towards user-level sdcard driver. Still need to add interrupts to I2C driver and...
authorGerd Zellweger <mail@gerdzellweger.com>
Tue, 2 Jul 2013 13:57:09 +0000 (15:57 +0200)
committerGerd Zellweger <mail@gerdzellweger.com>
Tue, 16 Jul 2013 12:55:00 +0000 (14:55 +0200)
kernel/Hakefile
kernel/arch/omap44xx/startup_arch.c
usr/drivers/omap44xx/mmchs/Hakefile
usr/drivers/omap44xx/mmchs/cm2.c
usr/drivers/omap44xx/mmchs/ctrlmod.c
usr/drivers/omap44xx/mmchs/i2c.c
usr/drivers/omap44xx/mmchs/mmchs.c
usr/drivers/omap44xx/mmchs/twl6030.c
usr/kaluga/driver_startup.c
usr/kaluga/driver_startup.h
usr/kaluga/main.c

index 65b0c82..b29d0b9 100644 (file)
@@ -366,7 +366,7 @@ let
                          "omap/omap44xx_id", 
                          "omap/omap44xx_emif",
                          "omap/omap44xx_gpio"],
-     addLibraries = [ "elf", "cpio", "fdif", "mmchs" ]
+     addLibraries = [ "elf", "cpio" ]
      }                            
   
   ]
index 9049590..e609ed7 100644 (file)
@@ -752,8 +752,6 @@ void arm_kernel_startup(void)
     // FIXME: PS: enable this as it is needed for multicore setup.
     // gic_cpu_interface_enable();
 
-    play_with_fdif();
-
     // Should not return
     printf("Calling dispatch from arm_kernel_startup, start address is=%"PRIxLVADDR"\n",
            get_dispatcher_shared_arm(init_dcb->disp)->enabled_save_area.named.r0);
index 8386f21..205ae23 100644 (file)
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------
 
 [
-    build library { target = "mmchs",
+    build application { target = "mmchs",
                     cFiles = (find withSuffices [".c"]),
                     mackerelDevices = [
                         "ti_i2c",
index fb417b3..60bdd5f 100644 (file)
@@ -64,9 +64,8 @@ void cm2_enable_hsmmc1(void)
     volatile int cm2loop = 0;
     while (omap44xx_l3init_cm2_cm_l3init_hsmmc1_clkctrl_idlest_rdf(&l3init_cm2)!=0) {
         if (++cm2loop>1000) {
-            printf("failed.\n");
-            panic("cm2: MMC power won't come up... "
-                  "Don't know what to do, IDLEST and STBYST are ro");
+            assert(!"cm2: MMC power won't come up... "
+                   "Don't know what to do, IDLEST and STBYST are ro");
         }
     }
     printf("done (%d cycles).\n", cm2loop);
index 22546f5..8ea46c6 100644 (file)
@@ -61,12 +61,12 @@ void sdmmc1_enable_power(void)
 {
     // compare with Table 18-109 in OMAP TRM, p3681
     // Step 1: software must keep PWRDNZ low when setting up voltages
-    printk(LOG_NOTE, "%s: Step 1\n", __FUNCTION__);
+    printf("%s: Step 1\n", __FUNCTION__);
     omap44xx_ctrlmod_PBIASLITE_MMC1_PBIASLITE_PWRDNZ_wrf(&ctrlmod, 0x0);
     omap44xx_ctrlmod_PBIASLITE_MMC1_PWRDNZ_wrf(&ctrlmod, 0x0);
 
     // Step 2: preliminary settings for MMC1_PBIAS and MMC1 I/O cell
-    printk(LOG_NOTE, "%s: Step 2\n", __FUNCTION__);
+    printf("%s: Step 2\n", __FUNCTION__);
     //  1. turn of hiz mode
     omap44xx_ctrlmod_PBIASLITE_MMC1_PBIASLITE_HIZ_MODE_wrf(&ctrlmod, 0x0);
     //  2. setup PBIAS_IRQ (MA_IRQ_75)
@@ -92,7 +92,7 @@ void sdmmc1_enable_power(void)
     assert(err_is_ok(err));
 
     // Step 4: Set VMODE bit according to Step 3 (0x1 == 3.0V)
-    printk(LOG_NOTE, "%s: Step 4\n", __FUNCTION__);
+    printf("%s: Step 4\n", __FUNCTION__);
     omap44xx_ctrlmod_PBIASLITE_MMC1_PBIASLITE_VMODE_wrf(&ctrlmod, omap44xx_ctrlmod_vlt_hi);
 
     // Step 5: wait for SDMMC1_VDDS voltage to stabilize TODO
@@ -100,33 +100,33 @@ void sdmmc1_enable_power(void)
     //ti_twl6030_vmmc_pr();
 
     // Step 6: Disable PWRDNZ mode for MMC1_PBIAS and MMC1 I/O cell
-    printk(LOG_NOTE, "%s: Step 6\n", __FUNCTION__);
+    printf("%s: Step 6\n", __FUNCTION__);
     omap44xx_ctrlmod_PBIASLITE_MMC1_PBIASLITE_PWRDNZ_wrf(&ctrlmod, 0x1);
     omap44xx_ctrlmod_PBIASLITE_MMC1_PWRDNZ_wrf(&ctrlmod, 0x1);
 
     // Step 7: Store SUPPLY_HI_OUT bit
     uint8_t supply_hi_out = 
         omap44xx_ctrlmod_PBIASLITE_MMC1_PBIASLITE_SUPPLY_HI_OUT_rdf(&ctrlmod);
-    printk(LOG_NOTE, "%s: Step 7: supply_hi_out = %d\n", __FUNCTION__, supply_hi_out);
-    printk(LOG_NOTE, "%s: Step 7: vmode_error = %d\n", __FUNCTION__,
+    printf("%s: Step 7: supply_hi_out = %d\n", __FUNCTION__, supply_hi_out);
+    printf("%s: Step 7: vmode_error = %d\n", __FUNCTION__,
             omap44xx_ctrlmod_PBIASLITE_MMC1_PBIASLITE_VMODE_ERROR_rdf(&ctrlmod));
 
     // Wait for Interrupt
-    printk(LOG_NOTE, "Waiting for pbias Interrupt (id=%d)\n", PBIAS_IRQ);
+    printf("Waiting for pbias Interrupt (id=%d)\n", PBIAS_IRQ);
     while(!pbias_got_irq) { }
 
-    printk(LOG_NOTE, "%s: Step 8\n", __FUNCTION__);
+    printf("%s: Step 8\n", __FUNCTION__);
 
     // Step 8: check VMODE_ERROR and set PWRDNZ if error
     if (omap44xx_ctrlmod_PBIASLITE_MMC1_PBIASLITE_VMODE_ERROR_rdf(&ctrlmod)) {
-        printk(LOG_NOTE, "got VMODE error\n");
+        printf("got VMODE error\n");
         omap44xx_ctrlmod_PBIASLITE_MMC1_PWRDNZ_wrf(&ctrlmod, 0x0);
         omap44xx_ctrlmod_PBIASLITE_MMC1_PBIASLITE_PWRDNZ_wrf(&ctrlmod, 0x0);
     }
     
     // Step 9: check if SUPPLY_HI_OUT corresponds to SDMMC1_VDDS (3.0V)
     if (supply_hi_out != omap44xx_ctrlmod_vlt_hi) {
-        printk(LOG_NOTE, "SDMMC1_VDDS seems to be != 3.0V\n");
+        printf("SDMMC1_VDDS seems to be != 3.0V\n");
         // TODO: redo setting SDMMC1_VDDS
     } else {
         // supply_hi_out should be 0x1 (3.0V)
@@ -142,7 +142,7 @@ void sdmmc1_enable_power(void)
 
 void pbias_handle_irq(void)
 {
-    printk(LOG_NOTE, "got pbias interrupt");
+    printf("got pbias interrupt");
 
     // set got-irq flag
     
index d56673c..b10dbaa 100644 (file)
@@ -127,19 +127,19 @@ static inline bool ti_i2c_poll_stat(ti_i2c_t *dev, ti_i2c_irqstatus_t flags,
     uint32_t start_ticks = tsc_read();
     uint32_t ticks;
     int32_t waittime = timeout;
-    printk(LOG_DEBUG, "waittime = %"PRIu32"\n", waittime);
+    printf("waittime = %"PRIu32"\n", waittime);
 
     while (waittime > 0) {
         ti_i2c_irqstatus_t stat = ti_i2c_stat_rd(dev);
-        printk(LOG_DEBUG, "stat = 0x%"PRIx16"\n", stat);
+        printf("stat = 0x%"PRIx16"\n", stat);
         //ti_i2c_stat_pr(prbuf, PBS-1, dev);
         //printf("%s\n", prbuf);
 
         if (stat & ti_i2c_irq_flag_aas) {
             // address recognized as slave interrupt
             if (stat & ti_i2c_irq_flag_rrdy) {
-                printk(LOG_DEBUG, "AAS && RRDY\n");
-                printk(LOG_DEBUG, "data = 0x%"PRIx8"\n", ti_i2c_data_data_rdf(dev));
+                printf("AAS && RRDY\n");
+                printf("data = 0x%"PRIx8"\n", ti_i2c_data_data_rdf(dev));
                 ti_i2c_stat_aas_wrf(dev, 1);
                 ti_i2c_stat_rrdy_wrf(dev, 1);
             }
@@ -152,7 +152,7 @@ static inline bool ti_i2c_poll_stat(ti_i2c_t *dev, ti_i2c_irqstatus_t flags,
         }
         ticks = tsc_read();
         waittime -= (ticks - start_ticks);
-        printk(LOG_DEBUG, "waittime = %"PRIu32"\n", waittime);
+        printf("waittime = %"PRIu32"\n", waittime);
         start_ticks = ticks;
     }
     return false;
@@ -172,11 +172,11 @@ static bool ti_i2c_wait_for_free_bus(ti_i2c_t *dev, int32_t timeout)
 static errval_t
 ti_i2c_read(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
 {
-    printk(LOG_DEBUG, "ti_i2c_read\n");
+    printf("ti_i2c_read\n");
     bool wfb;
     wfb = ti_i2c_wait_for_free_bus(dev, DEFAULT_TIMEOUT);
     if (!wfb) {
-        printk(LOG_ERR, "wait for bus free timed out\n");
+        printf("wait for bus free timed out\n");
         return SYS_ERR_I2C_WAIT_FOR_BUS;
     }
 
@@ -208,19 +208,19 @@ ti_i2c_read(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
     // reading loop
     while (true) {
         // poll for NACK, AL, ARDY, RDR and RRDY
-        printk(LOG_DEBUG, "waiting for 0x%"PRIx16"\n", events);
+        printf("waiting for 0x%"PRIx16"\n", events);
         while(!ti_i2c_poll_stat(dev, events, &retevents, DEFAULT_TIMEOUT)) {
             // poll for receive ready
         }
 
         if (retevents & ti_i2c_irq_flag_al) {
-            printk(LOG_WARN, "arbitration lost\n");
+            printf("arbitration lost\n");
             err = SYS_ERR_I2C_FAILURE;
             break;
         }
 
         if (retevents & ti_i2c_irq_flag_nack) {
-            printk(LOG_WARN, "no ACK from slave\n");
+            printf("no ACK from slave\n");
             err = SYS_ERR_I2C_FAILURE;
             break;
         }
@@ -228,7 +228,7 @@ ti_i2c_read(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
         // check if we have finished
         if (retevents & ti_i2c_irq_flag_ardy) {
             // register access ready --> transaction complete
-            printk(LOG_DEBUG, "ARDY transaction complete\n");
+            printf("ARDY transaction complete\n");
             ti_i2c_stat_ardy_wrf(dev, 1);
             err = SYS_ERR_OK;
             break;
@@ -237,14 +237,14 @@ ti_i2c_read(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
         // read some data
         if (retevents & ti_i2c_irq_flag_rdr) {
             // Receive draining interrupt --> we got the last data bytes
-            printk(LOG_DEBUG, "Receive draining interrupt\n");
+            printf("Receive draining interrupt\n");
 
             /* get the number of bytes in the FIFO */
             amount = ti_i2c_bufstat_rxstat_rdf(dev);
         }
         else if (retevents & ti_i2c_irq_flag_rrdy) {
             // Receive data ready interrupt --> got data
-            printk(LOG_DEBUG, "Receive data ready interrupt\n");
+            printf("Receive data ready interrupt\n");
 
             // get the number of bytes in the FIFO
             amount = ti_i2c_bufstat_rxstat_rdf(dev);
@@ -253,7 +253,7 @@ ti_i2c_read(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
 
         // sanity check we haven't overwritten the array
         if ((sofar + amount) > length) {
-            printk(LOG_WARN, "to many bytes to read\n");
+            printf("to many bytes to read\n");
             amount = (length - sofar);
         }
 
@@ -276,18 +276,18 @@ ti_i2c_write(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
     uint16_t amount = 0, sofar = 0;
     errval_t err = SYS_ERR_OK;
 
-    printk(LOG_DEBUG, "ti_i2c_write(dev, *buf=%"PRIu8", length=%"PRIu16")\n", *buf, length);
+    printf("ti_i2c_write(dev, *buf=%"PRIu8", length=%"PRIu16")\n", *buf, length);
     bool wfb;
     wfb = ti_i2c_wait_for_free_bus(dev, DEFAULT_TIMEOUT);
     if (!wfb) {
-        printk(LOG_ERR, "wait for bus free timed out\n");
+        printf("wait for bus free timed out\n");
         return SYS_ERR_I2C_WAIT_FOR_BUS;
     }
-    printk(LOG_DEBUG, "bus is free, proceeding\n");
+    printf("bus is free, proceeding\n");
 
     // TODO: interrupt-driven?
 
-    //printk(LOG_DEBUG, "AFTER WAIT FOR BUS:\n");
+    //printf("AFTER WAIT FOR BUS:\n");
     //ti_i2c_stat_pr(prbuf, PBS-1, dev);
     //printf("%s\n", prbuf);
 
@@ -297,7 +297,7 @@ ti_i2c_write(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
     ti_i2c_cnt_wr(dev, length);
     ti_i2c_sa_sa_wrf(dev, 0x48);
 
-    //printk(LOG_DEBUG, "AFTER WRITE SETUP:\n");
+    //printf("AFTER WRITE SETUP:\n");
     //ti_i2c_stat_pr(prbuf, PBS-1, dev);
     //printf("%s\n", prbuf);
     // Force write of 1st bit ez
@@ -325,19 +325,19 @@ ti_i2c_write(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
     // writing loop
     while (true) {
         // poll for NACK, AL, ARDY, XDR and XRDY
-        printk(LOG_DEBUG, "waiting for 0x%"PRIx16"\n", events);
+        printf("waiting for 0x%"PRIx16"\n", events);
         while(!ti_i2c_poll_stat(dev, events, &retevents, DEFAULT_TIMEOUT)) {
             // poll for events
         }
 
         if (retevents & ti_i2c_irq_flag_al) {
-            printk(LOG_WARN, "arbitration lost\n");
+            printf("arbitration lost\n");
             err = SYS_ERR_I2C_FAILURE;
             break;
         }
 
         if (retevents & ti_i2c_irq_flag_nack) {
-            printk(LOG_WARN, "no ACK from slave\n");
+            printf("no ACK from slave\n");
             err = SYS_ERR_I2C_FAILURE;
             break;
         }
@@ -346,7 +346,7 @@ ti_i2c_write(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
         if (retevents & ti_i2c_irq_flag_ardy) {
             // register access ready --> transaction complete
             ti_i2c_stat_ardy_wrf(dev, 1);
-            printk(LOG_DEBUG, "ARDY transaction complete\n");
+            printf("ARDY transaction complete\n");
             err = SYS_ERR_OK;
             break;
         }
@@ -354,15 +354,15 @@ ti_i2c_write(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
         // send some data
         if (retevents & ti_i2c_irq_flag_xdr) {
             // transmit draining interrupt --> we are sending the last data bytes
-            printk(LOG_DEBUG, "Receive draining interrupt\n");
+            printf("Receive draining interrupt\n");
 
             /* get the number of bytes that fit in the FIFO */
             amount = ti_i2c_bufstat_txstat_rdf(dev);
-            printk(LOG_DEBUG, "#bytes = %"PRIu16"\n", amount);
+            printf("#bytes = %"PRIu16"\n", amount);
         }
         else if (retevents & ti_i2c_irq_flag_xrdy) {
             // transmit data ready interrupt --> can send data
-            printk(LOG_DEBUG, "Receive data ready interrupt\n");
+            printf("Receive data ready interrupt\n");
 
             // get the number of bytes that fit in the FIFO
             amount = ti_i2c_bufstat_txstat_rdf(dev);
@@ -371,12 +371,12 @@ ti_i2c_write(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
 
         // sanity check so we don't write more bytes than available
         if ((sofar + amount) > length) {
-            printk(LOG_WARN, "truncating length to not access data beyond buf\n");
+            printf("truncating length to not access data beyond buf\n");
             amount = (length - sofar);
         }
 
         // write the bytes to the fifo
-        printk(LOG_DEBUG, "writing %"PRIu16" bytes\n", amount);
+        printf("writing %"PRIu16" bytes\n", amount);
         for (int i = 0; i < amount; i++) {
             ti_i2c_data_data_wrf(dev, buf[sofar++]);
         }
@@ -403,7 +403,7 @@ ti_i2c_write(ti_i2c_t *dev, uint8_t *buf, uint16_t length)
  */
 errval_t ti_i2c_transfer(int devid, struct i2c_msg *msgs, size_t msgcount)
 {
-    printk(LOG_DEBUG, "ti_i2c_transfer\n");
+    printf("ti_i2c_transfer\n");
     if (!i2c_initialized[devid]) {
         return SYS_ERR_I2C_UNINITIALIZED;
     }
index 815f9bd..6f5c866 100644 (file)
@@ -318,7 +318,7 @@ void mmchs_identify_card(void)
     } while (sdhc_stat_cto_rdf(&sdhc)!=0x1);
 
     // We do not check for other cards (i.e. SD v1.x, or unknown cards .. )
-    panic("There is no SD v2 card in the slot .. \n");
+    assert(!"There is no SD v2 card in the slot .. \n");
 }
 
 /*
@@ -372,7 +372,7 @@ void mmchs_send_cmd(int cmd_idx, uint32_t arg)
         if(++loop>10000) {
 
             print_mmchs();
-            panic("mmchs_send_cmd failed, CMDI seems to stick .. ");
+            assert(!"mmchs_send_cmd failed, CMDI seems to stick .. ");
         }
     }
 
@@ -433,7 +433,7 @@ void mmchs_send_cmd(int cmd_idx, uint32_t arg)
         cmd = sdhc_ctm_rsp_type_insert(cmd, 0x0); // R7
         break;
     default:
-        panic("Unknown command .. ");
+        assert(!"Unknown command .. ");
     }
 
     if (1) { // no data
@@ -515,7 +515,7 @@ static int mmchs_finalize_cmd(void)
                     
                     print_mmchs();
                     cm2_debug_print();
-                    panic("mmchs_send_cmd: error - registers got dumped .. ");
+                    assert(!"mmchs_send_cmd: error - registers got dumped .. ");
                 }
             } else {
                 printf("mmchsd_send_cmd: no response \n");
@@ -748,11 +748,11 @@ static void mmchs_configure(void)
         con = omap44xx_mmchs_CON_DW8_insert(con, 0x0); // must be 0 for SD cards
         break;
     case 8:
-        panic("DW8=1 (a bus width of 8) is not supported for SD cards");
+        assert(!"DW8=1 (a bus width of 8) is not supported for SD cards");
         con = omap44xx_mmchs_CON_DW8_insert(con, 0x1);
         break;
     default:
-        panic("Given bus width not supported\n");
+        assert(!"Given bus width not supported\n");
     }
     
     // Write configuration
@@ -783,7 +783,7 @@ static void mmchs_configure(void)
         if (++sdbp_loop>1000) {
             printf("\n");
             print_mmchs();
-            panic("Timeout in setting SDBP");
+            assert(!"Timeout in setting SDBP");
         }
         mmchs_wait_msec(1);
     }
@@ -871,7 +871,7 @@ void mmchs_init(void)
         printf("SD Host Specification Version 2.0\n");
         break;
     default:
-        panic("Don't understand SREV field");
+        assert(!"Don't understand SREV field");
     }
     
 
index 79ee0b5..1ddec05 100644 (file)
@@ -35,7 +35,7 @@ static inline uint8_t _ti_twl6030_id1_read_8(void *d, size_t off)
 
     errval_t err;
 
-    printk(LOG_NOTE, "id1_read_8(reg=0x%"PRIx8")\n", reg);
+    printf("id1_read_8(reg=0x%"PRIx8")\n", reg);
 
     /* set register to read from */
     msg[0].slave = ID1_I2C_ADDR;
@@ -51,7 +51,7 @@ static inline uint8_t _ti_twl6030_id1_read_8(void *d, size_t off)
     err = ti_i2c_transfer(I2C_HC, msg, 2);
 
     if (err_is_fail(err)) {
-        printk(LOG_NOTE, "ti_i2c_transfer: %"PRIuERRV"\n", err);
+        printf("ti_i2c_transfer: %"PRIuERRV"\n", err);
         return 0;
     }
 
@@ -76,7 +76,7 @@ static inline void _ti_twl6030_id1_write_8(void *d, size_t off, uint8_t regval)
     err = ti_i2c_transfer(I2C_HC, &msg, 1);
 
     if (err_is_fail(err)) {
-        printk(LOG_ERR, "ti_i2c_transfer failed in mackerel: %"PRIuERRV"\n", err);
+        printf("ti_i2c_transfer failed in mackerel: %"PRIuERRV"\n", err);
     }
 
     return;
@@ -90,7 +90,7 @@ static ti_twl6030_t twl;
 
 void ti_twl6030_init(void)
 {
-    printk(LOG_NOTE, "twl init\n");
+    printf("twl init\n");
     //ti_twl6030_initialize(&twl, 0x0);
 
     // initialize I2C1 host controller
@@ -99,9 +99,9 @@ void ti_twl6030_init(void)
     //printf("read VMMC_CFG_VOLTAGE %"PRIu8"\n", _ti_twl6030_id1_read_8(NULL, 0x9B));
 
     //ti_twl6030_vmmc_pr();
-    /*printk(LOG_NOTE, "scanning TWL\n");
+    /*printf("scanning TWL\n");
     ti_twl6030_scan();
-    printk(LOG_NOTE, "after scan\n");*/
+    printf("after scan\n");*/
 }
 
 void ti_twl6030_vmmc_pr(void)
@@ -123,7 +123,7 @@ void ti_twl6030_scan(void)
 
         errval_t err = ti_i2c_transfer(I2C_HC, &msg, 1);
         if (err_is_ok(err)) {
-            printk(LOG_NOTE, "found subdev at 0x%x\n", base + i);
+            printf("found subdev at 0x%x\n", base + i);
         }
     }
     return;
@@ -185,14 +185,14 @@ static ti_twl6030_vsel_t millis_to_vsel(int millis)
         case 3300:
             return ti_twl6030_v3v3;
         default:
-            printk(LOG_WARN, "voltage (%d) not available, returning 0.0V\n", millis);
+            printf("voltage (%d) not available, returning 0.0V\n", millis);
             return ti_twl6030_v0v0;
     }
 }
 
 errval_t ti_twl6030_set_vmmc_vsel(int millis)
 {
-    printk(LOG_NOTE, "ti_twl6030_vmmc_vsel\n");
+    printf("ti_twl6030_vmmc_vsel\n");
 
     ti_twl6030_vsel_t vsel = millis_to_vsel(millis);
     
index b97e897..22468f6 100644 (file)
@@ -88,6 +88,40 @@ errval_t start_networking(coreid_t core, struct module_info* driver,
     return err;
 }
 
+errval_t start_sdcard(void)
+{
+    errval_t err, error_code;
+    struct capref requested_caps;
+    static char* binary = "mmchs";
+
+    struct module_info* driver = find_module(binary);
+    if (driver == NULL || !is_auto_driver(driver)) {
+        KALUGA_DEBUG("%s not found or not declared as auto.", binary);
+        return KALUGA_ERR_DRIVER_NOT_AUTO;
+    }
+
+    struct monitor_blocking_rpc_client *cl = get_monitor_blocking_rpc_client();
+    assert(cl != NULL);
+    err = cl->vtbl.get_io_cap(cl, &requested_caps, &error_code);
+    assert(err_is_ok(err) && err_is_ok(error_code));
+
+    struct capref device_range_cap = NULL_CAP;
+    err = slot_alloc(&device_range_cap);
+    assert (err_is_ok(err));
+    err = cap_retype(device_range_cap, requested_caps, ObjType_DevFrame, 29);
+    assert (err_is_ok(err));
+
+    err = spawn_program_with_caps(0, driver->path, driver->argv, environ,
+            NULL_CAP, device_range_cap, 0, &driver->did);
+    if (err_is_fail(err)) {
+        DEBUG_ERR(err, "Spawning %s failed.", driver->path);
+        return err;
+    }
+
+    return SYS_ERR_OK;
+}
+
+
 errval_t start_usb_manager(void)
 {
 
index 2339bff..e6f973b 100644 (file)
@@ -9,4 +9,6 @@ errval_t default_start_function(coreid_t, struct module_info*, char*);
 errval_t start_networking(coreid_t, struct module_info*, char*);
 
 errval_t start_usb_manager(void);
+errval_t start_sdcard(void);
+
 #endif /* DRIVER_STARTUP_H_ */
index 7c030db..5cd6890 100644 (file)
@@ -120,7 +120,8 @@ int main(int argc, char** argv)
 #ifdef __arm__
     debug_printf("Kaluga running on ARM. Skipping cores(), pci_root_bridge(), ...\n");
 
-    start_usb_manager();
+    err = start_sdcard();
+    assert(err_is_ok(err));
 #else
 
     err = watch_for_cores();