亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sd.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 3 頁
字號:
        printf("SD: GEN_CMD 0x%08x\n", req.arg);        switch (sd->state) {        case sd_transfer_state:            sd->data_offset = 0;            if (req.arg & 1)                sd->state = sd_sendingdata_state;            else                sd->state = sd_receivingdata_state;            return sd_r1;        default:            break;        }        break;    default:    bad_cmd:        sd->card_status |= ILLEGAL_COMMAND;        printf("SD: Unknown CMD%i\n", req.cmd);        return sd_r0;    unimplemented_cmd:        /* Commands that are recognised but not yet implemented in SPI mode.  */        sd->card_status |= ILLEGAL_COMMAND;        printf ("SD: CMD%i not implemented in SPI mode\n", req.cmd);        return sd_r0;    }    sd->card_status |= ILLEGAL_COMMAND;    printf("SD: CMD%i in a wrong state\n", req.cmd);    return sd_r0;}static sd_rsp_type_t sd_app_command(SDState *sd,                                    struct sd_request_s req) {    uint32_t rca;    if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)        rca = req.arg >> 16;    DPRINTF("ACMD%d 0x%08x\n", req.cmd, req.arg);    switch (req.cmd) {    case 6:	/* ACMD6:  SET_BUS_WIDTH */        switch (sd->state) {        case sd_transfer_state:            sd->sd_status[0] &= 0x3f;            sd->sd_status[0] |= (req.arg & 0x03) << 6;            return sd_r1;        default:            break;        }        break;    case 13:	/* ACMD13: SD_STATUS */        switch (sd->state) {        case sd_transfer_state:            sd->data_start = 0;            sd->data_offset = 0;            return sd_r1;        default:            break;        }        break;    case 22:	/* ACMD22: SEND_NUM_WR_BLOCKS */        switch (sd->state) {        case sd_transfer_state:            *(uint32_t *) sd->data = sd->blk_written;            sd->data_start = 0;            sd->data_offset = 0;            return sd_r1;        default:            break;        }        break;    case 23:	/* ACMD23: SET_WR_BLK_ERASE_COUNT */        switch (sd->state) {        case sd_transfer_state:            return sd_r1;        default:            break;        }        break;    case 41:	/* ACMD41: SD_APP_OP_COND */        if (sd->spi) {            /* SEND_OP_CMD */            sd->state = sd_transfer_state;            return sd_r1;        }        switch (sd->state) {        case sd_idle_state:            /* We accept any voltage.  10000 V is nothing.  */            if (req.arg)                sd->state = sd_ready_state;            return sd_r3;        default:            break;        }        break;    case 42:	/* ACMD42: SET_CLR_CARD_DETECT */        switch (sd->state) {        case sd_transfer_state:            /* Bringing in the 50KOhm pull-up resistor... Done.  */            return sd_r1;        default:            break;        }        break;    case 51:	/* ACMD51: SEND_SCR */        switch (sd->state) {        case sd_transfer_state:            sd->state = sd_sendingdata_state;            sd->data_start = 0;            sd->data_offset = 0;            return sd_r1;        default:            break;        }        break;    default:        /* Fall back to standard commands.  */        sd->card_status &= ~APP_CMD;        return sd_normal_command(sd, req);    }    printf("SD: ACMD%i in a wrong state\n", req.cmd);    return sd_r0;}int sd_do_command(SDState *sd, struct sd_request_s *req,                  uint8_t *response) {    uint32_t last_status = sd->card_status;    sd_rsp_type_t rtype;    int rsplen;    if (!bdrv_is_inserted(sd->bdrv)) {        return 0;    }    if (sd_req_crc_validate(req)) {        sd->card_status &= ~COM_CRC_ERROR;        return 0;    }    sd->card_status &= ~CARD_STATUS_B;    sd_set_status(sd);    if (last_status & CARD_IS_LOCKED)        if (((last_status & APP_CMD) &&                                 req->cmd == 41) ||                        (!(last_status & APP_CMD) &&                         (sd_cmd_class[req->cmd] == 0 ||                          sd_cmd_class[req->cmd] == 7 ||                          req->cmd == 16 || req->cmd == 55))) {            sd->card_status |= ILLEGAL_COMMAND;            printf("SD: Card is locked\n");            return 0;        }    if (last_status & APP_CMD) {        rtype = sd_app_command(sd, *req);        sd->card_status &= ~APP_CMD;    } else        rtype = sd_normal_command(sd, *req);    sd->current_cmd = req->cmd;    switch (rtype) {    case sd_r1:    case sd_r1b:        sd_response_r1_make(sd, response, last_status);        rsplen = 4;        break;    case sd_r2_i:        memcpy(response, sd->cid, sizeof(sd->cid));        rsplen = 16;        break;    case sd_r2_s:        memcpy(response, sd->csd, sizeof(sd->csd));        rsplen = 16;        break;    case sd_r3:        sd_response_r3_make(sd, response);        rsplen = 4;        break;    case sd_r6:        sd_response_r6_make(sd, response);        rsplen = 4;        break;    case sd_r7:        sd_response_r7_make(sd, response);        rsplen = 4;        break;    case sd_r0:    default:        rsplen = 0;        break;    }    if (sd->card_status & ILLEGAL_COMMAND)        rsplen = 0;#ifdef DEBUG_SD    if (rsplen) {        int i;        DPRINTF("Response:");        for (i = 0; i < rsplen; i++)            printf(" %02x", response[i]);        printf(" state %d\n", sd->state);    } else {        DPRINTF("No response %d\n", sd->state);    }#endif    return rsplen;}/* No real need for 64 bit addresses here */static void sd_blk_read(SDState *sd, uint32_t addr, uint32_t len){    uint32_t end = addr + len;    if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {        printf("sd_blk_read: read error on host side\n");        return;    }    if (end > (addr & ~511) + 512) {        memcpy(sd->data, sd->buf + (addr & 511), 512 - (addr & 511));        if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) {            printf("sd_blk_read: read error on host side\n");            return;        }        memcpy(sd->data + 512 - (addr & 511), sd->buf, end & 511);    } else        memcpy(sd->data, sd->buf + (addr & 511), len);}static void sd_blk_write(SDState *sd, uint32_t addr, uint32_t len){    uint32_t end = addr + len;    if ((addr & 511) || len < 512)        if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {            printf("sd_blk_write: read error on host side\n");            return;        }    if (end > (addr & ~511) + 512) {        memcpy(sd->buf + (addr & 511), sd->data, 512 - (addr & 511));        if (bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {            printf("sd_blk_write: write error on host side\n");            return;        }        if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) {            printf("sd_blk_write: read error on host side\n");            return;        }        memcpy(sd->buf, sd->data + 512 - (addr & 511), end & 511);        if (bdrv_write(sd->bdrv, end >> 9, sd->buf, 1) == -1)            printf("sd_blk_write: write error on host side\n");    } else {        memcpy(sd->buf + (addr & 511), sd->data, len);        if (!sd->bdrv || bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1)            printf("sd_blk_write: write error on host side\n");    }}#define BLK_READ_BLOCK(a, len)	sd_blk_read(sd, a, len)#define BLK_WRITE_BLOCK(a, len)	sd_blk_write(sd, a, len)#define APP_READ_BLOCK(a, len)	memset(sd->data, 0xec, len)#define APP_WRITE_BLOCK(a, len)void sd_write_data(SDState *sd, uint8_t value){    int i;    if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv))        return;    if (sd->state != sd_receivingdata_state) {        printf("sd_write_data: not in Receiving-Data state\n");        return;    }    if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))        return;    switch (sd->current_cmd) {    case 24:	/* CMD24:  WRITE_SINGLE_BLOCK */        sd->data[sd->data_offset ++] = value;        if (sd->data_offset >= sd->blk_len) {            /* TODO: Check CRC before committing */            sd->state = sd_programming_state;            BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);            sd->blk_written ++;            sd->csd[14] |= 0x40;            /* Bzzzzzzztt .... Operation complete.  */            sd->state = sd_transfer_state;        }        break;    case 25:	/* CMD25:  WRITE_MULTIPLE_BLOCK */        sd->data[sd->data_offset ++] = value;        if (sd->data_offset >= sd->blk_len) {            /* TODO: Check CRC before committing */            sd->state = sd_programming_state;            BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);            sd->blk_written ++;            sd->data_start += sd->blk_len;            sd->data_offset = 0;            if (sd->data_start + sd->blk_len > sd->size) {                sd->card_status |= ADDRESS_ERROR;                break;            }            if (sd_wp_addr(sd, sd->data_start)) {                sd->card_status |= WP_VIOLATION;                break;            }            sd->csd[14] |= 0x40;            /* Bzzzzzzztt .... Operation complete.  */            sd->state = sd_receivingdata_state;        }        break;    case 26:	/* CMD26:  PROGRAM_CID */        sd->data[sd->data_offset ++] = value;        if (sd->data_offset >= sizeof(sd->cid)) {            /* TODO: Check CRC before committing */            sd->state = sd_programming_state;            for (i = 0; i < sizeof(sd->cid); i ++)                if ((sd->cid[i] | 0x00) != sd->data[i])                    sd->card_status |= CID_CSD_OVERWRITE;            if (!(sd->card_status & CID_CSD_OVERWRITE))                for (i = 0; i < sizeof(sd->cid); i ++) {                    sd->cid[i] |= 0x00;                    sd->cid[i] &= sd->data[i];                }            /* Bzzzzzzztt .... Operation complete.  */            sd->state = sd_transfer_state;        }        break;    case 27:	/* CMD27:  PROGRAM_CSD */        sd->data[sd->data_offset ++] = value;        if (sd->data_offset >= sizeof(sd->csd)) {            /* TODO: Check CRC before committing */            sd->state = sd_programming_state;            for (i = 0; i < sizeof(sd->csd); i ++)                if ((sd->csd[i] | sd_csd_rw_mask[i]) !=                    (sd->data[i] | sd_csd_rw_mask[i]))                    sd->card_status |= CID_CSD_OVERWRITE;            /* Copy flag (OTP) & Permanent write protect */            if (sd->csd[14] & ~sd->data[14] & 0x60)                sd->card_status |= CID_CSD_OVERWRITE;            if (!(sd->card_status & CID_CSD_OVERWRITE))                for (i = 0; i < sizeof(sd->csd); i ++) {                    sd->csd[i] |= sd_csd_rw_mask[i];                    sd->csd[i] &= sd->data[i];                }            /* Bzzzzzzztt .... Operation complete.  */            sd->state = sd_transfer_state;        }        break;    case 42:	/* CMD42:  LOCK_UNLOCK */        sd->data[sd->data_offset ++] = value;        if (sd->data_offset >= sd->blk_len) {            /* TODO: Check CRC before committing */            sd->state = sd_programming_state;            sd_lock_command(sd);            /* Bzzzzzzztt .... Operation complete.  */            sd->state = sd_transfer_state;        }        break;    case 56:	/* CMD56:  GEN_CMD */        sd->data[sd->data_offset ++] = value;        if (sd->data_offset >= sd->blk_len) {            APP_WRITE_BLOCK(sd->data_start, sd->data_offset);            sd->state = sd_transfer_state;        }        break;    default:        printf("sd_write_data: unknown command\n");        break;    }}uint8_t sd_read_data(SDState *sd){    /* TODO: Append CRCs */    uint8_t ret;    if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv))        return 0x00;    if (sd->state != sd_sendingdata_state) {        printf("sd_read_data: not in Sending-Data state\n");        return 0x00;    }    if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))        return 0x00;    switch (sd->current_cmd) {    case 6:	/* CMD6:   SWITCH_FUNCTION */        ret = sd->data[sd->data_offset ++];        if (sd->data_offset >= 64)            sd->state = sd_transfer_state;        break;    case 9:	/* CMD9:   SEND_CSD */    case 10:	/* CMD10:  SEND_CID */        ret = sd->data[sd->data_offset ++];        if (sd->data_offset >= 16)            sd->state = sd_transfer_state;        break;    case 11:	/* CMD11:  READ_DAT_UNTIL_STOP */        if (sd->data_offset == 0)            BLK_READ_BLOCK(sd->data_start, sd->blk_len);        ret = sd->data[sd->data_offset ++];        if (sd->data_offset >= sd->blk_len) {            sd->data_start += sd->blk_len;            sd->data_offset = 0;            if (sd->data_start + sd->blk_len > sd->size) {                sd->card_status |= ADDRESS_ERROR;                break;            }        }        break;    case 13:	/* ACMD13: SD_STATUS */        ret = sd->sd_status[sd->data_offset ++];        if (sd->data_offset >= sizeof(sd->sd_status))            sd->state = sd_transfer_state;        break;    case 17:	/* CMD17:  READ_SINGLE_BLOCK */        if (sd->data_offset == 0)            BLK_READ_BLOCK(sd->data_start, sd->blk_len);        ret = sd->data[sd->data_offset ++];        if (sd->data_offset >= sd->blk_len)            sd->state = sd_transfer_state;        break;    case 18:	/* CMD18:  READ_MULTIPLE_BLOCK */        if (sd->data_offset == 0)            BLK_READ_BLOCK(sd->data_start, sd->blk_len);        ret = sd->data[sd->data_offset ++];        if (sd->data_offset >= sd->blk_len) {            sd->data_start += sd->blk_len;            sd->data_offset = 0;            if (sd->data_start + sd->blk_len > sd->size) {                sd->card_status |= ADDRESS_ERROR;                break;            }        }        break;    case 22:	/* ACMD22: SEND_NUM_WR_BLOCKS */        ret = sd->data[sd->data_offset ++];        if (sd->data_offset >= 4)            sd->state = sd_transfer_state;        break;    case 30:	/* CMD30:  SEND_WRITE_PROT */        ret = sd->data[sd->data_offset ++];        if (sd->data_offset >= 4)            sd->state = sd_transfer_state;        break;    case 51:	/* ACMD51: SEND_SCR */        ret = sd->scr[sd->data_offset ++];        if (sd->data_offset >= sizeof(sd->scr))            sd->state = sd_transfer_state;        break;    case 56:	/* CMD56:  GEN_CMD */        if (sd->data_offset == 0)            APP_READ_BLOCK(sd->data_start, sd->blk_len);        ret = sd->data[sd->data_offset ++];        if (sd->data_offset >= sd->blk_len)            sd->state = sd_transfer_state;        break;    default:        printf("sd_read_data: unknown command\n");        return 0x00;    }    return ret;}int sd_data_ready(SDState *sd){    return sd->state == sd_sendingdata_state;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区在| 欧美日韩一区国产| 色综合中文字幕国产 | 亚洲天堂福利av| 看片网站欧美日韩| 一区二区三区国产精华| 欧美色国产精品| 久久亚区不卡日本| 亚洲国产一区二区三区青草影视| 亚洲欧美一区二区三区国产精品| 亚洲va韩国va欧美va| 九一九一国产精品| 一区二区三区中文在线| 奇米色777欧美一区二区| 亚洲黄色片在线观看| 一区二区三区成人在线视频 | 欧美一区中文字幕| 国产精品三级在线观看| 亚洲精品免费一二三区| 福利视频网站一区二区三区| 欧美色综合影院| 亚洲丝袜美腿综合| 久久99国产精品麻豆| 欧美丝袜丝交足nylons| 国产精品剧情在线亚洲| 亚洲激情欧美激情| 欧美三区免费完整视频在线观看| 精品1区2区在线观看| 日韩欧美成人午夜| 亚洲美女在线国产| 国产综合久久久久久鬼色| 69精品人人人人| 有码一区二区三区| 日本精品一级二级| 99久久精品国产毛片| 欧美日韩一级片网站| 久久久久久久综合日本| 一区av在线播放| 在线一区二区三区| 日韩丝袜情趣美女图片| 亚洲天堂成人在线观看| 欧美人狂配大交3d怪物一区| 亚洲成人精品影院| 亚洲成人激情自拍| 欧美精品自拍偷拍动漫精品| 极品销魂美女一区二区三区| 欧美日韩一区二区三区四区五区| 99久久精品国产毛片| 欧美xxxxxxxx| 一区二区三区四区亚洲| 欧美专区亚洲专区| 亚洲六月丁香色婷婷综合久久| 色婷婷久久综合| 国产九色sp调教91| 欧美日韩精品一区二区三区蜜桃| 日韩**一区毛片| 欧美一区二区三区在线| 国产精品亚洲а∨天堂免在线| 欧美不卡一区二区三区| 成人激情小说网站| a级精品国产片在线观看| 久久久久久久久一| 色爱区综合激月婷婷| 91在线视频播放| 国产精品自拍av| 99久久国产综合色|国产精品| 久久国产尿小便嘘嘘尿| 国产成人av影院| 丝袜美腿亚洲一区| 中文久久乱码一区二区| 久久久五月婷婷| 成人黄色777网| 精品国产成人系列| 国产精品午夜春色av| 亚洲自拍偷拍图区| 本田岬高潮一区二区三区| 亚洲mv大片欧洲mv大片精品| 91精品国产综合久久精品| 亚洲天堂成人网| 精品在线亚洲视频| 极品销魂美女一区二区三区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 91免费国产在线| www国产成人免费观看视频 深夜成人网| 久久久九九九九| 国产精品亚洲专一区二区三区 | 色综合视频一区二区三区高清| 99久久婷婷国产综合精品电影 | av福利精品导航| 欧美一区在线视频| 亚洲精品免费电影| 日本午夜精品一区二区三区电影 | 国产在线视频精品一区| 国产精品小仙女| 欧美日韩高清影院| 久久女同精品一区二区| 亚洲精品欧美激情| 琪琪久久久久日韩精品| 日韩一区二区影院| 天堂一区二区在线免费观看| 色视频欧美一区二区三区| 精品久久国产97色综合| 亚州成人在线电影| 欧美日产国产精品| 国产精品久久久久久亚洲伦| 粉嫩av一区二区三区在线播放| 一区二区三区色| 精品在线视频一区| 国产福利精品一区| 久久天天做天天爱综合色| 国产精品久线观看视频| 偷拍一区二区三区| 国产女人18毛片水真多成人如厕| 在线播放日韩导航| 不卡一卡二卡三乱码免费网站| 亚洲欧美另类小说视频| 国产精品久久三区| 久久在线观看免费| 欧美成人乱码一区二区三区| 欧美色视频一区| 96av麻豆蜜桃一区二区| 99精品一区二区| 国产福利一区在线| 狠狠色丁香久久婷婷综| 亚洲超碰97人人做人人爱| 亚洲欧美日韩在线| 亚洲一区二区三区美女| 日韩一区在线看| 欧美成va人片在线观看| 国产欧美日韩亚州综合 | 欧美三级中文字幕在线观看| 国产成人午夜99999| 美女视频黄a大片欧美| 美女一区二区三区| 日韩在线观看一区二区| 蜜桃一区二区三区在线观看| 日韩综合在线视频| 日韩国产成人精品| 国产精品一区二区在线播放 | 午夜伊人狠狠久久| 亚洲国产毛片aaaaa无费看 | 国产在线精品国自产拍免费| 亚洲第一电影网| 久久精品72免费观看| 久久激情综合网| 成人网页在线观看| 99r精品视频| 日本韩国精品在线| 欧美一激情一区二区三区| 日韩精品一区二区三区在线播放| 在线日韩一区二区| 国产亚洲午夜高清国产拍精品 | 日韩一区欧美小说| 激情五月婷婷综合网| 久久99精品久久久| 久久精品国产网站| 国产成人综合在线| 大陆成人av片| 欧美人妖巨大在线| 精品久久久三级丝袜| 欧美国产激情二区三区| 久久网站最新地址| 亚洲欧美日韩中文字幕一区二区三区| 亚洲图片激情小说| 一区二区三区四区视频精品免费 | 久久九九99视频| 欧美剧在线免费观看网站| 欧美丰满一区二区免费视频| 欧美性感一区二区三区| 欧美sm极限捆绑bd| 91精品久久久久久久99蜜桃 | 日韩三级视频在线看| 国产校园另类小说区| 国内精品视频666| 欧洲精品中文字幕| 日韩欧美一区电影| 亚洲国产精品自拍| 成人一道本在线| 久久先锋资源网| 日韩电影免费在线看| 99久久久精品免费观看国产蜜| 日本精品裸体写真集在线观看| 欧美日本在线视频| 亚洲美女精品一区| 成人黄色国产精品网站大全在线免费观看 | 成年人国产精品| aaa欧美日韩| 精品国产99国产精品| 国产一区二区在线视频| 精品国产99国产精品| 亚洲乱码国产乱码精品精的特点| 欧美大片日本大片免费观看| 国产欧美在线观看一区| 国产精品一品二品| 精品国产自在久精品国产| 久久先锋影音av| 一区二区三区精品| 国产亚洲欧美日韩日本| 日韩一区二区免费在线电影| 婷婷亚洲久悠悠色悠在线播放|