Lines Matching +full:0 +full:- +full:dev
2 * Copyright (c) 2006-2018, RT-Thread Development Team
4 * SPDX-License-Identifier: Apache-2.0
8 * 2011-07-25 weety first version
34 struct rt_device dev; member
54 rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd)); in mmcsd_num_wr_blocks()
57 cmd.arg = card->rca << 16; in mmcsd_num_wr_blocks()
60 err = mmcsd_send_cmd(card->host, &cmd, 0); in mmcsd_num_wr_blocks()
62 return -RT_ERROR; in mmcsd_num_wr_blocks()
63 if (!controller_is_spi(card->host) && !(cmd.resp[0] & R1_APP_CMD)) in mmcsd_num_wr_blocks()
64 return -RT_ERROR; in mmcsd_num_wr_blocks()
66 rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd)); in mmcsd_num_wr_blocks()
69 cmd.arg = 0; in mmcsd_num_wr_blocks()
72 rt_memset(&data, 0, sizeof(struct rt_mmcsd_data)); in mmcsd_num_wr_blocks()
74 data.timeout_ns = card->tacc_ns * 100; in mmcsd_num_wr_blocks()
75 data.timeout_clks = card->tacc_clks * 100; in mmcsd_num_wr_blocks()
79 (card->host->io_cfg.clock / 1000); in mmcsd_num_wr_blocks()
84 data.timeout_clks = 0; in mmcsd_num_wr_blocks()
92 rt_memset(&req, 0, sizeof(struct rt_mmcsd_req)); in mmcsd_num_wr_blocks()
97 mmcsd_send_request(card->host, &req); in mmcsd_num_wr_blocks()
100 return -RT_ERROR; in mmcsd_num_wr_blocks()
114 struct rt_mmcsd_host *host = card->host; in rt_mmcsd_req_blk()
118 rt_memset(&req, 0, sizeof(struct rt_mmcsd_req)); in rt_mmcsd_req_blk()
119 rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd)); in rt_mmcsd_req_blk()
120 rt_memset(&stop, 0, sizeof(struct rt_mmcsd_cmd)); in rt_mmcsd_req_blk()
121 rt_memset(&data, 0, sizeof(struct rt_mmcsd_data)); in rt_mmcsd_req_blk()
126 if (!(card->flags & CARD_FLAG_SDHC)) in rt_mmcsd_req_blk()
137 if (!controller_is_spi(card->host) || !dir) in rt_mmcsd_req_blk()
141 stop.arg = 0; in rt_mmcsd_req_blk()
169 if (!controller_is_spi(card->host) && dir != 0) in rt_mmcsd_req_blk()
176 cmd.arg = card->rca << 16; in rt_mmcsd_req_blk()
178 err = mmcsd_send_cmd(card->host, &cmd, 5); in rt_mmcsd_req_blk()
189 } while (!(cmd.resp[0] & R1_READY_FOR_DATA) || in rt_mmcsd_req_blk()
190 (R1_CURRENT_STATE(cmd.resp[0]) == 7)); in rt_mmcsd_req_blk()
198 LOG_E("%d,%d,%d, 0x%08x,0x%08x", in rt_mmcsd_req_blk()
201 return -RT_ERROR; in rt_mmcsd_req_blk()
207 static rt_err_t rt_mmcsd_init(rt_device_t dev) in rt_mmcsd_init() argument
212 static rt_err_t rt_mmcsd_open(rt_device_t dev, rt_uint16_t oflag) in rt_mmcsd_open() argument
217 static rt_err_t rt_mmcsd_close(rt_device_t dev) in rt_mmcsd_close() argument
222 static rt_err_t rt_mmcsd_control(rt_device_t dev, int cmd, void *args) in rt_mmcsd_control() argument
224 struct mmcsd_blk_device *blk_dev = (struct mmcsd_blk_device *)dev->user_data; in rt_mmcsd_control()
228 rt_memcpy(args, &blk_dev->geometry, sizeof(struct rt_device_blk_geometry)); in rt_mmcsd_control()
236 static rt_size_t rt_mmcsd_read(rt_device_t dev, in rt_mmcsd_read() argument
241 rt_err_t err = 0; in rt_mmcsd_read()
242 rt_size_t offset = 0; in rt_mmcsd_read()
243 rt_size_t req_size = 0; in rt_mmcsd_read()
246 struct mmcsd_blk_device *blk_dev = (struct mmcsd_blk_device *)dev->user_data; in rt_mmcsd_read()
247 struct dfs_partition *part = &blk_dev->part; in rt_mmcsd_read()
249 if (dev == RT_NULL) in rt_mmcsd_read()
251 rt_set_errno(-EINVAL); in rt_mmcsd_read()
252 return 0; in rt_mmcsd_read()
255 rt_sem_take(part->lock, RT_WAITING_FOREVER); in rt_mmcsd_read()
258 req_size = (remain_size > blk_dev->max_req_size) ? blk_dev->max_req_size : remain_size; in rt_mmcsd_read()
259 err = rt_mmcsd_req_blk(blk_dev->card, part->offset + pos + offset, rd_ptr, req_size, 0); in rt_mmcsd_read()
264 remain_size -= req_size; in rt_mmcsd_read()
266 rt_sem_release(part->lock); in rt_mmcsd_read()
271 rt_set_errno(-EIO); in rt_mmcsd_read()
272 return 0; in rt_mmcsd_read()
274 return size - remain_size; in rt_mmcsd_read()
277 static rt_size_t rt_mmcsd_write(rt_device_t dev, in rt_mmcsd_write() argument
282 rt_err_t err = 0; in rt_mmcsd_write()
283 rt_size_t offset = 0; in rt_mmcsd_write()
284 rt_size_t req_size = 0; in rt_mmcsd_write()
287 struct mmcsd_blk_device *blk_dev = (struct mmcsd_blk_device *)dev->user_data; in rt_mmcsd_write()
288 struct dfs_partition *part = &blk_dev->part; in rt_mmcsd_write()
290 if (dev == RT_NULL) in rt_mmcsd_write()
292 rt_set_errno(-EINVAL); in rt_mmcsd_write()
293 return 0; in rt_mmcsd_write()
296 rt_sem_take(part->lock, RT_WAITING_FOREVER); in rt_mmcsd_write()
299 req_size = (remain_size > blk_dev->max_req_size) ? blk_dev->max_req_size : remain_size; in rt_mmcsd_write()
300 err = rt_mmcsd_req_blk(blk_dev->card, part->offset + pos + offset, wr_ptr, req_size, 1); in rt_mmcsd_write()
305 remain_size -= req_size; in rt_mmcsd_write()
307 rt_sem_release(part->lock); in rt_mmcsd_write()
312 rt_set_errno(-EIO); in rt_mmcsd_write()
314 return 0; in rt_mmcsd_write()
316 return size - remain_size; in rt_mmcsd_write()
324 /* Block-addressed cards ignore MMC_SET_BLOCKLEN. */ in mmcsd_set_blksize()
325 if (card->flags & CARD_FLAG_SDHC) in mmcsd_set_blksize()
326 return 0; in mmcsd_set_blksize()
328 mmcsd_host_lock(card->host); in mmcsd_set_blksize()
332 err = mmcsd_send_cmd(card->host, &cmd, 5); in mmcsd_set_blksize()
333 mmcsd_host_unlock(card->host); in mmcsd_set_blksize()
339 return -RT_ERROR; in mmcsd_set_blksize()
342 return 0; in mmcsd_set_blksize()
359 rt_int32_t err = 0; in rt_mmcsd_blk_probe()
380 return -RT_ENOMEM; in rt_mmcsd_blk_probe()
383 status = rt_mmcsd_req_blk(card, 0, sector, 1, 0); in rt_mmcsd_blk_probe()
386 for (i = 0; i < RT_MMCSD_MAX_PARTITION; i++) in rt_mmcsd_blk_probe()
395 blk_dev->max_req_size = BLK_MIN((card->host->max_dma_segs * in rt_mmcsd_blk_probe()
396 card->host->max_seg_size) >> 9, in rt_mmcsd_blk_probe()
397 (card->host->max_blk_count * in rt_mmcsd_blk_probe()
398 card->host->max_blk_size) >> 9); in rt_mmcsd_blk_probe()
401 status = dfs_filesystem_get_partition(&blk_dev->part, sector, i); in rt_mmcsd_blk_probe()
406 blk_dev->part.lock = rt_sem_create(sname, 1, RT_IPC_FLAG_FIFO); in rt_mmcsd_blk_probe()
409 blk_dev->dev.type = RT_Device_Class_Block; in rt_mmcsd_blk_probe()
411 blk_dev->dev.ops = &mmcsd_blk_ops; in rt_mmcsd_blk_probe()
413 blk_dev->dev.init = rt_mmcsd_init; in rt_mmcsd_blk_probe()
414 blk_dev->dev.open = rt_mmcsd_open; in rt_mmcsd_blk_probe()
415 blk_dev->dev.close = rt_mmcsd_close; in rt_mmcsd_blk_probe()
416 blk_dev->dev.read = rt_mmcsd_read; in rt_mmcsd_blk_probe()
417 blk_dev->dev.write = rt_mmcsd_write; in rt_mmcsd_blk_probe()
418 blk_dev->dev.control = rt_mmcsd_control; in rt_mmcsd_blk_probe()
420 blk_dev->dev.user_data = blk_dev; in rt_mmcsd_blk_probe()
422 blk_dev->card = card; in rt_mmcsd_blk_probe()
424 blk_dev->geometry.bytes_per_sector = 1<<9; in rt_mmcsd_blk_probe()
425 blk_dev->geometry.block_size = card->card_blksize; in rt_mmcsd_blk_probe()
426 blk_dev->geometry.sector_count = blk_dev->part.size; in rt_mmcsd_blk_probe()
428 rt_device_register(&blk_dev->dev, dname, in rt_mmcsd_blk_probe()
430 rt_list_insert_after(&blk_devices, &blk_dev->list); in rt_mmcsd_blk_probe()
434 if (i == 0) in rt_mmcsd_blk_probe()
437 blk_dev->part.offset = 0; in rt_mmcsd_blk_probe()
438 blk_dev->part.size = 0; in rt_mmcsd_blk_probe()
439 blk_dev->part.lock = rt_sem_create("sem_sd0", 1, RT_IPC_FLAG_FIFO); in rt_mmcsd_blk_probe()
442 blk_dev->dev.type = RT_Device_Class_Block; in rt_mmcsd_blk_probe()
444 blk_dev->dev.ops = &mmcsd_blk_ops; in rt_mmcsd_blk_probe()
446 blk_dev->dev.init = rt_mmcsd_init; in rt_mmcsd_blk_probe()
447 blk_dev->dev.open = rt_mmcsd_open; in rt_mmcsd_blk_probe()
448 blk_dev->dev.close = rt_mmcsd_close; in rt_mmcsd_blk_probe()
449 blk_dev->dev.read = rt_mmcsd_read; in rt_mmcsd_blk_probe()
450 blk_dev->dev.write = rt_mmcsd_write; in rt_mmcsd_blk_probe()
451 blk_dev->dev.control = rt_mmcsd_control; in rt_mmcsd_blk_probe()
453 blk_dev->dev.user_data = blk_dev; in rt_mmcsd_blk_probe()
455 blk_dev->card = card; in rt_mmcsd_blk_probe()
457 blk_dev->geometry.bytes_per_sector = 1<<9; in rt_mmcsd_blk_probe()
458 blk_dev->geometry.block_size = card->card_blksize; in rt_mmcsd_blk_probe()
459 blk_dev->geometry.sector_count = in rt_mmcsd_blk_probe()
460 card->card_capacity * (1024 / 512); in rt_mmcsd_blk_probe()
462 rt_device_register(&blk_dev->dev, "sd0", in rt_mmcsd_blk_probe()
464 rt_list_insert_after(&blk_devices, &blk_dev->list); in rt_mmcsd_blk_probe()
477 if (0) // if (blk_dev) in rt_mmcsd_blk_probe()
481 dfs_mount_device(&(blk_dev->dev)); in rt_mmcsd_blk_probe()
489 err = -RT_ERROR; in rt_mmcsd_blk_probe()
503 for (l = (&blk_devices)->next, n = l->next; l != &blk_devices; l = n) in rt_mmcsd_blk_remove()
506 if (blk_dev->card == card) in rt_mmcsd_blk_remove()
509 const char * mounted_path = dfs_filesystem_get_mounted_path(&(blk_dev->dev)); in rt_mmcsd_blk_remove()
515 rt_device_unregister(&blk_dev->dev); in rt_mmcsd_blk_remove()
516 rt_list_remove(&blk_dev->list); in rt_mmcsd_blk_remove()
525 * @deprecated since 2.1.0, this function does not need to be invoked
531 return 0; in rt_mmcsd_blk_init()