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

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

?? ata.c

?? 嵌入式系統中的fat32和fat16源代碼(完全版)
?? C
?? 第 1 頁 / 共 2 頁
字號:
//*****************************************************************************
//
// Title		: IDE-ATA interface driver for hard disks
// Authors		: Angelo Bannack, Giordano Bruno Wolaniuk
// File Name	: 'ata.c'
// Date			: April 16, 2004
// Version		: 1.00
// Target MCU	: Atmel AVR Series
// Editor Tabs	: 4
//
// NOTE: This code is based on original library "IDE-ATA interface driver for hard disks"
//       from Pascal Stang.
//
//	     The authors in no way will be responsible for damages that you coul'd be using this code.
//       Use this code at your own risk.
//
//       This code is distributed under the GNU Public License
//       which can be found at http://www.gnu.org/licenses/gpl.txt
//
//*****************************************************************************

#ifndef WIN32
	#include <avr/io.h>
	#include <avr/interrupt.h>
	#include <avr/signal.h>
	#include <avr/pgmspace.h>
#endif
#include "global.h"
#include "ata.h"

// global variables
typeDriveInfo ataDriveInfo;		// drive information


//*****************************************************************************
// Function: ataInit
// Parameters: none
// Returns: none
//
// Description: Gives a software reset into the ata dispositive
//*****************************************************************************
void ataInit(void)
{
	unsigned char i;
	unsigned char* buffer = (unsigned char*) SECTOR_BUFFER_ADDR;


	DDR_DATAL= 0x00;			// Use DATAL as the input from the hardrive
	DDR_DATAH= 0x00;			// Use DATAH as the input from the hardrive
	PORT_DATAL= 0xFF;			// Enable pullup on DATAL
	PORT_DATAH= 0xFF;			// Enable pullup on DATAH

	DDR_ADDR = 0xDF;			// Use ADDR PORT as the output for the hardrive
  								// But use PORT_ADDR.5 as host interrupt (INPUT)
    PORT_ADDR= 0xc0;            // Initialize PORT_ADDR to c0.


    ataWriteByte(ATA_REG_ACTSTATUS, 0x06);  	 	// Assert Software reboot.
    delay(100);
    ataWriteByte(ATA_REG_ACTSTATUS, 0x00);
    delay(100);

    // Wait until drive clear BUSY Bit in Alternate Status Register
    while(IDE_Wait_State(ATA_SR_BSY) == 1);

	// issue identify command
	ataWriteByte(ATA_REG_HDDEVSEL, 0);
	ataWriteByte(ATA_REG_ACTSTATUS, 0x02);

    while(IDE_Wait_State(ATA_SR_DRDY) == 0);

	ataWriteByte(ATA_REG_CMDSTATUS1, 0xEC);
	// wait for drive to request data transfer

	while(IDE_Wait_State(ATA_SR_DRQ) == 0);

	delay(200); // wait 200 us
	// read in the data
	ataReadDataBuffer(buffer, 512);

	// set local drive info parameters
	ataDriveInfo.cylinders =		*( ((unsigned int*) buffer) + ATA_IDENT_CYLINDERS );
	ataDriveInfo.heads =			*( ((unsigned int*) buffer) + ATA_IDENT_HEADS );
	ataDriveInfo.sectors =			*( ((unsigned int*) buffer) + ATA_IDENT_SECTORS );
	ataDriveInfo.LBAsupport =		*( ((unsigned int*) buffer) + ATA_IDENT_FIELDVALID );
	ataDriveInfo.sizeinsectors =	*( (unsigned long*) (buffer + ATA_IDENT_LBASECTORS*2) );
	// copy model string
	for(i=0; i<40; i+=2)
	{
		// correct for byte order
		ataDriveInfo.model[i  ] = buffer[(ATA_IDENT_MODEL*2) + i + 1];
		ataDriveInfo.model[i+1] = buffer[(ATA_IDENT_MODEL*2) + i    ];
	}
	// terminate string
	ataDriveInfo.model[40] = 0;

	// process and print info
	if(!ataDriveInfo.LBAsupport) {
		// CHS, no LBA support
		// calculate drive size
		ataDriveInfo.sizeinsectors = (unsigned long) ataDriveInfo.cylinders*ataDriveInfo.heads*ataDriveInfo.sectors;
	}
}


//*****************************************************************************
// Function: ataSetDrivePowerMode
// Parameters: DriveNo, mode, timeout
// Returns: none
//
// Description: Sets the Power Mode
//	            Possible modes: ATA_DISKMODE_SPINDOWN
//                              ATA_DISKMODE_SPINUP
//                              ATA_DISKMODE_SETTIMEOUT
//                              ATA_DISKMODE_SLEEP
//*****************************************************************************
void ataSetDrivePowerMode(unsigned char DriveNo, unsigned char mode, unsigned char timeout)
{
	// select drive
	ataDriveSelect(DriveNo);
	// Wait for drive to be ready
	ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);

	// set mode
	switch(mode)
	{
	case ATA_DISKMODE_SPINDOWN:		ataWriteByte(ATA_REG_CMDSTATUS1, ATA_CMD_SPINDOWN); break;
	case ATA_DISKMODE_SPINUP:		ataWriteByte(ATA_REG_CMDSTATUS1, ATA_CMD_SPINUP); break;
	case ATA_DISKMODE_SETTIMEOUT:
		ataWriteByte(ATA_REG_SECCOUNT, timeout);
		ataWriteByte(ATA_REG_CMDSTATUS1, ATA_CMD_IDLE_5SU);
		break;
	case ATA_DISKMODE_SLEEP:		ataWriteByte(ATA_REG_CMDSTATUS1, ATA_CMD_SLEEP); break;
	default:
		break;
	}
}



//*****************************************************************************
// Function: ataReadDataBuffer
// Parameters: Buffer, numBytes
// Returns: none
//
// Description: The Buffer will be filled with the readed data
//*****************************************************************************
void ataReadDataBuffer(unsigned char *Buffer, unsigned short numBytes)
{
	register unsigned int i asm ("r16");

	DDR_DATAL = 0x00; 		      	// Use the PORT DATAH as an input
	DDR_DATAH = 0x00; 		      	// Use the PORT DATAL as an input
	PORT_DATAL= 0xFF;				// habilita pull-ups
	PORT_DATAH= 0xFF;				// habilita pull-ups
	PORT_ADDR = PORT_ADDR & 0xe0; 		// Clear the lower 5 bits of the address line
	PORT_ADDR = PORT_ADDR | (ATA_REG_DATA & 0x1f); 	// Assert the address Line

	for (i=0; i< numBytes; i+=2)
	{
		cbi(PORT_IDE_RD, PIN_IDE_RD);
	  	__asm volatile ("NOP");
	  	__asm volatile ("NOP");
	  	*(Buffer++)= PIN_DATAL;
	  	*(Buffer++)= PIN_DATAH;
		sbi(PORT_IDE_RD, PIN_IDE_RD);
	}
}


////////////////////
#ifndef ATA_READ_ONLY
//*****************************************************************************
// Function: ataWriteDataBuffer
// Parameters: Buffer, numBytes
// Returns: none
//
// Description: The entire Buffer will be pulled out to the ata dispositive
//*****************************************************************************
void ataWriteDataBuffer(unsigned char *Buffer, unsigned short numBytes)
{
	register unsigned int i asm ("r16");

	DDR_DATAL = 0xFF; 		      	// Use the PORT DATAH as an output
	DDR_DATAH = 0xFF; 		      	// Use the PORT DATAL as an output
	PORT_ADDR = PORT_ADDR & 0xe0; 		// Clear the lower 5 bits of the address line
	PORT_ADDR = PORT_ADDR | (ATA_REG_DATA & 0x1f); 	// Assert the address Line

	for (i=0; i< numBytes; i+=2)
	{
	  	PORT_DATAL= *(Buffer++);
	  	PORT_DATAH= *(Buffer++);
	  	cbi(PORT_IDE_WR, PIN_IDE_WR);
	  	__asm volatile ("NOP");
	  	__asm volatile ("NOP");
		sbi(PORT_IDE_WR, PIN_IDE_WR);
	}
}
#endif
////////////////////


//*****************************************************************************
// Function: ataStatusWait
// Parameters: mask, waitStatus
// Returns: the wait status
//
// Description: Read the Status form the hard disk until the result be equal waitStatus
//*****************************************************************************
unsigned char ataStatusWait(unsigned char mask, unsigned char waitStatus)
{
	register unsigned char status;

	// wait for desired status
	while( ((status = ataReadByte(ATA_REG_ACTSTATUS)) & mask) == waitStatus );
	return status;
}

