亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ide_disk.c

?? TI DSP系列讀下CF卡程序,可用做圖象存儲產品的開發
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 **************************************************************
 *
 *  hyperstone MS-DOS FAT File System Drivers
 *
 *  Low Level IDE Disk Access Routines
 *
 *  Christoph Baumhof 2000-03-21
 *  Reinhard K乭ne 2000-03-21
 *  Mihajlo Varga 2000-03-21
 *
 *  Copyright (C) 1997-2000 hyperstone electronics GmbH Konstanz
 *
 *  2000-03-21 initial release
 *
 * $Id$
 *
 * $Log$
 *
 **************************************************************
 *
 * Changes:
 *
 **************************************************************
 */


#include    <stdio.h>
#include    <string.h>
#include    <stdlib.h>
#include    <io.h>
#include    <sys/hyrtk.h>
#include    "hy_dos.h"
#include    "hybios.h"

#ifdef      __DSC_CFA__
#define     DSC_TIMING    0x3F8
#define     REG0SEL       ( (1 << 21) | DSC_TIMING)
#define     REG2SEL       ( (2 << 13) | REG0SEL)

#undef outpw
#undef inp
#undef inph

static inline int outpw(unsigned int addr, int value) {
     *(volatile unsigned char *)addr = value;
     return 0;
}

static inline int outph(unsigned int addr, int value) {
     *(volatile unsigned short *)addr = value;
     return 0;
}

static inline int inp (unsigned int addr) {
     return * (volatile unsigned char *) addr;
}

static inline int inph (unsigned int addr) {
     return  * (volatile unsigned short*) addr;
}

#define   Outpw(portid, value)                    \
({   register unsigned int  dummy0   asm("L14");  \
     register unsigned int  dummy1   asm("L15");  \
						  \
     dummy0 = portid;                             \
     dummy1 = value;                              \
     asm volatile  ("STW.IOD   %1, %0, 0"         \
		   : "l=" (dummy1)                \
		   : "l"  (dummy0), "l" (dummy1));\
     dummy1;                                      \
})

#define   Inpw(portid)                            \
({   register unsigned int dummy    asm("L15");   \
						  \
     dummy  = portid;                             \
     asm volatile  ("LDW.IOD   %0, %0, 0"         \
		   : "=l" (dummy)                 \
		   : "l"  (dummy)                 \
		   : "L15");                      \
     dummy;                                      \
})

#else
#define outph outpw
#endif

struct hd_geometry  _hd_ident[MAX_CHANNEL_NUM*2];

struct _drive_tab {
   unsigned int xHD_DATA;
   unsigned int xHD_ERROR;
   unsigned int xHD_NSECTOR;
   unsigned int xHD_SECTOR;
   unsigned int xHD_LCYL;
   unsigned int xHD_HCYL;
   unsigned int xHD_CURRENT;
   unsigned int xHD_STATUS;

   unsigned int xHD_CMD;
   unsigned int xHD_ALTSTATUS;
};

struct drive_tab_hardware {
     unsigned int cs1;        /* first  register file */
     unsigned int cs2;        /* second register file */
     unsigned int addroffs;   /* register select */
     unsigned int timeing;    /* timing */
     unsigned int word_access;/* 16 bit select */
     unsigned int irq;        /* used interrupt channel */
	      int drive;      /* 0 = Master, 1= Slave */
};

static struct _drive_tab  drive_tab[MAX_CHANNEL_NUM*2];
static struct drive_tab_hardware  hardware_drv;

