SAROO/doc/SAROO技术点滴.txt
2023-02-13 17:09:34 +08:00

432 lines
11 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Saturn A-BUS时序
================
时钟: 28Mhz左右 周期大约36ns
地址: 早于CS一个周期发出, CS结束后维持1到2个周期
RD: 早于CS一个周期发出, 在CS结束后一个周期结束
WR: 与CS一起发出
FC0/FC1: 普通读写时均为高.
FC1: 非读写时每14.32us出现一次. 疑似刷新周期.
AAS: 与CS一样宽度
TIM0: 与地址一起发出.在CS结束前一个周期结束.
TIM1: 在写数据时,与数据一起发出.与TIM0一起结束
TIM2: 在TIM1后一个周期发出.与CS一起结束
看起来TIM1用于数据周期指示.
写数据在WR开始后一个周期出现,
WR0对应SS_DATA[ 7:0],
WR1对应SS_DATA[15:8].
ABUS的CS2空间比较特殊:
1: ASR寄存器不能配置等待周期.ADDR[18-15]的值相当于等待周期配置.
2: CS2是32位空间,ADDR[19]用于选择空间类型:
0: 32位空间. 会进行连续两次的访问以返回一个32位的数据.(会发出A1)
1: 16位空间. 每次访问返回一个高16位数据. 低16位无法访问到.(A1始终为0)
CDBLOCK模块, 用ADDR[14-12]作为高位地址, ADDR[5-2]作为低位地址.
00: DATA_PORT
08: HIRQ
0C: HIRQ_MASK
18: CR1
1C: CR2
20: CR3
24: CR4
28: MPEGRGB
#define HIRQ_CMOK 0x0001
#define HIRQ_DRDY 0x0002
#define HIRQ_CSCT 0x0004
#define HIRQ_BFUL 0x0008
#define HIRQ_PEND 0x0010
#define HIRQ_DCHG 0x0020
#define HIRQ_ESEL 0x0040
#define HIRQ_EHST 0x0080
#define HIRQ_ECPY 0x0100
#define HIRQ_EFLS 0x0200
#define HIRQ_SCDQ 0x0400
#define STATUS_BUSY 0x00
#define STATUS_PAUSE 0x01
#define STATUS_STANDBY 0x02
#define STATUS_PLAY 0x03
#define STATUS_SEEK 0x04
#define STATUS_SCAN 0x05
#define STATUS_OPEN 0x06
#define STATUS_NODISC 0x07
#define STATUS_RETRY 0x08
#define STATUS_ERROR 0x09
#define STATUS_FATAL 0x0a
#define STATUS_PERIODIC 0x20
#define STATUS_TRANSFER 0x40
#define STATUS_WAIT 0x80
#define STATUS_REJECT 0xff
Saturn MemoryMap
================
07ffffff +------------------+-----+
06100000 +------------------+ |
| WorkRAM_H: 1M | CS3 |
06000000 +------------------+-----+
05fe00d0 +------------------+ |
| SCU: 208 | |
05fe0000 +------------------+ |
05f80120 +------------------+ |
| VDP2: 288 | |
05f80000 +------------------+ |
05f01000 +------------------+ |
| VDP2: 4K | |
05f00000 +------------------+ |
05e80000 +------------------+ |
| VDP2: 512K | |
05e00000 +------------------+ |
05d00018 +------------------+ |
| VDP1: 24 | CS2
05d00000 +------------------+ |
05cc0000 +------------------+ |
| VDP1: 192K | |
05c00000 +------------------+ |
05b00ee4 +------------------+ |
| Sound: 1M | |
05a00000 +------------------+ |
05900000 +------------------+ |
| ABUS CS2:1M | |
05800000 +------------------+ |
| ABUS Dummy:8M | |
05000000 +------------------+ |
| | |
| ABUS CS1:16M | |
| | |
04000000 +------------------+-----+
| | |
| | |
| | |
| ABUS CS0:32M | CS1 |
| | |
| | |
| | |
02000000 +------------------+-----+
01800004 +------------------+ |
| SINT: 4 | |
01800000 +------------------+ |
01000004 +------------------+ |
| MINT: 4 | |
01000000 +------------------+ |
00300000 +------------------+ |
| WorkRAM_L: 1M | |
00200000 +------------------+ |
00190000 +------------------+ |
| SRAM: 64K | CS0 |
00180000 +------------------+ |
00100080 +------------------+ |
| SMPC | |
00100000 +------------------+ |
00080000 +------------------+ |
| ROM: 512K | |
00000000 +------------------+-----+
=========================================================================
SAROOO 土星地址端口:
基地址0x25807000
+00: 卡ID标志, 0x5253("SR")
+02: 卡版本, 0x1101 -> 硬件1.1版,软件0.1版
+04: 卡控制寄存器
+08: 卡状态寄存器
+0c: 一个32位的计时器, 以1M的频率计数.0c是高位,0e是低位.
+10: 发往STM32的命令寄存器. 写这个寄存器,STM32端会产生中断.
定义0x22800000开始的sdram空间,为土星和STM32交换数据的空间.
目前sdram空间不支持字节访问.
+14: STM32与土星数据交换寄存器.
+18: FIFO数据端口(只读).
卡控制寄存器:
bit15: CDC寄存器使能.
为0时读的是系统的CDC寄存器.
为1时读的卡带自己的CDC寄存器. 此时系统应该处于CDOFF状态.否则读出的数据是错误的.
写CDC寄存器时,系统自己的寄存器和卡上的寄存器都会被写入.这提供一种手段让STM32可以
监控CDC的写入数据.
bit13:
bit12: CS0空间的类型.
00: Bootrom
01: data卡
10: 1M的RAM卡
11: 4M的RAM卡
bit8 : 控制LED1
卡状态寄存器
bit11: fifo满状态
bit10:
...
bit0 : fifo数据计数
=========================================================================
SAROOO STM32地址端口
基地址0x60000000
+00: 卡ID标志, 0x5253("SR") (只读)
+02: 卡版本, 0x1101 -> 硬件1.1版,软件0.1版 (只读)
+04: 卡控制寄存器
+06: 卡状态寄存器(只读)
+08: FIFO数据端口(只写)
+0c: FIFO状态寄存器
+10: 土星CMD寄存器(写复位)
+12: STM32与土星数据交换寄存器
+14: 土星控制寄存器(只读)
+18: CDC的RESP1(只读)
+1a: CDC的RESP2(只读)
+1c: CDC的RESP3(只读)
+1e: CDC的RESP4(只读)
+20: CDC的CR1 | 读的时候是CRn寄存器
+22: CDC的CR2 | 写的时候是RESPn寄存器
+24: CDC的CR3 |
+26: CDC的CR4 |
+28: CDC的HIRQ(写1置位)
+2a: CDC的HIRQ_MASK
+2c: CDC的HIRQ(写1复位)(只写)
+2e: CDC的MRGB(未使用)
卡控制寄存器
bit9 : fifo字节序: 0:小端 1:大端
bit8 : fifo复位.
bit2 : FIFO中断使能. FIFO半空.
bit1 : cmd中断使能. 土星写CMD寄存器,会产生中断.
bit0 : cdc中断使能. 土星写CR4寄存器,会产生中断.
卡状态寄存器
bit15: FPGA的100Mhz时钟工作正常指示.
bit14: ST_IRQ状态.
bit12: in_cmd状态. 写CR1置位, 读CR4复位.
bit2 : fifo中断状态.写1清楚中断状态.
bit1 : cmd中断状态. 写1清楚中断状态.
bit0 : cdc中断状态. 写1清楚中断状态.
FIFO状态寄存器
bit11: fifo满状态
bit10:
...
bit0 : fifo数据计数
土星端:
22000000-22400000 4M Saturn可用
22400000-22800000 4M ram卡用
22800000-22a00000 2M Saturn与STM32 可用
22a00000-23000000 6M STM32用
=========================================================================
61800000-61820000 : 128K 存放扫描的disc信息
00000-01000: 存放disc路径指针, 共1024个.
01000-20000: 存放disc路径字符串.
=========================================================================
关于光盘的格式
--------------
红皮书: CD-DA音频CD标准.
黄皮书: CD_ROM数据光盘标准. 是红皮书的扩展.
CD-DA: 采样率44100Hz, 精度16bit, 双声道.
逻辑层:
每秒176400字节的数据.(44100x2x2)
一帧6次采样,共24字节的数据.
一个扇区98帧, 98x24=2352字节.
每秒包含75扇区. 176400/2352=75.
物理层:
Frame1: 一帧的24字节的有效数据
Frame2: Frame1加上8字节的校验码
Frame3: Frame2加上1字节的控制数据即subcode数据
Frame3再加上3字节的同步头(不经过EFM编码)经过EFM(8-14)编码,写入光盘介质上.
两个EFM编码之间另有3bit的间隔码.
+----------+---------+-----------------+------+------------------+------+
| SyncBits | SubCode | LeftChannel | Qchk | RightChannel | Pchk |
| 3 | 1 | 12 | 4 | 12 | 4 | 物理层
+----------+---------+-----------------+------+------------------+------+
.....24.3.....14.3.....14.3.14.3...14.3.14.3.....14.3.14.3........14.3... EFM物理层
subcode: 包含8个通道: P Q R S T U V W
一般分成3组: subcode-Q, subcode-P, subcode-RW
subcode-P和subcode-Q包含一些控制信息. 可以实时恢复出来.
subcode-RW存储图像等CD-DA扩展数据.
MDF/MDS格式的镜像,可以包含这些信息. ISO/CUE等不包含. 默认读出为0.
CD-ROM/XA: 对CD-DA的2352字节的逻辑层进行重新定义
0-11: 12字节的同步头: 00 FF FF FF FF FF FF FF FF FF FF 00
12-14: 扇区地址. 格式: MM(分钟) SS(秒) FF(Frame, 扇区)
15: 类型.
00: 全0的扇区. 一般用于标记光盘的Lead_in和Lead_Out区域
+------+------+------+
| Sync | Addr | Zero |
| 12 | 4 | 2336 |
+------+------+------+
01: 用于存储数据
+------+------+------+-----+-------+-----+
| Sync | Addr | Data | CRC | Unuse | ECC |
| 12 | 4 | 2048 | 4 | 8 | 276 |
+------+------+------+-----+-------+-----+
02: 用于存储音视频数据
+------+------+------+
| Sync | Addr | Data |
| 12 | 4 | 2336 |
+------+------+------+
02: XA/Form1. 用于存储数据
+------+------+--------+------+-----+-----+
| Sync | Addr | SubHdr | Data | CRC | ECC |
| 12 | 4 | 8 | 2048 | 4 | 276 |
+------+------+--------+------+-----+-----+
02: XA/Form2. 用于存储音视频数据
+------+------+--------+------+-----+
| Sync | Addr | SubHdr | Data | CRC |
| 12 | 4 | 8 | 2324 | 4 |
+------+------+--------+------+-----+
SubHdr: sub-header
FN CN SM CI FN CN SM CI
FN: File Number 本块属于哪个文件
CN: Channel Number 回放通道选择
SM: Sub-Mode
CI: Coding infomation
TOC
---
光盘中各个轨道的信息描述.
ISO默认为一条轨道.
MDS/MDF/NRG/CUE等可以描述多轨道光盘.
需要在加载光盘镜像时重建这些信息.
track与session
--------------
一个session包含若干个轨道. 后面session的轨道中包含的文件, 应该能覆盖前面session中的文件.
只有MDS/MDF支持多个session.
土星的光盘,有多session的情况吗? 我想应该没有.又不是多次刻录生成的光盘.
Langrisser 3 (J)是nrg格式, track01是数据轨. track02也是数据轨,但内容全0,100多兆.纯粹占空间用.
土星相关
--------
土星内部的扇区buffer, 统一为2352字节.
前24字节是各种header的保留空间, 填充为0.
=========================================================================
cdc_get_file_scope: fid最小为2, fnum最大为254. drend不知道意义
cdc_read_dir: 当fid为0xffffff时,返回最多254个文件信息(不包括.和..)
file scope: fid=200 fnum=254 drend=0
此时调用cdc_get_file_info(2, finfo), 会返回REJECT.
这说明, get_file_info中的参数fid,指的是当前目录的顺序id,而不是当前页面的id.
fid指定为203,则可以正确返回结果.
=========================================================================
cdc_read_file(int selnum, int fid, int offset)
cdb内部将selnum设置为: mode=0x41 fad=[start+offset] range = [fad_size]
selnum对应的partition将被先清除.
selnum被填满以后, 读取暂时停止, 直道有可用的block才继续.
然后以EFLS结束.
=========================================================================
//假设1中有192个扇区
cdc_get_del_data(1, 0, 0xffffff);
//但只传输了100个扇区
cdc_trans_data(sbuf, 2048*100);
cdc_end_trans(NULL);
// 调用end_trans后, 即使没有传输的92个扇区,也将被删除.
// 目前的代码需要修改,来匹配这个情况.
=========================================================================
cdc_get_del_data执行后,不管有没有传输数据, cdc_get_numsector返回的是已经删除后的扇区数.
看起来传输数据时, block没有被立即释放. 直道end_trans, 才会释放数据.这样才能保证数据的
安全性.
=========================================================================
=========================================================================