Changeset 4046b2f4 in mainline
- Timestamp:
- 2011-08-30T17:35:04Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 7a72ce1a
- Parents:
- c3d19ac
- Location:
- uspace
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/block/libblock.c
rc3d19ac r4046b2f4 93 93 static int get_block_size(async_sess_t *, size_t *); 94 94 static int get_num_blocks(async_sess_t *, aoff64_t *); 95 static int read_toc(async_sess_t *, uint8_t); 95 96 static aoff64_t ba_ltop(devcon_t *, aoff64_t); 96 97 … … 891 892 } 892 893 894 /** Get TOC from device. 895 * 896 * @param service_id Service ID of the block device. 897 * @param session Starting session. 898 * @param data Buffer to read TOC into. 899 * 900 * @return EOK on success. 901 * @return Error code on failure. 902 * 903 */ 904 int block_get_toc(service_id_t service_id, uint8_t session, void *data) 905 { 906 devcon_t *devcon = devcon_search(service_id); 907 assert(devcon); 908 909 fibril_mutex_lock(&devcon->comm_area_lock); 910 911 int rc = read_toc(devcon->sess, session); 912 if (rc == EOK) 913 memcpy(buf, devcon->comm_area, devcon->pblock_size); 914 915 fibril_mutex_unlock(&devcon->comm_area_lock); 916 917 return rc; 918 } 919 893 920 /** Read blocks from block device. 894 921 * … … 981 1008 } 982 1009 1010 /** Get TOC from block device. */ 1011 static int read_toc(async_sess_t *sess, uint8_t session) 1012 { 1013 async_exch_t *exch = async_exchange_begin(sess); 1014 int rc = async_req_1_0(exch, BD_READ_TOC, session); 1015 async_exchange_end(exch); 1016 1017 return rc; 1018 } 1019 983 1020 /** Convert logical block address to physical block address. */ 984 1021 static aoff64_t ba_ltop(devcon_t *devcon, aoff64_t lba) -
uspace/lib/block/libblock.h
rc3d19ac r4046b2f4 114 114 extern int block_get_bsize(service_id_t, size_t *); 115 115 extern int block_get_nblocks(service_id_t, aoff64_t *); 116 extern int block_get_toc(service_id_t, uint8_t, void *); 116 117 extern int block_read_direct(service_id_t, aoff64_t, size_t, void *); 117 118 extern int block_read_bytes_direct(service_id_t, aoff64_t, size_t, void *); -
uspace/lib/c/include/ipc/bd.h
rc3d19ac r4046b2f4 42 42 BD_GET_NUM_BLOCKS, 43 43 BD_READ_BLOCKS, 44 BD_WRITE_BLOCKS 44 BD_WRITE_BLOCKS, 45 BD_READ_TOC 45 46 } bd_request_t; 46 47 -
uspace/srv/bd/ata_bd/ata_bd.c
rc3d19ac r4046b2f4 118 118 static int ata_pcmd_inquiry(int dev_idx, void *obuf, size_t obuf_size); 119 119 static int ata_pcmd_read_12(int dev_idx, uint64_t ba, size_t cnt, 120 void *obuf, size_t obuf_size); 121 static int ata_pcmd_read_toc(int dev_idx, uint8_t ses, 120 122 void *obuf, size_t obuf_size); 121 123 static void disk_print_summary(disk_t *d); … … 353 355 UPPER32(disk[disk_id].blocks)); 354 356 continue; 357 case BD_READ_TOC: 358 cnt = IPC_GET_ARG1(call); 359 if (disk[disk_id].dev_type == ata_pkt_dev) 360 retval = ata_pcmd_read_toc(disk_id, cnt, fs_va, 361 disk[disk_id].block_size); 362 else 363 retval = EINVAL; 364 break; 355 365 default: 356 366 retval = EINVAL; … … 810 820 } 811 821 822 /** Issue ATAPI read TOC command. 823 * 824 * Read TOC in 'multi-session' format (first and last session number 825 * with last session LBA). 826 * 827 * http://suif.stanford.edu/~csapuntz/specs/INF-8020.PDF page 171 828 * 829 * Output buffer must be large enough to hold the data, otherwise the 830 * function will fail. 831 * 832 * @param dev_idx Device index (0 or 1) 833 * @param session Starting session 834 * @param obuf Buffer for storing inquiry data read from device 835 * @param obuf_size Size of obuf in bytes 836 * 837 * @return EOK on success, EIO on error. 838 */ 839 static int ata_pcmd_read_toc(int dev_idx, uint8_t session, void *obuf, 840 size_t obuf_size) 841 { 842 ata_pcmd_read_toc_t cp; 843 int rc; 844 845 memset(&cp, 0, sizeof(cp)); 846 847 cp.opcode = PCMD_READ_TOC; 848 cp.msf = 0; 849 cp.format = 0x01; /* 0x01 = multi-session mode */ 850 cp.start = session; 851 cp.size = host2uint16_t_be(obuf_size); 852 cp.oldformat = 0x40; /* 0x01 = multi-session mode (shifted to MSB) */ 853 854 rc = ata_cmd_packet(0, &cp, sizeof(cp), obuf, obuf_size); 855 if (rc != EOK) 856 return rc; 857 858 return EOK; 859 } 860 812 861 /** Read a physical from the device. 813 862 * -
uspace/srv/bd/ata_bd/ata_hw.h
rc3d19ac r4046b2f4 244 244 enum ata_pkt_command { 245 245 PCMD_INQUIRY = 0x12, 246 PCMD_READ_12 = 0xa8 246 PCMD_READ_12 = 0xa8, 247 PCMD_READ_TOC = 0x43 247 248 }; 248 249 … … 269 270 uint8_t _res2; 270 271 } __attribute__ ((packed)) ata_pcmd_read_12_t; 272 273 /** ATAPI Read TOC command */ 274 typedef struct { 275 uint8_t opcode; /**< Operation code (PCMD_READ_TOC) */ 276 uint8_t msf; /**< 0x2 = MSF bit set */ 277 uint8_t format; /**< low 3 bits */ 278 uint8_t _res0; 279 uint8_t _res1; 280 uint8_t _res2; 281 uint8_t start; /**< starting track/session number */ 282 uint16_t size; /**< Allocation length */ 283 uint8_t oldformat; /**< high 2 bits */ 284 uint8_t _res3; 285 uint8_t _res4; 286 } __attribute__ ((packed)) ata_pcmd_read_toc_t; 271 287 272 288 /** Data returned from Inquiry command (mandatory part) */
Note:
See TracChangeset
for help on using the changeset viewer.