static int _init_hardware_tab(struct drive_tab_hardware * hw, int IO16) {
  int index;

  index = hw->drive;
  drive_tab[index].xHD_DATA   = hw->cs1 | (HD_DATA << hw->addroffs) | hw->timeing |
				hw->word_access;
  drive_tab[index].xHD_ERROR  = hw->cs1 | (HD_ERROR << hw->addroffs) | hw->timeing;
  drive_tab[index].xHD_NSECTOR= hw->cs1 | (HD_NSECTOR << hw->addroffs) | hw->timeing;
  drive_tab[index].xHD_SECTOR = hw->cs1 | (HD_SECTOR << hw->addroffs) | hw->timeing;
  drive_tab[index].xHD_LCYL   = hw->cs1 | (HD_LCYL << hw->addroffs) | hw->timeing;
  drive_tab[index].xHD_HCYL   = hw->cs1 | (HD_HCYL << hw->addroffs) | hw->timeing;
  drive_tab[index].xHD_CURRENT= hw->cs1 | (HD_CURRENT << hw->addroffs) | hw->timeing;
  drive_tab[index].xHD_STATUS = hw->cs1 | (HD_STATUS << hw->addroffs) | hw->timeing;

  drive_tab[index].xHD_CMD       = hw->cs2 | (HD_CMD << hw->addroffs) | hw->timeing;
  drive_tab[index].xHD_ALTSTATUS = hw->cs2 | (HD_ALTSTATUS << hw->addroffs) | hw->timeing;
  return 0;
}

static unsigned int drivebusy(int drive) {

	return inp(drive_tab[drive].xHD_ALTSTATUS) & BUSY_STAT ? 1 : 0;
}

static unsigned int drivebusy_drdy(int drive) {

	return (inp(drive_tab[drive].xHD_ALTSTATUS) & (READY_STAT | SEEK_STAT)) == (READY_STAT | SEEK_STAT) ? 0 : 1;
}

static unsigned int drivebusy_drq(int drive) {

	return (inp(drive_tab[drive].xHD_ALTSTATUS) &  (READY_STAT | SEEK_STAT | DRQ_STAT)) == (READY_STAT | SEEK_STAT | DRQ_STAT) ? 0 : 1;
}

static unsigned int testAltSTAT(int drive, int status)
{
int alt_status;

  alt_status = inp(drive_tab[drive].xHD_ALTSTATUS);
  while ((alt_status & BUSY_STAT) == BUSY_STAT)
     {
       DelayBy(100);
       alt_status = inp(drive_tab[drive].xHD_ALTSTATUS);
     }
  return (alt_status & status) == status ? 1 : 0;
}


/*
          drive  physical drive
*/

static unsigned reset_IDE_DRIVE(int drive) {

       int testval;

       if (drive >= MAX_CHANNEL_NUM*2)
           return 1;
       /* ATA device present: plausibility test  */
       testval = 0x55;
       outpw(drive_tab[drive].xHD_LCYL, testval);
       outpw(drive_tab[drive].xHD_HCYL, ~testval);
       testval = inp(drive_tab[drive].xHD_LCYL) & 0xFF;
       if (testval != 0x55)
          return 2;
       testval = 0xAA;
       outpw(drive_tab[drive].xHD_LCYL, testval);
       outpw(drive_tab[drive].xHD_HCYL, ~testval);
       testval = inp(drive_tab[drive].xHD_LCYL) & 0xFF;
       if (testval != 0xAA)
          return 3;
       outpw(drive_tab[drive].xHD_CMD, 0x0E);  /* SRST = 1 */
       DelayBy(10000);
       outpw(drive_tab[drive].xHD_CMD, 0x0A);  /* SRST = 0 */
       while (drivebusy(drive));
/*       outpw(drive_tab[drive].xHD_CMD, 0x08);*/  /* Enable IRQ */
/*	    while(drivebusy()); */

       return 0;
}


static unsigned _Reset_IDE_DRIVE(struct diskinfo_t *dinfo) {

    return reset_IDE_DRIVE(dinfo->drive);
}

static void ReadSectors(unsigned int drive, unsigned short *buffer,
			unsigned int NumberOfSectors);
static void WriteSectors(unsigned int drive, unsigned short *buffer,
			 unsigned int NumberOfSectors);

