gdrom: add gdrom_bits

This commit is contained in:
Zack Buhman 2024-02-26 17:46:35 +08:00
parent c95182081a
commit 41b707e75d
7 changed files with 194 additions and 53 deletions

View File

@ -131,7 +131,7 @@ audio.pcm:
$(BUILD_BINARY_O)
%.csv: %.ods
libreoffice --headless -convert-to csv:"Text - txt - csv (StarCalc)":44,34,76,,,,true --outdir $(dir $@) $<
libreoffice --headless --convert-to csv:"Text - txt - csv (StarCalc)":44,34,76,,,,true --outdir $(dir $@) $<
maple/maple_bus_commands.hpp: regs/maple_bus_commands.csv regs/gen/maple_bus_commands.py
python regs/gen/maple_bus_commands.py $< > $@
@ -160,6 +160,9 @@ sh7091/sh7091.hpp: regs/sh7091.csv regs/gen/sh7091.py
sh7091/sh7091_bits.hpp: regs/sh7091_bits.csv regs/gen/core_bits.py
python regs/gen/core_bits.py $< > $@
gdrom/gdrom_bits.hpp: regs/gdrom_bits.csv regs/gen/core_bits.py
python regs/gen/core_bits.py $< gdrom > $@
gdrom/command_packet_format.hpp: regs/gdrom_command_packet_format.csv regs/gen/gdrom_command_packet_format.py regs/gen/generic_sparse_struct.py
python regs/gen/gdrom_command_packet_format.py $< gdrom_command_packet_format > $@

View File

@ -11,29 +11,28 @@ union data {
};
static_assert((sizeof (data)) == 2);
void test_unit()
{
serial::string("test_unit\n");
// wait for BSY == 0 && DRQ == 0
while ((gdrom_if.status & (gdrom::status::bsy | gdrom::status::drq)) != 0) {
while ((gdrom::status::bsy(gdrom_if.status) | gdrom::status::drq(gdrom_if.status)) != 0) {
serial::integer<uint8_t>(gdrom_if.status);
for (int i = 0; i < 1000000; i++) { asm volatile ("nop;"); }
};
serial::string("bsy | drq == 0\n");
gdrom_if.command = 0xa0; // packet command
while ((gdrom_if.status & gdrom::status::drq) == 0);
while ((gdrom::status::drq(gdrom_if.status)) == 0);
serial::string("drq != 0; CoD: ");
serial::integer<uint8_t>(gdrom_if.interrupt_reason & 1);
serial::string("bsy1: ");
serial::integer<uint8_t>(gdrom_if.status & gdrom::status::bsy);
serial::integer<uint8_t>(gdrom::status::bsy(gdrom_if.status));
for (int i = 0; i < 6; i++)
gdrom_if.data = 0;
serial::integer<uint8_t>(gdrom_if.status & gdrom::status::bsy);
serial::integer<uint8_t>(gdrom::status::bsy(gdrom_if.status));
while ((gdrom_if.status & (gdrom::status::bsy | gdrom::status::drq)) != 0);
while ((gdrom::status::bsy(gdrom_if.status) | gdrom::status::drq(gdrom_if.status)) != 0);
serial::string("bsy2: ");
serial::integer<uint8_t>(gdrom_if.status);
serial::string("\n");
@ -41,7 +40,7 @@ void test_unit()
void pio_data(const uint8_t * data)
{
while ((gdrom_if.status & (gdrom::status::bsy | gdrom::status::drq)) != 0);
while ((gdrom::status::bsy(gdrom_if.status) | gdrom::status::drq(gdrom_if.status)) != 0);
serial::string("bsy | drq == 0\n");
gdrom_if.features = 0; // not DMA
@ -49,10 +48,7 @@ void pio_data(const uint8_t * data)
gdrom_if.command = 0xa0; // packet command
// CoD
//serial::string("wait CoD\n");
while ((gdrom_if.interrupt_reason & 0b11) != gdrom::interrupt_reason::cod);
//serial::string("done CoD\n");
while ((gdrom_if.status & gdrom::status::drq) == 0);
while (gdrom::status::drq(gdrom_if.status) == 0);
serial::string("drq == 1\n");
const uint16_t * buf = reinterpret_cast<const uint16_t *>(&data[0]);
@ -62,7 +58,7 @@ void pio_data(const uint8_t * data)
serial::string("status1: ");
serial::integer<uint8_t>(gdrom_if.status);
while ((gdrom_if.status & gdrom::status::bsy) != 0) {
while (gdrom::status::bsy(gdrom_if.status) != 0) {
serial::integer<uint8_t>(gdrom_if.status);
for (int i = 0; i < 10000000; i++) { asm volatile ("nop;"); }
};

View File

@ -1,43 +1,121 @@
#pragma once
#include <cstdint>
#include "../float_uint32.hpp"
namespace gdrom {
namespace status {
constexpr uint8_t bsy = (1 << 7);
constexpr uint8_t drdy = (1 << 6);
constexpr uint8_t df = (1 << 5);
constexpr uint8_t dsc = (1 << 4);
constexpr uint8_t drq = (1 << 3);
constexpr uint8_t corr = (1 << 2);
constexpr uint8_t check = (1 << 0);
constexpr uint32_t bsy(uint32_t reg) { return (reg >> 7) & 0x1; }
constexpr uint32_t drdy(uint32_t reg) { return (reg >> 6) & 0x1; }
constexpr uint32_t df(uint32_t reg) { return (reg >> 5) & 0x1; }
constexpr uint32_t dsc(uint32_t reg) { return (reg >> 4) & 0x1; }
constexpr uint32_t drq(uint32_t reg) { return (reg >> 3) & 0x1; }
constexpr uint32_t corr(uint32_t reg) { return (reg >> 2) & 0x1; }
constexpr uint32_t check(uint32_t reg) { return (reg >> 0) & 0x1; }
}
namespace interrupt_reason {
constexpr uint8_t io = (1 << 1);
constexpr uint8_t cod = (1 << 0);
namespace alternate_status {
constexpr uint32_t bsy(uint32_t reg) { return (reg >> 7) & 0x1; }
constexpr uint32_t drdy(uint32_t reg) { return (reg >> 6) & 0x1; }
constexpr uint32_t df(uint32_t reg) { return (reg >> 5) & 0x1; }
constexpr uint32_t dsc(uint32_t reg) { return (reg >> 4) & 0x1; }
constexpr uint32_t drq(uint32_t reg) { return (reg >> 3) & 0x1; }
constexpr uint32_t corr(uint32_t reg) { return (reg >> 2) & 0x1; }
constexpr uint32_t check(uint32_t reg) { return (reg >> 0) & 0x1; }
}
namespace command {
namespace code {
constexpr uint32_t soft_reset = 0x08 << 0;
constexpr uint32_t execute_device_diagnostic = 0x90 << 0;
constexpr uint32_t nop = 0x00 << 0;
constexpr uint32_t packet_command = 0xa0 << 0;
constexpr uint32_t identify_device = 0xa1 << 0;
constexpr uint32_t set_features = 0xef << 0;
constexpr uint8_t test_unit = 0x00;
constexpr uint8_t req_stat = 0x10;
constexpr uint8_t req_mode = 0x11;
constexpr uint8_t set_mode = 0x12;
constexpr uint8_t req_error = 0x13;
constexpr uint8_t get_toc = 0x14;
constexpr uint8_t req_ses = 0x15;
constexpr uint8_t cd_open = 0x16;
constexpr uint8_t cd_play = 0x20;
constexpr uint8_t cd_seek = 0x21;
constexpr uint8_t cd_scan = 0x22;
constexpr uint8_t cd_read = 0x30;
constexpr uint8_t cd_read2 = 0x31;
constexpr uint8_t get_scd = 0x40;
constexpr uint32_t bit_mask = 0xff << 0;
}
}
namespace device_control {
constexpr uint32_t device_control = 0b1000 << 0;
constexpr uint32_t srst = 1 << 2;
constexpr uint32_t nien = 1 << 1;
}
namespace drive_select {
constexpr uint32_t drive_select = 0b1010 << 4;
constexpr uint32_t lun(uint32_t num) { return (num & 0xf) << 0; }
}
namespace error {
constexpr uint32_t sense_key(uint32_t reg) { return (reg >> 4) & 0xf; }
constexpr uint32_t mcr(uint32_t reg) { return (reg >> 3) & 0x1; }
constexpr uint32_t abrt(uint32_t reg) { return (reg >> 2) & 0x1; }
constexpr uint32_t eomf(uint32_t reg) { return (reg >> 1) & 0x1; }
constexpr uint32_t ili(uint32_t reg) { return (reg >> 0) & 0x1; }
}
namespace features {
namespace dma {
constexpr uint32_t disable = 0 << 0;
constexpr uint32_t enable = 1 << 0;
constexpr uint32_t bit_mask = 0x1 << 0;
}
}
namespace features_ata {
namespace set_clear {
constexpr uint32_t clear = 0 << 7;
constexpr uint32_t set = 1 << 7;
constexpr uint32_t bit_mask = 0x1 << 7;
}
namespace command {
constexpr uint32_t set_transfer_mode = 3 << 0;
constexpr uint32_t bit_mask = 0x7f << 0;
}
}
namespace interrupt_reason {
constexpr uint32_t io(uint32_t reg) { return (reg >> 1) & 0x1; }
constexpr uint32_t cod(uint32_t reg) { return (reg >> 0) & 0x1; }
}
namespace sector_count {
namespace transfer_mode {
constexpr uint32_t pio_default_transfer_mode = 0b00000000 << 0;
constexpr uint32_t pio_flow_control_transfer_mode = 0b00001000 << 0;
constexpr uint32_t single_word_dma_mode = 0b00010000 << 0;
constexpr uint32_t multi_word_dma_mode = 0b00100000 << 0;
constexpr uint32_t bit_mask = 0xff << 0;
}
}
namespace sector_number {
constexpr uint32_t disc_format(uint32_t reg) { return (reg >> 4) & 0xf; }
constexpr uint32_t status(uint32_t reg) { return (reg >> 0) & 0xf; }
}
namespace error_ata {
namespace sense_key {
constexpr uint32_t no_sense = 0x0 << 0;
constexpr uint32_t recovered_error = 0x1 << 0;
constexpr uint32_t not_ready = 0x2 << 0;
constexpr uint32_t medium_error = 0x3 << 0;
constexpr uint32_t hardware_error = 0x4 << 0;
constexpr uint32_t illegal_request = 0x5 << 0;
constexpr uint32_t unit_attention = 0x6 << 0;
constexpr uint32_t data_protect = 0x7 << 0;
constexpr uint32_t aborted_command = 0xb << 0;
constexpr uint32_t bit_mask = 0xf << 0;
}
}
}

Binary file not shown.

64
regs/gdrom_bits.csv Normal file
View File

@ -0,0 +1,64 @@
"register_name","enum_name","bits","bit_name","value","mask","description"
"status",,"7","bsy",,,
"status",,"6","drdy",,,
"status",,"5","df",,,
"status",,"4","dsc",,,
"status",,"3","drq",,,
"status",,"2","corr",,,
"status",,"0","check",,,
,,,,,,
"alternate_status",,"7","bsy",,,
"alternate_status",,"6","drdy",,,
"alternate_status",,"5","df",,,
"alternate_status",,"4","dsc",,,
"alternate_status",,"3","drq",,,
"alternate_status",,"2","corr",,,
"alternate_status",,"0","check",,,
,,,,,,
"command","code","7-0","soft_reset","0x08",,
"command","code","7-0","execute_device_diagnostic","0x90",,
"command","code","7-0","nop","0x00",,
"command","code","7-0","packet_command","0xa0",,
"command","code","7-0","identify_device","0xa1",,
"command","code","7-0","set_features","0xef",,
,,,,,,
"device_control",,"3,0","device_control","0b1000",,
"device_control",,"2","srst","1",,
"device_control",,"1","nien","1",,
,,,,,,
"drive_select",,"7-4","drive_select","0b1010",,
"drive_select",,"3-0","lun",,"0xf",
,,,,,,
"error",,"7-4","sense_key",,,
"error",,"3","mcr",,,
"error",,"2","abrt",,,
"error",,"1","eomf",,,
"error",,"0","ili",,,
,,,,,,
"features","dma","0","disable","0",,
"features","dma","0","enable","1",,
,,,,,,
"features_ata","set_clear","7","clear","0",,
"features_ata","set_clear","7","set","1",,
"features_ata","command","6-0","set_transfer_mode","3",,
,,,,,,
"interrupt_reason",,"1","io",,,
"interrupt_reason",,"0","cod",,,
,,,,,,
"sector_count","transfer_mode","7-0","pio_default_transfer_mode","0b00000000",,
"sector_count","transfer_mode","7-0","pio_flow_control_transfer_mode","0b00001000",,
"sector_count","transfer_mode","7-0","single_word_dma_mode","0b00010000",,
"sector_count","transfer_mode","7-0","multi_word_dma_mode","0b00100000",,
,,,,,,
"sector_number",,"7-4","disc_format",,,
"sector_number",,"3-0","status",,,
,,,,,,
"error_ata","sense_key","3-0","no_sense","0x0",,
"error_ata","sense_key","3-0","recovered_error","0x1",,
"error_ata","sense_key","3-0","not_ready","0x2",,
"error_ata","sense_key","3-0","medium_error","0x3",,
"error_ata","sense_key","3-0","hardware_error","0x4",,
"error_ata","sense_key","3-0","illegal_request","0x5",,
"error_ata","sense_key","3-0","unit_attention","0x6",,
"error_ata","sense_key","3-0","data_protect","0x7",,
"error_ata","sense_key","3-0","aborted_command","0xb",,
1 register_name enum_name bits bit_name value mask description
2 status 7 bsy
3 status 6 drdy
4 status 5 df
5 status 4 dsc
6 status 3 drq
7 status 2 corr
8 status 0 check
9
10 alternate_status 7 bsy
11 alternate_status 6 drdy
12 alternate_status 5 df
13 alternate_status 4 dsc
14 alternate_status 3 drq
15 alternate_status 2 corr
16 alternate_status 0 check
17
18 command code 7-0 soft_reset 0x08
19 command code 7-0 execute_device_diagnostic 0x90
20 command code 7-0 nop 0x00
21 command code 7-0 packet_command 0xa0
22 command code 7-0 identify_device 0xa1
23 command code 7-0 set_features 0xef
24
25 device_control 3,0 device_control 0b1000
26 device_control 2 srst 1
27 device_control 1 nien 1
28
29 drive_select 7-4 drive_select 0b1010
30 drive_select 3-0 lun 0xf
31
32 error 7-4 sense_key
33 error 3 mcr
34 error 2 abrt
35 error 1 eomf
36 error 0 ili
37
38 features dma 0 disable 0
39 features dma 0 enable 1
40
41 features_ata set_clear 7 clear 0
42 features_ata set_clear 7 set 1
43 features_ata command 6-0 set_transfer_mode 3
44
45 interrupt_reason 1 io
46 interrupt_reason 0 cod
47
48 sector_count transfer_mode 7-0 pio_default_transfer_mode 0b00000000
49 sector_count transfer_mode 7-0 pio_flow_control_transfer_mode 0b00001000
50 sector_count transfer_mode 7-0 single_word_dma_mode 0b00010000
51 sector_count transfer_mode 7-0 multi_word_dma_mode 0b00100000
52
53 sector_number 7-4 disc_format
54 sector_number 3-0 status
55
56 error_ata sense_key 3-0 no_sense 0x0
57 error_ata sense_key 3-0 recovered_error 0x1
58 error_ata sense_key 3-0 not_ready 0x2
59 error_ata sense_key 3-0 medium_error 0x3
60 error_ata sense_key 3-0 hardware_error 0x4
61 error_ata sense_key 3-0 illegal_request 0x5
62 error_ata sense_key 3-0 unit_attention 0x6
63 error_ata sense_key 3-0 data_protect 0x7
64 error_ata sense_key 3-0 aborted_command 0xb

BIN
regs/gdrom_bits.ods Normal file

Binary file not shown.

View File

@ -41,9 +41,9 @@ def aggregate_enums(aggregated_rows):
all_bits = set()
enum_bits = dict()
def assert_unique_ordered(bits):
def assert_unique_ordered(bits, row):
nonlocal all_bits
assert all(bit not in all_bits for bit in bits), bits
assert all(bit not in all_bits for bit in bits), (bits, row)
assert max(all_bits, default=32) > max(bits), (all_bits, bits)
all_bits |= bits
@ -51,11 +51,11 @@ def aggregate_enums(aggregated_rows):
bits = parse_bit_range(row["bits"])
assert row["bit_name"] != "", row
if row["enum_name"] == "":
assert_unique_ordered(bits)
assert_unique_ordered(bits, row)
non_enum.append(row)
else:
if row["enum_name"] not in enum_bits:
assert_unique_ordered(bits)
assert_unique_ordered(bits, row)
non_enum.append(row["enum_name"])
else:
assert enum_bits[row["enum_name"]] == bits, row