My apology that I have to continue the discussion from the old thread: (http://sel4.systems/pipermail/devel/2016-October/001056.html).
My goal is to read and write data from/to micro sd in SabreLite platform.
I tried both Adrain and Anna's suggestions in that thread and they dont seem to fix the problem. Nothing returns error and I also changed cacheable parameter in sel4utils_new_pages_at_vaddr to 0 (I believe this is what Anna meant instead of setting 3rd argument of vspace_new_pages).

The code's still stuck inside mmc_block_read function. I tracked it down and it seems like BRR and BWR interrupt statuses are never set to 1
I add my code below, please let me know if anything is wrong with my code.

    ps_io_mapper_t io_mapper = {0};
    error = sel4platsupport_new_io_mapper(simple, vspace, vka, &io_mapper);
    assert(error == 0);

    ps_io_ops_t io_ops = {
        .io_mapper = io_mapper
    };

    sdio_host_dev_t* dev = (sdio_host_dev_t*) malloc(sizeof(*dev));
    assert(dev != NULL);
    memset(dev, 0, sizeof(*dev));

    enum sdio_id id = sdio_default_id(); // return id=3
    error = sdio_init(id, &io_ops, dev);
    assert(error == 0);

    mmc_card_t* mmc_card = (mmc_card_t*) malloc(sizeof(*mmc_card));
    error = mmc_init(dev, &io_ops, mmc_card);
    assert(error == 0 && mmc_card != NULL);
    void *vaddr = vspace_new_pages(&vspace, seL4_AllRights, 5, seL4_PageBits);
    assert(vaddr != NULL);
    uintptr_t paddr = 0;
    printf("mmc card capacity %llu bytes\n", mmc_card_capacity(*mmc_card));	
    long read_len = mmc_block_read(*mmc_card, 0x50000, 1, vaddr, paddr, NULL, NULL); // Stuck here
    printf("read %lu bytes\n", read_len);


Thanks
Oak



--
Norrathep (Oak) Rattanavipanon
M.S. in Computer Science
University of California - Irvine