int   r_w_Disk(int drive, unsigned long LogNumber,
		  unsigned long sect_cnt, unsigned short *buffer, int rw) {

      unsigned long iCount;

#ifdef __DSC_CFA__
      Outpw(REG0SEL, 1);   /* enable PCMCIA  */
      Outpw(REG2SEL, Inpw(REG2SEL) & ~(1<<2));   /* enable PCMCIA Wait Pin */
      UpdateBCR( (0x05 << 24) | 0x0a, (0x0a<<24) | 5);
	// mem2: 1 setup, 6 access, 2 hold
      UpdateMCR( 3 << 4,  1 << 26);
	// mem2: 8 bit, wait pin enable
#endif
      while (drivebusy(drive));
      if (_hd_ident[drive].lba & LBA_capability) {
		   outpw(drive_tab[drive].xHD_CURRENT, ((LogNumber >> 24) & 0x0F) | 0xE0);
		   outpw(drive_tab[drive].xHD_SECTOR, LogNumber & 0xFF); /* Sector Nr.  */
		   outpw(drive_tab[drive].xHD_LCYL, (LogNumber >> 8) & 0xFF);
		   outpw(drive_tab[drive].xHD_HCYL, (LogNumber >> 16) & 0xFF);
      }
      else {

  	      iCount = LogNumber / (_hd_ident[drive].heads * _hd_ident[drive].sectors);
		   outpw(drive_tab[drive].xHD_LCYL, iCount & 0xFF);
		   outpw(drive_tab[drive].xHD_HCYL, (iCount >> 8) & 0xFF);
	      iCount = (LogNumber % _hd_ident[drive].sectors)+1;
		   outpw(drive_tab[drive].xHD_SECTOR, iCount); /* Sector Nr.  */
	      iCount = (LogNumber/_hd_ident[drive].sectors) % _hd_ident[drive].heads;
		   outpw(drive_tab[drive].xHD_CURRENT, 0xA0 | iCount);
      }
      for (; sect_cnt; ) {
	      unsigned long tmp_sect;

	      if (sect_cnt > 256) {
	          sect_cnt -= 256;
	          tmp_sect = 256;
	      }
	      else {
	          tmp_sect = sect_cnt;
		  sect_cnt = 0;
	      }
	      outpw(drive_tab[drive].xHD_NSECTOR, tmp_sect & 0xFF);
	 if (rw == READ)
	   {
#if 0
	     int j;

	     outpw(drive_tab[drive].xHD_STATUS, WIN_READ);
	     for (j=0;  j < tmp_sect; j++)
	       {
		 if (!testAltSTAT(drive, READY_STAT | SEEK_STAT | DRQ_STAT))
		   break;
#ifdef __DSC_CFA__
   UpdateMCR(1 << 5, 1 << 4);
#endif
		 for (iCount=0; iCount < SECTOR_SHORTS; iCount++)
		   *buffer++ = CvtByteOrder16(inph(drive_tab[drive].xHD_DATA));
#ifdef __DSC_CFA__
   UpdateMCR(3 << 4, 0);
#endif
	       }
#else
	     ReadSectors(drive, buffer, tmp_sect);
#endif
	   }
	 if (rw == WRITE)
	   {
#if 0
	     int j;
	     unsigned short data16;

	     /* write sector(s) */
	     while (drivebusy(drive));
	     outpw(drive_tab[drive].xHD_STATUS, WIN_WRITE);
	     for (j=0;  j < tmp_sect; j++)
	       {
		 if (!testAltSTAT(drive, READY_STAT | SEEK_STAT | DRQ_STAT))
		   break;
#ifdef __DSC_CFA__
   UpdateMCR(1 << 5, 1 << 4);
#endif
		 for (iCount=0; iCount < SECTOR_SHORTS; iCount++)
		   {
		     data16 = CvtByteOrder16(*buffer++);
		     outph(drive_tab[drive].xHD_DATA, data16);
		   }
#ifdef __DSC_CFA__
   UpdateMCR(3 << 4, 0);
#endif
	       }
#else
	     WriteSectors(drive, buffer, tmp_sect);
#endif
	   }
      }
      return 0;
}

