static void sd_release(struct inode * inode, struct file * file) { int target; sync_dev(inode->i_rdev); target = DEVICE_NR(MINOR(inode->i_rdev)); rscsi_disks[target].device->access_count--; if(rscsi_disks[target].device->removable) { if(!rscsi_disks[target].device->access_count) sd_ioctl(inode, NULL, SCSI_IOCTL_DOORUNLOCK, 0); }; }
DRESULT disk_ioctl(BYTE drv, BYTE ctrl,void *buff) { DSTATUS status = RES_PARERR; spi1_lock(); { switch(drv) { case driveNumFlashMem: status = flash_ioctl(ctrl, buff); break; case driveNumSdCard: status = sd_ioctl(ctrl, buff); break; default: status = RES_PARERR; break; } } spi1_unlock(); return status; }
static int sd_open(struct inode * inode, struct file * filp) { int target; target = DEVICE_NR(MINOR(inode->i_rdev)); if(target >= NR_SD || !rscsi_disks[target].device) return -ENODEV; /* No such device */ /* Make sure that only one process can do a check_change_disk at one time. This is also used to lock out further access when the partition table is being re-read. */ while (rscsi_disks[target].device->busy); if(rscsi_disks[target].device->removable) { check_disk_change(inode->i_rdev); if(!rscsi_disks[target].device->access_count) sd_ioctl(inode, NULL, SCSI_IOCTL_DOORLOCK, 0); }; rscsi_disks[target].device->access_count++; return 0; }