From 41b707e75de8f2639a9101b6c924ab5ab6500c88 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Mon, 26 Feb 2024 17:46:35 +0800 Subject: [PATCH] gdrom: add gdrom_bits --- common.mk | 5 +- example/gdrom_test.cpp | 20 +++--- gdrom/gdrom_bits.hpp | 150 +++++++++++++++++++++++++++++++---------- regs/gdrom.ods | Bin 15676 -> 16136 bytes regs/gdrom_bits.csv | 64 ++++++++++++++++++ regs/gdrom_bits.ods | Bin 0 -> 14858 bytes regs/gen/core_bits.py | 8 +-- 7 files changed, 194 insertions(+), 53 deletions(-) create mode 100644 regs/gdrom_bits.csv create mode 100644 regs/gdrom_bits.ods diff --git a/common.mk b/common.mk index 67ae4a0..2aaf69b 100644 --- a/common.mk +++ b/common.mk @@ -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 > $@ diff --git a/example/gdrom_test.cpp b/example/gdrom_test.cpp index be00070..6baa88f 100644 --- a/example/gdrom_test.cpp +++ b/example/gdrom_test.cpp @@ -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(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(gdrom_if.interrupt_reason & 1); serial::string("bsy1: "); - serial::integer(gdrom_if.status & gdrom::status::bsy); + serial::integer(gdrom::status::bsy(gdrom_if.status)); for (int i = 0; i < 6; i++) gdrom_if.data = 0; - serial::integer(gdrom_if.status & gdrom::status::bsy); + serial::integer(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(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(&data[0]); @@ -62,7 +58,7 @@ void pio_data(const uint8_t * data) serial::string("status1: "); serial::integer(gdrom_if.status); - while ((gdrom_if.status & gdrom::status::bsy) != 0) { + while (gdrom::status::bsy(gdrom_if.status) != 0) { serial::integer(gdrom_if.status); for (int i = 0; i < 10000000; i++) { asm volatile ("nop;"); } }; diff --git a/gdrom/gdrom_bits.hpp b/gdrom/gdrom_bits.hpp index 19287d1..3abb9f1 100644 --- a/gdrom/gdrom_bits.hpp +++ b/gdrom/gdrom_bits.hpp @@ -1,43 +1,121 @@ +#pragma once + #include +#include "../float_uint32.hpp" + namespace gdrom { + namespace 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 status { + 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; } + } -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); - -} - -namespace interrupt_reason { - -constexpr uint8_t io = (1 << 1); -constexpr uint8_t cod = (1 << 0); - -} - -namespace command { - -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; - -} + 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 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; + } + } } diff --git a/regs/gdrom.ods b/regs/gdrom.ods index 19da936b8c854a63aed1de52bd4f6d32bc1e80a5..434c1e19697f7e20a0267f66a2c8ac2e171a925d 100644 GIT binary patch delta 14031 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 O&_#Y~gig*sNdFI@JM|#| diff --git a/regs/gdrom_bits.csv b/regs/gdrom_bits.csv new file mode 100644 index 0000000..5d1c020 --- /dev/null +++ b/regs/gdrom_bits.csv @@ -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",, diff --git a/regs/gdrom_bits.ods b/regs/gdrom_bits.ods new file mode 100644 index 0000000000000000000000000000000000000000..c932c8522b915c08ea2a6f9b83dff755191c7613 GIT binary patch literal 14858 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 literal 0 HcmV?d00001 diff --git a/regs/gen/core_bits.py b/regs/gen/core_bits.py index 5fa2458..d58d24b 100644 --- a/regs/gen/core_bits.py +++ b/regs/gen/core_bits.py @@ -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