📄 flioctl.c
字号:
/****************************************************************************** * * * Project: DOC Driver for Linux 2.4 Block device driver for mDOC H3 family * * of devices under Linux kernel 2.4. * * * * Version: 1.0 * * Email questions to: oemsupport@sandisk.com * * Copyright (C) SanDisk IL Ltd. 1995 - 2007 * * SanDisk IL Ltd., 7 Atir Yeda Street, Kfar Saba 44425, Israel * * * ****************************************************************************** * * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the Free * * Software Foundation; either version 2 of the License, or any later version.* * This program is distributed in the hope that it will be useful, but WITHOUT* * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * * more details, which is set forth in the readme.txt file. * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., 51 * * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * * * This License does not grant you any right to use the trademarks, service * * marks or logos of SanDisk IL Ltd. or SanDisk Corporation. * * Subject to the foregoing, SanDisk IL Ltd., for itself and on behalf of its * * licensors, hereby reserves all intellectual property rights in the program,* * except for the rights expressly granted in this License. * * * ******************************************************************************//*
* $Log: V:/PVCSDB/DiskOnChip/archives/Testing/TrueFFS 6.3/Drop 2.5/3/bddoc/src/flioctl.c-arc $
*
* Rev 1.10.1.1 Oct 29 2006 14:23:46 Yaniv.Iarovici
* Update 'FL_IOCTL_PASS_THROUGH' structures.
*
* Rev 1.10.1.0 Oct 22 2006 14:53:52 yaniv.iarovici
* Changed protectionType from FLByte to FLWord in flProtectionOutput stucture.
*
* Rev 1.10 Oct 09 2006 14:05:34 yaniv.iarovici
* Removed #ifndef FL_DO_NOT_SUPPORT_H3
*
* Rev 1.9 Oct 05 2006 11:00:56 yaniv.iarovici
* Fixed support for FL_IOCTL_PASS_THROUGH.
*
* Rev 1.8 Sep 11 2006 13:45:22 yaniv.iarovici
* Legal header added
*
* Rev 1.7 Aug 15 2006 09:32:32 Polina.Marimont
* IPL protection inside
*
* Rev 1.6 Aug 09 2006 16:52:50 Polina.Marimont
* initial for DOC Driver 1.0
*/
#include "flbase.h"
#include "blockdev.h"
#include "flioctl.h"
#ifdef BDK_ACCESS
#endif
#ifdef FL_IOCTL_INTERFACE
/*----------------------------------------------------------------------*/
/* f l I O c t l */
/* */
/* The entry point for all TrueFFS extended functions. */
/* */
/* Note: This interface is common to all TrueFFS based drivers. However */
/* since you can access TrueFFS diretly (without the driver) you */
/* can also call the extended routines explicitly. */
/* */
/* Parameters: */
/* irHandle : Socket number (0, 1, ...) */
/* bits 7-4 - Partition # (zero based) */
/* bits 3-0 - Socket # (zero based) */
/* irData : Pointer to flIOctlRecord record see flioclt.h */
/* irFlags : Opcode of the specific extended function. */
/* See flioctl.h for the complete opcode list. */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/*----------------------------------------------------------------------*/
TFFS_DLL_API FLStatus NAMING_CONVENTION bdIOctl(IOreq FAR2 *ioreq1)
{
IOreq ioreq2;
void FAR1 *inputRecord;
void FAR1 *outputRecord;
inputRecord = ((flIOctlRecord FAR1 *)(ioreq1->irData))->inputRecord;
outputRecord = ((flIOctlRecord FAR1 *)(ioreq1->irData))->outputRecord;
ioreq2.irHandle = ioreq1->irHandle;
switch (ioreq1->irFlags) {
case FL_IOCTL_GET_INFO:
{
flDiskInfoOutput FAR1 *outputRec = (flDiskInfoOutput FAR1 *)outputRecord;
ioreq2.irData = &(outputRec->info);
outputRec->status = flVolumeInfo(&ioreq2);
return outputRec->status;
}
#ifndef FL_READ_ONLY
case FL_IOCTL_DEFRAGMENT:
{
flDefragInput FAR1 *inputRec = (flDefragInput FAR1 *)inputRecord;
flDefragOutput FAR1 *outputRec = (flDefragOutput FAR1 *)outputRecord;
ioreq2.irLength = inputRec->requiredNoOfSectors;
outputRec->status = flDefragmentVolume(&ioreq2);
outputRec->actualNoOfSectors = ioreq2.irLength;
return outputRec->status;
}
#ifdef FL_FORMAT_VOLUME
case FL_IOCTL_FLASH_FORMAT:
{
flFlashFormatInput FAR1 *inputRec = (flFlashFormatInput FAR1 *)inputRecord;
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
ioreq2.irLength = inputRec->sdwNoOfKeeps;
ioreq2.irFlags = inputRec->dwFormatFlags;
ioreq2.irData = (void FAR1 *)inputRec->fpPtr;
outputRec->status = flFlashFormat(&ioreq2);
return outputRec->status;
}
case FL_IOCTL_ERASE_BD:
{
flEraseBDInput FAR1 *inputRec = (flEraseBDInput FAR1 *)inputRecord;
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
ioreq2.irPath = NULL; /* Progress callback */
ioreq2.irFlags = inputRec->dwFlags;
outputRec->status = flEraseBD(&ioreq2);
return outputRec->status;
}
case FL_IOCTL_FLASH_UNFORMAT:
{
flFlashUnformatInput FAR1 *inputRec = (flFlashUnformatInput FAR1 *)inputRecord;
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
ioreq2.irPath = NULL; /* Progress callback */
ioreq2.irFlags = inputRec->dwFlags;
outputRec->status = flUnformat(&ioreq2);
return outputRec->status;
}
#endif /* FL_FORMAT_VOLUME */
#endif /* FL_READ_ONLY */
case FL_IOCTL_MOUNT_VOLUME:
{
flMountInput FAR1 *inputRec = (flMountInput FAR1 *)inputRecord;
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
if (inputRec->type == FL_DISMOUNT)
outputRec->status = flDismountVolume(&ioreq2);
else
outputRec->status = flAbsMountVolume(&ioreq2);
return outputRec->status;
}
#ifdef BDK_ACCESS
case FL_IOCTL_BDK_OPERATION:
{
flBDKOperationInput FAR1 *inputRec = (flBDKOperationInput FAR1 *)inputRecord;
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
ioreq2.irData = &(inputRec->bdkStruct);
switch(inputRec->type) {
case BDK_INIT_READ:
outputRec->status = bdkReadInit(&ioreq2);
break;
case BDK_READ:
outputRec->status = bdkReadBlock(&ioreq2);
break;
case BDK_GET_INFO:
outputRec->status = bdkPartitionInfo(&ioreq2);
break;
#ifndef FL_READ_ONLY
case BDK_INIT_WRITE:
outputRec->status = bdkWriteInit(&ioreq2);
break;
case BDK_WRITE:
outputRec->status = bdkWriteBlock(&ioreq2);
break;
case BDK_ERASE:
outputRec->status = bdkErase(&ioreq2);
break;
case BDK_CREATE:
outputRec->status = bdkCreate(&ioreq2);
break;
#endif /* FL_READ_ONLY */
default:
outputRec->status = flBadParameter;
break;
}
return outputRec->status;
}
#endif /* BDK_ACCESS */
#ifdef HW_PROTECTION
#ifdef BDK_ACCESS
case FL_IOCTL_BINARY_HW_PROTECTION:
{
flProtectionInput FAR1 *inputRec = (flProtectionInput FAR1 *)inputRecord;
flProtectionOutput FAR1 *outputRec = (flProtectionOutput FAR1 *)outputRecord;
switch(inputRec->type)
{
case PROTECTION_INSERT_KEY:
ioreq2.irData = inputRec->key;
outputRec->status = bdkInsertProtectionKey(&ioreq2);
break;
case PROTECTION_REMOVE_KEY:
outputRec->status = bdkRemoveProtectionKey(&ioreq2);
break;
case PROTECTION_GET_TYPE:
outputRec->status = bdkIdentifyProtection(&ioreq2);
outputRec->protectionType = (FLWord)ioreq2.irFlags;
break;
case PROTECTION_DISABLE_LOCK:
ioreq2.irFlags = 0;
outputRec->status = bdkHardwareProtectionLock(&ioreq2);
break;
case PROTECTION_ENABLE_LOCK:
ioreq2.irFlags = LOCK_ENABLED;
outputRec->status = bdkHardwareProtectionLock(&ioreq2);
break;
case PROTECTION_CHANGE_KEY:
ioreq2.irData = inputRec->key;
outputRec->status = bdkChangeProtectionKey(&ioreq2);
break;
case PROTECTION_CHANGE_TYPE:
ioreq2.irFlags = inputRec->protectionType;
outputRec->status = bdkChangeProtectionType(&ioreq2);
break;
default:
outputRec->status = flBadParameter;
break;
}
return outputRec->status;
}
#endif /* BDK_ACCESS */
case FL_IOCTL_BDTL_HW_PROTECTION:
{
flProtectionInput FAR1 *inputRec = (flProtectionInput FAR1 *)inputRecord;
flProtectionOutput FAR1 *outputRec = (flProtectionOutput FAR1 *)outputRecord;
switch(inputRec->type)
{
case PROTECTION_INSERT_KEY:
ioreq2.irData = inputRec->key;
outputRec->status = flInsertProtectionKey(&ioreq2);
break;
case PROTECTION_REMOVE_KEY:
outputRec->status = flRemoveProtectionKey(&ioreq2);
break;
case PROTECTION_GET_TYPE:
outputRec->status = flIdentifyProtection(&ioreq2);
outputRec->protectionType = (FLWord)ioreq2.irFlags;
break;
case PROTECTION_DISABLE_LOCK:
ioreq2.irFlags = 0;
outputRec->status = flHardwareProtectionLock(&ioreq2);
break;
case PROTECTION_ENABLE_LOCK:
ioreq2.irFlags = LOCK_ENABLED;
outputRec->status = flHardwareProtectionLock(&ioreq2);
break;
case PROTECTION_CHANGE_KEY:
ioreq2.irData = inputRec->key;
outputRec->status = flChangeProtectionKey(&ioreq2);
break;
case PROTECTION_CHANGE_TYPE:
ioreq2.irFlags = inputRec->protectionType;
outputRec->status = flChangeProtectionType(&ioreq2);
break;
case PROTECTION_APPLY_STICKY:
outputRec->status = flApplyStickyLock(&ioreq2);
break;
default:
outputRec->status = flBadParameter;
break;
}
return outputRec->status;
}
case FL_IOCTL_IPL_HW_PROTECTION:
{
flProtectionInput FAR1 *inputRec = (flProtectionInput FAR1 *)inputRecord;
flProtectionOutput FAR1 *outputRec = (flProtectionOutput FAR1 *)outputRecord;
switch(inputRec->type)
{
case PROTECTION_INSERT_KEY:
ioreq2.irData = inputRec->key;
outputRec->status = flIplInsertProtectionKey(&ioreq2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -