Line 120... |
Line 120... |
{
|
{
|
/* set DeviceID */
|
/* set DeviceID */
|
device->internals.dev = dev;
|
device->internals.dev = dev;
|
|
|
/* generate stream for hd_simulation */
|
/* generate stream for hd_simulation */
|
switch(device->type)
|
switch(device->conf.type)
|
{
|
{
|
case TYPE_NO_CONNECT:
|
case TYPE_NO_CONNECT:
|
TRACE("ata_device, using type NO_CONNECT.\n");
|
TRACE("ata_device, using type NO_CONNECT.\n");
|
device->stream = NULL;
|
device->conf.stream = NULL;
|
break;
|
break;
|
|
|
case TYPE_FILE:
|
case TYPE_FILE:
|
TRACE("ata_device, using device type FILE.\n");
|
TRACE("ata_device, using device type FILE.\n");
|
device->stream = open_file(&device->size, device->file);
|
device->conf.stream = open_file(&device->conf.size, device->conf.file);
|
break;
|
break;
|
|
|
case TYPE_LOCAL:
|
case TYPE_LOCAL:
|
TRACE("ata_device, using device type LOCAL.\n");
|
TRACE("ata_device, using device type LOCAL.\n");
|
device->stream = open_local();
|
device->conf.stream = open_local();
|
break;
|
break;
|
|
|
default:
|
default:
|
ERR("Illegal device-type. Defaulting to type NO_CONNECT.\n");
|
ERR("Illegal device-type. Defaulting to type NO_CONNECT.\n");
|
device->stream = NULL;
|
device->conf.stream = NULL;
|
break;
|
break;
|
}
|
}
|
}
|
}
|
|
|
/*
|
/*
|
Line 151... |
Line 151... |
*/
|
*/
|
void ata_devices_init(ata_devices *devices)
|
void ata_devices_init(ata_devices *devices)
|
{
|
{
|
ata_device_init(&devices->device[0], 0);
|
ata_device_init(&devices->device[0], 0);
|
|
|
if(devices->device[0].type)
|
if(devices->device[0].conf.type)
|
ata_device_init(&devices->device[1], ATA_DHR_DEV);
|
ata_device_init(&devices->device[1], ATA_DHR_DEV);
|
else
|
else
|
ata_device_init(&devices->device[1], 0);
|
ata_device_init(&devices->device[1], 0);
|
}
|
}
|
|
|
Line 182... |
Line 182... |
|
|
/* clear busy bit */
|
/* clear busy bit */
|
device->regs.status &= ~ATA_SR_BSY;
|
device->regs.status &= ~ATA_SR_BSY;
|
|
|
/* set DRDY bit, when not a PACKET device */
|
/* set DRDY bit, when not a PACKET device */
|
if(!device->packet)
|
if(!device->conf.packet)
|
device->regs.status |= ATA_SR_DRDY;
|
device->regs.status |= ATA_SR_DRDY;
|
|
|
/* set new state */
|
/* set new state */
|
device->internals.state = ATA_STATE_IDLE;
|
device->internals.state = ATA_STATE_IDLE;
|
}
|
}
|
Line 213... |
Line 213... |
{
|
{
|
/* display debug information */
|
/* display debug information */
|
TRACE("ata_devices_hw_reset.\n");
|
TRACE("ata_devices_hw_reset.\n");
|
|
|
/* find device 0 */
|
/* find device 0 */
|
if((devices->device[0].stream) && (devices->device[1].stream)) {
|
if((devices->device[0].conf.stream) && (devices->device[1].conf.stream)) {
|
/* this one is simple, device0 is device0 */
|
/* this one is simple, device0 is device0 */
|
|
|
/* 1) handle device1 first */
|
/* 1) handle device1 first */
|
ata_device_hw_reset(&devices->device[1], reset_signal,
|
ata_device_hw_reset(&devices->device[1], reset_signal,
|
1, /* assert dasp, this is device1 */
|
1, /* assert dasp, this is device1 */
|
Line 227... |
Line 227... |
/* 2) Then handle device0 */
|
/* 2) Then handle device0 */
|
ata_device_hw_reset(&devices->device[0], reset_signal,
|
ata_device_hw_reset(&devices->device[0], reset_signal,
|
0,
|
0,
|
devices->device[1].sigs.pdiago,
|
devices->device[1].sigs.pdiago,
|
devices->device[1].sigs.daspo);
|
devices->device[1].sigs.daspo);
|
} else if(devices->device[0].stream) {
|
} else if(devices->device[0].conf.stream) {
|
/* device0 is device0, there's no device1 */
|
/* device0 is device0, there's no device1 */
|
ata_device_hw_reset(&devices->device[0], reset_signal,
|
ata_device_hw_reset(&devices->device[0], reset_signal,
|
0, /* negate dasp, this is device0 */
|
0, /* negate dasp, this is device0 */
|
0, /* negate pdiag input, there's no device1*/
|
0, /* negate pdiag input, there's no device1*/
|
0); /* negate dasp input, there's no device1 */
|
0); /* negate dasp input, there's no device1 */
|
} else if(devices->device[1].stream) {
|
} else if(devices->device[1].conf.stream) {
|
/* device1 is (logical) device0, there's no (physical) device0 */
|
/* device1 is (logical) device0, there's no (physical) device0 */
|
ata_device_hw_reset(&devices->device[1], reset_signal,
|
ata_device_hw_reset(&devices->device[1], reset_signal,
|
0, /* negate dasp, this is device0 */
|
0, /* negate dasp, this is device0 */
|
0, /* negate pdiag input, there's no device1*/
|
0, /* negate pdiag input, there's no device1*/
|
0); /* negate dasp input, there's no device1 */
|
0); /* negate dasp input, there's no device1 */
|
Line 289... |
Line 289... |
|
|
/* clear busy bit */
|
/* clear busy bit */
|
device->regs.status &= ~ATA_SR_BSY;
|
device->regs.status &= ~ATA_SR_BSY;
|
|
|
/* set DRDY bit, when not a PACKET device */
|
/* set DRDY bit, when not a PACKET device */
|
if (!device->packet)
|
if(!device->conf.packet)
|
device->regs.status |= ATA_SR_DRDY;
|
device->regs.status |= ATA_SR_DRDY;
|
|
|
/* set new state */
|
/* set new state */
|
device->internals.state = ATA_STATE_IDLE;
|
device->internals.state = ATA_STATE_IDLE;
|
|
|
Line 336... |
Line 336... |
short ata_devices_read(ata_devices *devices, char adr)
|
short ata_devices_read(ata_devices *devices, char adr)
|
{
|
{
|
ata_device *device;
|
ata_device *device;
|
|
|
/* check for no connected devices */
|
/* check for no connected devices */
|
if((!devices->device[0].stream) && (!devices->device[1].stream))
|
if((!devices->device[0].conf.stream) && (!devices->device[1].conf.stream))
|
ERR("ata_devices_read, no ata devices connected.\n");
|
ERR("ata_devices_read, no ata devices connected.\n");
|
else
|
else
|
{
|
{
|
/* check if both device0 and device1 are connected */
|
/* check if both device0 and device1 are connected */
|
if((devices->device[0].stream) && (devices->device[1].stream)) {
|
if((devices->device[0].conf.stream) && (devices->device[1].conf.stream)) {
|
/* get the current active device */
|
/* get the current active device */
|
if (devices->device[1].regs.device_head & ATA_DHR_DEV)
|
if (devices->device[1].regs.device_head & ATA_DHR_DEV)
|
device = &devices->device[1];
|
device = &devices->device[1];
|
else
|
else
|
device = &devices->device[0];
|
device = &devices->device[0];
|
}
|
}
|
else
|
else
|
{
|
{
|
/* only one device connected */
|
/* only one device connected */
|
if(devices->device[1].stream)
|
if(devices->device[1].conf.stream)
|
device = &devices->device[1];
|
device = &devices->device[1];
|
else
|
else
|
device = &devices->device[0];
|
device = &devices->device[0];
|
}
|
}
|
|
|
Line 514... |
Line 514... |
|
|
/* Write to devices */
|
/* Write to devices */
|
void ata_devices_write(ata_devices *devices, char adr, short value)
|
void ata_devices_write(ata_devices *devices, char adr, short value)
|
{
|
{
|
/* check for no connected devices */
|
/* check for no connected devices */
|
if(!devices->device[0].stream && !devices->device[1].stream)
|
if(!devices->device[0].conf.stream && !devices->device[1].conf.stream)
|
ERR("ata_devices_write, no ata devices connected.\n");
|
ERR("ata_devices_write, no ata devices connected.\n");
|
else {
|
else {
|
/* first device */
|
/* first device */
|
if(devices->device[0].stream)
|
if(devices->device[0].conf.stream)
|
ata_device_write(&devices->device[0], adr, value);
|
ata_device_write(&devices->device[0], adr, value);
|
|
|
/* second device */
|
/* second device */
|
if(devices->device[1].stream)
|
if(devices->device[1].conf.stream)
|
ata_device_write(&devices->device[1], adr, value);
|
ata_device_write(&devices->device[1], adr, value);
|
}
|
}
|
}
|
}
|
|
|
|
|
No newline at end of file
|
No newline at end of file
|