⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flioctl.c

📁 H3 M-system NAND flash driver in Linux OS, M-DOC driver
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** *                                                                            * * 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 + -