//*****************************************************************************
// Function: ataReadSectorCHS
// Parameters: Driver, Head, Track, Sector, Buffer
// Returns: on Suscefull returns 0, the result errors otherwise.
//
// Description: Read one Sector (512 Bytes) from the ata dispositive
//*****************************************************************************
unsigned char ataReadSectorsCHS(	unsigned char Drive,
											unsigned char Head,
											unsigned int Track,
											unsigned char Sector,
											unsigned char *Buffer)
{
  	unsigned char temp;

	// Wait for drive to be ready
	temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);

  	// Prepare parameters...
	ataWriteByte(ATA_REG_HDDEVSEL, 0xA0+(Drive ? 0x10:00)+Head); // CHS mode/Drive/Head
	ataWriteByte(ATA_REG_CYLHI, Track>>8);  		// MSB of track
	ataWriteByte(ATA_REG_CYLLO, Track);     		// LSB of track
  	ataWriteByte(ATA_REG_STARTSEC, Sector);    	// sector
	ataWriteByte(ATA_REG_SECCOUNT, 1);			// # of sectors

	// Issue read sector command...
  	ataWriteByte(ATA_REG_CMDSTATUS1, 0x21);

	// Wait for drive to be ready
	temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);

	if (temp & ATA_SR_ERR)
		return 1;

	// Wait for drive to request data transfer
	ataStatusWait(ATA_SR_DRQ, 0);

	// read data from drive
	ataReadDataBuffer(Buffer, 512);

	// Return the error bit from the status register...
	temp = ataReadByte(ATA_REG_CMDSTATUS1);	// read status register

	return (temp & ATA_SR_ERR) ? 1:0;
}


