static int idedisk_init (void *args) { hd_t *drive; size_t size; char path[PATH_MAX]; drive = (hd_t *)args; struct block_dev *bdev = drive->bdev; /* Make new device */ if ((drive->media == IDE_DISK) && (drive->udmamode == -1)) { *path = 0; strcat(path, "/dev/hd*"); if (0 > (drive->idx = block_dev_named(path, idedisk_idx))) { return drive->idx; } drive->bdev = block_dev_create(path, &idedisk_pio_driver, drive); if (NULL != drive->bdev) { size = drive->blks * bdev->block_size; block_dev(drive->bdev)->size = size; } else { return -1; } create_partitions(drive); } return 0; }
int main(int argc, char *argv[]) { int opt; const char *blockname = NULL; const char *partname = NULL; int blockoffset = -1; int blocklen = -1; node_t *bdevnode = NULL; node_t *root; getopt_init(); while (-1 != (opt = getopt(argc, argv, "b:n:o:l:"))) { switch(opt) { case 'b': blockname = optarg; break; case 'n': partname = optarg; break; case 'o': blockoffset = atoi(optarg); break; case 'l': blocklen = atoi(optarg); break; default: break; } } if (!blockname || !partname || blockoffset < 0 || blocklen < 0) { return -1; } root = vfs_get_root(); assert(root); if (NULL == (bdevnode = vfs_subtree_lookup(root, blockname))) { printf("blockdev not found\n"); return -1; } part.bdev = bdevnode->nas->fi->privdata; part.start = blockoffset; part.len = blocklen; partbdev = block_dev_create("/dev/hda0", bdev_driver_part, &part); partbdev->size = BSIZE * blocklen; return 0; }
void scsi_disk_found(struct scsi_dev *sdev) { struct block_dev *bdev; char path[PATH_MAX]; strcpy(path, "/dev/sd*"); if (0 > (sdev->idx = block_dev_named(path, &scsi_disk_idx))) { return; } bdev = block_dev_create(path, (void *) &bdev_driver_scsi, sdev); bdev->size = sdev->blk_n * sdev->blk_size; sdev->bdev = bdev; scsi_state_transit(sdev, &scsi_state_user); }
static int idedisk_udma_init (void *args) { // struct ide_tab *ide; hd_t *drive; double size; char path[PATH_MAX]; #if 0 ide = ide_get_drive(); for(int i = 0; i < HD_DRIVES; i++) { if (NULL == ide->drive[i]) { continue; } else { drive = (hd_t *) ide->drive[i]; #endif drive = (hd_t *)args; /* Make new device */ if ((drive->media == IDE_DISK) && (drive->udmamode != -1)) { *path = 0; strcat(path, "/dev/hd*"); if (0 > (drive->idx = block_dev_named(path, idedisk_idx))) { return drive->idx; } drive->bdev = block_dev_create(path, &idedisk_udma_driver, drive); if (NULL != drive->bdev) { size = (double) drive->param.cylinders * (double) drive->param.heads * (double) drive->param.unfbytes * (double) (drive->param.sectors + 1); block_dev(drive->bdev)->size = (size_t) size; } else { return -1; } create_partitions(drive); // } else { // continue; // } } // } return 0; } EMBOX_BLOCK_DEV("idedisk_udma", &idedisk_udma_driver, idedisk_udma_init);