gdrom_jvm_boot: use g1_if DMA
This commit is contained in:
parent
540dec3299
commit
88a47068f2
@ -35,6 +35,25 @@ void pio_data(const uint8_t * data)
|
|||||||
while (gdrom::status::bsy(gdrom_if.status) != 0);
|
while (gdrom::status::bsy(gdrom_if.status) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dma_data(const uint8_t * data)
|
||||||
|
{
|
||||||
|
while ((gdrom::status::bsy(gdrom_if.status) | gdrom::status::drq(gdrom_if.status)) != 0);
|
||||||
|
|
||||||
|
gdrom_if.features = gdrom::features::dma::enable;
|
||||||
|
gdrom_if.drive_select = gdrom::drive_select::drive_select
|
||||||
|
| gdrom::drive_select::lun(0);
|
||||||
|
|
||||||
|
gdrom_if.command = gdrom::command::code::packet_command;
|
||||||
|
while (gdrom::status::drq(gdrom_if.status) == 0);
|
||||||
|
|
||||||
|
const uint16_t * buf = reinterpret_cast<const uint16_t *>(&data[0]);
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
gdrom_if.data = buf[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
while (gdrom::status::bsy(gdrom_if.status) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
void read_data(uint16_t * buf, const uint32_t length)
|
void read_data(uint16_t * buf, const uint32_t length)
|
||||||
{
|
{
|
||||||
//serial::string("read_data drq interrupt_reason: ");
|
//serial::string("read_data drq interrupt_reason: ");
|
||||||
@ -105,6 +124,23 @@ uint32_t cd_read(uint16_t * buf,
|
|||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cd_read_dma(const uint32_t starting_address,
|
||||||
|
const uint32_t transfer_length)
|
||||||
|
{
|
||||||
|
const uint8_t data_select = 0b0010; // data
|
||||||
|
const uint8_t expected_data_type = 0b100; // XA mode 2 form 1
|
||||||
|
const uint8_t parameter_type = 0b0; // FAD specified
|
||||||
|
const uint8_t data = (data_select << 4) | (expected_data_type << 1) | (parameter_type << 0);
|
||||||
|
|
||||||
|
auto packet = gdrom_command_packet_format::cd_read(data,
|
||||||
|
starting_address,
|
||||||
|
transfer_length);
|
||||||
|
serial::string("cd_read\n");
|
||||||
|
serial::string("starting_address: ");
|
||||||
|
serial::integer<uint32_t>(starting_address);
|
||||||
|
dma_data(packet._data());
|
||||||
|
}
|
||||||
|
|
||||||
bool dr_is_self_or_parent(const iso9660::directory_record * dr)
|
bool dr_is_self_or_parent(const iso9660::directory_record * dr)
|
||||||
{
|
{
|
||||||
if (dr->length_of_file_identifier != 1)
|
if (dr->length_of_file_identifier != 1)
|
||||||
@ -143,13 +179,28 @@ void load_jvm_bin(const iso9660::directory_record * dr)
|
|||||||
serial::string("load jvm bin:\n");
|
serial::string("load jvm bin:\n");
|
||||||
//__attribute__((aligned(4))) static uint16_t file_buf16[16384 / 2];
|
//__attribute__((aligned(4))) static uint16_t file_buf16[16384 / 2];
|
||||||
//uint32_t * file_buf32 = reinterpret_cast<uint32_t *>(file_buf16);
|
//uint32_t * file_buf32 = reinterpret_cast<uint32_t *>(file_buf16);
|
||||||
uint16_t * load_buf = reinterpret_cast<uint16_t *>(load_address);
|
|
||||||
int offset = 0;
|
|
||||||
|
|
||||||
int extent = dr->location_of_extent.get();
|
int extent = dr->location_of_extent.get();
|
||||||
int data_length = dr->data_length.get();
|
int data_length = dr->data_length.get();
|
||||||
serial::integer<uint32_t>(extent);
|
|
||||||
|
|
||||||
|
int sectors = ((data_length + 2047) / 2048);
|
||||||
|
data_length = sectors * 2048;
|
||||||
|
|
||||||
|
g1_if.GDAPRO = 0x8843407F;
|
||||||
|
g1_if.G1GDRC = 0x00001001;
|
||||||
|
g1_if.GDSTAR = load_address & ~(0b111 << 29);
|
||||||
|
g1_if.GDLEN = data_length;
|
||||||
|
g1_if.GDDIR = 1;
|
||||||
|
g1_if.GDEN = 1;
|
||||||
|
g1_if.GDST = 1;
|
||||||
|
|
||||||
|
cd_read_dma(extent + 150,
|
||||||
|
sectors);
|
||||||
|
|
||||||
|
serial::string("wait gdst");
|
||||||
|
while ((g1_if.GDST & 1) != 0);
|
||||||
|
|
||||||
|
/*
|
||||||
int transfers = 0;
|
int transfers = 0;
|
||||||
while (data_length > 0) {
|
while (data_length > 0) {
|
||||||
int transfer_size = min(data_length, 2048);
|
int transfer_size = min(data_length, 2048);
|
||||||
@ -168,6 +219,7 @@ void load_jvm_bin(const iso9660::directory_record * dr)
|
|||||||
data_length -= sectors * 2048;
|
data_length -= sectors * 2048;
|
||||||
transfers += 1;
|
transfers += 1;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
serial::string("\njvm load complete\n");
|
serial::string("\njvm load complete\n");
|
||||||
jvm_load_complete = true;
|
jvm_load_complete = true;
|
||||||
@ -176,9 +228,6 @@ void load_jvm_bin(const iso9660::directory_record * dr)
|
|||||||
serial::string("size: ");
|
serial::string("size: ");
|
||||||
serial::integer<uint32_t>(dr->data_length.get());
|
serial::integer<uint32_t>(dr->data_length.get());
|
||||||
__data_length = dr->data_length.get();
|
__data_length = dr->data_length.get();
|
||||||
|
|
||||||
serial::string("transfers: ");
|
|
||||||
serial::integer<uint32_t>(transfers);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void walk_directory_record(const iso9660::directory_record * dr)
|
void walk_directory_record(const iso9660::directory_record * dr)
|
||||||
@ -277,7 +326,6 @@ void main()
|
|||||||
serial::integer<uint32_t>(jvm_load_complete);
|
serial::integer<uint32_t>(jvm_load_complete);
|
||||||
if (jvm_load_complete) {
|
if (jvm_load_complete) {
|
||||||
main_ptr_t jvm_main = reinterpret_cast<main_ptr_t>(load_address);
|
main_ptr_t jvm_main = reinterpret_cast<main_ptr_t>(load_address);
|
||||||
uint8_t * load_buf = reinterpret_cast<uint8_t *>(load_address);
|
|
||||||
|
|
||||||
serial::string("crc32: ");
|
serial::string("crc32: ");
|
||||||
int chunks = __data_length / 2048;
|
int chunks = __data_length / 2048;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user