static void ReadSectors(unsigned int drive, unsigned short *buffer,
			unsigned int NumberOfSectors)
{
int iCount, j, DataReg;

  outpw(drive_tab[drive].xHD_STATUS, WIN_READ);
  DataReg = drive_tab[drive].xHD_DATA;
  for (j=0;  j < NumberOfSectors; j++)
    {
      if (!testAltSTAT(drive, READY_STAT | SEEK_STAT | DRQ_STAT))
	break;
#ifdef __DSC_CFA__
   UpdateMCR(1 << 5, 1 << 4);
#endif
      for (iCount=SECTOR_SHORTS/2; iCount > 0; iCount--)
	{
	  *buffer++ = CvtByteOrder16(inph(DataReg));
	  *buffer++ = CvtByteOrder16(inph(DataReg));
	}
#ifdef __DSC_CFA__
   UpdateMCR(3 << 4, 0);
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本中文一区二区三区| 久久福利资源站| 国产精品久久久久久久裸模| 日韩午夜av一区| 欧美高清视频www夜色资源网| 91猫先生在线| 色综合色狠狠综合色| 91麻豆精东视频| 91麻豆精东视频| 一本到一区二区三区| 欧美影片第一页| 欧美精品久久久久久久久老牛影院| 欧美亚洲国产bt| 777久久久精品| 91精品国产综合久久福利软件| 91 com成人网| 欧美大片在线观看一区二区| 日韩一卡二卡三卡| 26uuu精品一区二区| 久久女同精品一区二区| 国产欧美日韩综合| 亚洲色欲色欲www在线观看| 亚洲欧美国产三级| 亚洲不卡av一区二区三区| 日本欧美加勒比视频| 国内精品第一页| 成人的网站免费观看| 在线亚洲一区观看| 5858s免费视频成人| 精品国产乱码久久| 国产亚洲精品超碰| 一区二区三区在线看| 日韩国产成人精品| 国产91精品免费| 在线观看一区二区精品视频| 7777精品久久久大香线蕉| 精品动漫一区二区三区在线观看| 中国av一区二区三区| 亚洲综合色丁香婷婷六月图片| 日韩av在线发布| 成人午夜激情在线| 欧美性猛交xxxxxx富婆| 日韩欧美电影一区| 国产精品福利一区二区三区| 午夜激情综合网| 国产成人精品免费一区二区| 在线观看成人免费视频| 日韩欧美综合一区| 136国产福利精品导航| 五月婷婷另类国产| 国产成人精品一区二区三区四区| 欧美特级限制片免费在线观看| 欧美大片拔萝卜| 亚洲精品一二三| 精品一区二区综合| 欧洲激情一区二区| 国产亚洲欧美在线| 午夜精品视频一区| 不卡的看片网站| 日韩视频在线一区二区| 成人欧美一区二区三区1314 | 亚洲成人av电影在线| 国内成+人亚洲+欧美+综合在线| 91一区二区在线| 精品久久国产字幕高潮| 亚洲激情六月丁香| 国产98色在线|日韩| 欧美一区二区三区在线视频| 中文字幕在线不卡一区二区三区| 蜜桃免费网站一区二区三区| 在线观看视频91| 亚洲国产精品ⅴa在线观看| 蜜臀久久99精品久久久久久9| 91视频一区二区| 亚洲精品一区二区三区在线观看 | 久久99精品久久久久久| 日本韩国视频一区二区| 国产亚洲精品7777| 麻豆视频一区二区| 欧美撒尿777hd撒尿| 综合久久久久久久| 国产成人精品免费一区二区| 欧美成人国产一区二区| 午夜精品福利一区二区蜜股av| 99久久国产综合精品色伊| 久久久五月婷婷| 久久国产精品露脸对白| 欧美日韩高清不卡| 亚洲精品成人天堂一二三| 成人精品国产免费网站| 久久久综合精品| 久久99久久精品| 91精品国产入口| 午夜欧美电影在线观看| 色综合久久久久综合99| 亚洲婷婷在线视频| av电影天堂一区二区在线| 国产欧美日韩精品一区| 黄页视频在线91| 日韩亚洲国产中文字幕欧美| 日韩福利电影在线| 欧美日韩aaa| 午夜精品福利一区二区蜜股av| 欧美三区在线观看| 亚洲一区二区三区免费视频| 欧美在线三级电影| 亚洲国产一区视频| 欧美性猛交xxxx乱大交退制版| 亚洲午夜久久久久久久久电影院 | 国产精品一区免费在线观看| 欧美电影免费观看高清完整版在线观看 | 久久久亚洲国产美女国产盗摄 | 久久国内精品视频| 日韩久久精品一区| 裸体在线国模精品偷拍| 精品国产乱码久久久久久久| 国产一区二区福利| 国产女同互慰高潮91漫画| 国产精品18久久久久久久久| 国产精品女同一区二区三区| 91在线视频播放地址| 一区二区三区国产精华| 欧美日韩精品欧美日韩精品一综合| 亚洲福利国产精品| 精品人在线二区三区| 国产精品一线二线三线精华| 国产精品久线在线观看| 在线看国产一区| 日本欧美韩国一区三区| 久久精品亚洲精品国产欧美| 成人av资源网站| 亚洲综合久久久久| 日韩视频一区在线观看| 懂色av中文一区二区三区| 亚洲婷婷综合色高清在线| 欧美精品在线一区二区| 极品少妇xxxx偷拍精品少妇| 欧美激情综合五月色丁香小说| 色香蕉成人二区免费| 蜜桃免费网站一区二区三区| 中文字幕精品一区二区三区精品| 一本色道久久综合亚洲精品按摩| 日韩电影免费一区| 中文字幕国产一区二区| 欧洲中文字幕精品| 精品在线一区二区| 综合久久综合久久| 日韩欧美一区二区三区在线| 国产福利一区在线| 亚洲国产日日夜夜| 久久伊人蜜桃av一区二区| 91福利小视频| 国内精品第一页| 亚洲综合色丁香婷婷六月图片| 精品国产1区二区| 欧洲国产伦久久久久久久| 寂寞少妇一区二区三区| 亚洲欧洲制服丝袜| 欧美v日韩v国产v| 色婷婷综合激情| 国产精品一二三区在线| 亚洲chinese男男1069| 国产日韩精品视频一区| 欧美精品乱码久久久久久 | 91精品国产一区二区三区蜜臀| 风间由美一区二区三区在线观看 | 国产91丝袜在线播放0| 亚洲成人动漫在线观看| 国产精品免费久久| 日韩精品资源二区在线| 日本韩国精品在线| 国产高清一区日本| 老司机免费视频一区二区三区| 亚洲精品免费播放| 国产欧美日韩在线| 日韩欧美中文字幕制服| 色噜噜夜夜夜综合网| 国产成人8x视频一区二区 | 欧美一区日本一区韩国一区| 99久久精品一区二区| 国内一区二区在线| 五月婷婷色综合| 亚洲综合区在线| 中文字幕一区二区三区乱码在线 | 国产又黄又大久久| 日韩成人免费电影| 亚洲第一av色| 亚洲精品国产无套在线观| 国产亲近乱来精品视频 | 蜜臀久久99精品久久久画质超高清| 亚洲天堂av老司机| 国产精品日产欧美久久久久| 精品少妇一区二区三区在线播放| 欧美日韩国产成人在线免费| 日本精品一区二区三区高清| 91在线精品一区二区三区| 国产麻豆精品视频| 国产一区二区在线电影| 精品在线你懂的| 久久精品国产成人一区二区三区|