////////////////////
#ifndef ATA_READ_ONLY
//*****************************************************************************
// Function: ataWriteSectorsCHS
// Parameters: Driver, Head, Track, Sector, Buffer
// Returns: on Suscefull returns 0, the result errors otherwise.
//
// Description: Write one Sector (512 Bytes) to the ata dispositive
//*****************************************************************************
unsigned char ataWriteSectorsCHS(unsigned char Drive,
											unsigned char Head,
											unsigned int Track,
											unsigned char Sector,
											unsigned char *Buffer)
{
  	unsigned char temp;

	// Wait for drive to be ready
	temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);

  	// Prepare parameters...
	ataWriteByte(ATA_REG_HDDEVSEL, 0xA0+(Drive ? 0x10:00)+Head); // CHS mode/Drive/Head
	ataWriteByte(ATA_REG_CYLHI, Track>>8);  		// MSB of track
	ataWriteByte(ATA_REG_CYLLO, Track);     		// LSB of track
  	ataWriteByte(ATA_REG_STARTSEC, Sector);    	// sector
	ataWriteByte(ATA_REG_SECCOUNT, 1);			// # of sectors

	// Issue write sector command
  	ataWriteByte(ATA_REG_CMDSTATUS1, 0x31);

	// Wait for drive to request data transfer
	ataStatusWait(ATA_SR_DRQ, 0);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本不卡视频在线观看| 欧美另类高清zo欧美| 91美女视频网站| 欧美日韩国产免费| 欧美人妇做爰xxxⅹ性高电影| 欧美精品乱码久久久久久| 精品久久久久久久久久久久久久久 | 欧美日韩激情在线| 成人小视频在线观看| 色女孩综合影院| 久久精品免费在线观看| 视频在线观看91| 99久久综合国产精品| 精品噜噜噜噜久久久久久久久试看 | 亚洲欧美日韩电影| 激情图片小说一区| 欧美日韩久久一区| 亚洲国产日韩一区二区| 久久综合综合久久综合| 99精品欧美一区二区三区综合在线| 91视频国产资源| 69久久夜色精品国产69蝌蚪网| 尤物av一区二区| 国产福利91精品| 欧美在线一区二区| 国产精品三级久久久久三级| 国产精品一区一区三区| 精品久久久久久亚洲综合网| 免费视频一区二区| 日韩亚洲欧美在线| 麻豆成人免费电影| 久久蜜桃一区二区| 国产麻豆视频一区| 国产精品视频你懂的| 国产成人综合在线播放| 亚洲国产激情av| youjizz久久| 亚洲人吸女人奶水| 欧美日韩一区二区三区不卡| 香蕉成人啪国产精品视频综合网| 欧美视频你懂的| 日本三级韩国三级欧美三级| 欧美肥胖老妇做爰| 国产乱色国产精品免费视频| 久久久午夜精品理论片中文字幕| 国产精品亚洲人在线观看| 中文字幕高清不卡| 色哟哟精品一区| 偷窥国产亚洲免费视频| 日韩欧美一卡二卡| 成人免费观看视频| 夜夜爽夜夜爽精品视频| 911精品国产一区二区在线| 日本91福利区| 国产精品日产欧美久久久久| 欧美性做爰猛烈叫床潮| 日韩黄色免费电影| 国产欧美一区二区精品性色超碰| 91亚洲精品久久久蜜桃| 日韩极品在线观看| 国产精品久线在线观看| 欧美伦理电影网| 国产一区不卡在线| 亚洲欧美日韩国产综合在线| 这里只有精品电影| 成人午夜视频网站| 亚洲va韩国va欧美va| 久久精品人人做人人爽人人| 色老汉一区二区三区| 久久99深爱久久99精品| 亚洲欧美电影院| 欧美tk—视频vk| 欧美日韩中文另类| jvid福利写真一区二区三区| 日本午夜一区二区| 亚洲免费在线电影| 2021国产精品久久精品| 色婷婷一区二区| 国产成人av电影在线播放| 亚洲一区二区三区三| 国产蜜臀av在线一区二区三区| 欧美区在线观看| 99综合影院在线| 狠狠色狠狠色综合系列| 天堂va蜜桃一区二区三区 | 欧美一区二区三区男人的天堂| 国产69精品久久99不卡| 麻豆视频一区二区| 一区二区欧美视频| 亚洲欧洲韩国日本视频| 国产色产综合色产在线视频| 91精品蜜臀在线一区尤物| 在线观看一区二区视频| 成人av在线播放网址| 国产一区二区三区精品欧美日韩一区二区三区 | www日韩大片| 91麻豆精品国产91久久久久久久久 | 91麻豆精品国产91久久久使用方法| 97se亚洲国产综合自在线观| 国产成人丝袜美腿| 精品影视av免费| 青青青爽久久午夜综合久久午夜| 亚洲一区二区欧美| 一区二区三区国产精华| 综合色中文字幕| 国产精品国产自产拍高清av | 欧美日韩成人在线| 欧美日韩一级二级三级| 欧美性xxxxxxxx| 欧美午夜精品久久久久久孕妇 | 国产mv日韩mv欧美| 国产suv精品一区二区883| 韩国av一区二区| 国产成人一区在线| 9人人澡人人爽人人精品| 成人国产电影网| 99精品国产99久久久久久白柏| 成人免费看视频| 色天天综合色天天久久| 色吊一区二区三区 | 国产999精品久久久久久绿帽| 国产成a人亚洲精品| 99久久精品国产毛片| 成人动漫在线一区| 欧美在线免费观看视频| 欧美乱妇23p| 久久久久久免费网| 国产精品欧美一区喷水| 一区二区三区在线视频观看| 亚洲国产成人av好男人在线观看| 天使萌一区二区三区免费观看| 日韩中文字幕一区二区三区| 精一区二区三区| eeuss鲁片一区二区三区在线观看| www.66久久| 精品视频全国免费看| 日韩美一区二区三区| 久久久激情视频| 亚洲黄色性网站| 日韩1区2区日韩1区2区| 国产不卡免费视频| 欧美军同video69gay| 精品日韩欧美在线| 亚洲欧美日韩一区二区| 午夜私人影院久久久久| 国产毛片精品国产一区二区三区| 91在线观看高清| 欧美一卡2卡3卡4卡| 亚洲国产精品成人综合| 婷婷激情综合网| 成人免费高清在线| 91精品国产91久久久久久最新毛片 | 亚洲一区中文日韩| 国产综合久久久久久鬼色 | 悠悠色在线精品| 国产真实乱偷精品视频免| 色婷婷久久99综合精品jk白丝| 欧美妇女性影城| 亚洲三级久久久| 国模一区二区三区白浆| 欧美亚洲图片小说| 国产精品美女久久久久久久久 | 91小视频免费观看| 日韩精品一区二区三区蜜臀| 亚洲天堂网中文字| 国产传媒欧美日韩成人| 正在播放亚洲一区| 一区二区不卡在线视频 午夜欧美不卡在| 蜜臂av日日欢夜夜爽一区| 欧美中文字幕一二三区视频| 久久精品一区二区三区不卡牛牛| 五月天精品一区二区三区| 91女人视频在线观看| 久久久91精品国产一区二区精品| 日本欧美大码aⅴ在线播放| 99久久精品久久久久久清纯| 久久精品在线免费观看| 精品中文字幕一区二区| 在线综合视频播放| 亚洲福利视频三区| 欧美在线视频全部完| 一区二区三区四区精品在线视频| 成人黄色小视频| 国产欧美一区在线| 国产黑丝在线一区二区三区| 欧美精品一区二| 国内精品伊人久久久久av一坑| 宅男噜噜噜66一区二区66| 午夜精彩视频在线观看不卡| 色狠狠av一区二区三区| 一区二区三区中文字幕精品精品 | 国产精品一区在线观看你懂的| 日韩欧美高清dvd碟片| 日韩电影免费在线| 在线综合+亚洲+欧美中文字幕| 日韩激情视频在线观看| 欧美一区二区久久| 久草精品在线观看| 国产视频一区在线观看| caoporen国产精品视频|