floppy.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. */
  8. #ifndef _FLOPPY_H
  9. #define _FLOPPY_H
  10. #define FD_STATUS 0x3f4 // 主状态寄存器端口。
  11. #define FD_DATA 0x3f5 // 数据端口。
  12. #define FD_DOR 0x3f2 // 数字输出寄存器(也称为数字控制寄存器)。
  13. #define FD_DIR 0x3f7 // 数字输入寄存器。
  14. #define FD_DCR 0x3f7 // 数据传输率控制寄存器。
  15. /* 主状态寄存器各比特位的含义 */
  16. #define STATUS_BUSYMASK 0x0F // 驱动器忙位(每位对应一个驱动器)。
  17. #define STATUS_BUSY 0x10 // 软盘控制器忙。
  18. #define STATUS_DMA 0x20 // 0 - 为DMA 数据传输模式,1 - 为非DMA 模式。
  19. #define STATUS_DIR 0x40 // 传输方向:0 - CPU .. fdc,1 - 相反。
  20. #define STATUS_READY 0x80 // 数据寄存器就绪位。
  21. /*状态字节0(ST0)各比特位的含义 */
  22. #define ST0_DS 0x03 // 驱动器选择号(发生中断时驱动器号)。
  23. #define ST0_HA 0x04 // 磁头号。
  24. #define ST0_NR 0x08 // 磁盘驱动器未准备好。
  25. #define ST0_ECE 0x10 // 设备检测出错(零磁道校准出错)。
  26. #define ST0_SE 0x20 // 寻道或重新校正操作执行结束。
  27. #define ST0_INTR 0xC0 // 中断代码位(中断原因),00 - 命令正常结束;
  28. // 01 - 命令异常结束;10 - 命令无效;11 - FDD 就绪状态改变。
  29. /*状态字节1(ST1)各比特位的含义 */
  30. #define ST1_MAM 0x01 // 未找到地址标志(ID AM)。
  31. #define ST1_WP 0x02 // 写保护。
  32. #define ST1_ND 0x04 // 未找到指定的扇区。
  33. #define ST1_OR 0x10 // 数据传输超时(DMA 控制器故障)。
  34. #define ST1_CRC 0x20 // CRC 检验出错。
  35. #define ST1_EOC 0x80 // 访问超过一个磁道上的最大扇区号。
  36. /*状态字节2(ST2)各比特位的含义 */
  37. #define ST2_MAM 0x01 // 未找到数据地址标志。
  38. #define ST2_BC 0x02 // 磁道坏。
  39. #define ST2_SNS 0x04 // 检索(扫描)条件不满足。
  40. #define ST2_SEH 0x08 // 检索条件满足。
  41. #define ST2_WC 0x10 // 磁道(柱面)号不符。
  42. #define ST2_CRC 0x20 // 数据场CRC 校验错。
  43. #define ST2_CM 0x40 // 读数据遇到删除标志。
  44. /*状态字节3(ST3)各比特位的含义 */
  45. #define ST3_HA 0x04 // 磁头号。
  46. #define ST3_TZ 0x10 // 零磁道信号。
  47. #define ST3_WP 0x40 // 写保护。
  48. /* 软盘命令码 */
  49. #define FD_RECALIBRATE 0x07 // 重新校正(磁头退到零磁道)。
  50. #define FD_SEEK 0x0F // 磁头寻道。
  51. #define FD_READ 0xE6 // 读数据(MT 多磁道操作,MFM 格式,跳过删除数据)。
  52. #define FD_WRITE 0xC5 // 写数据(MT,MFM)。
  53. #define FD_SENSEI 0x08 // 检测中断状态。
  54. #define FD_SPECIFY 0x03 // 设定驱动器参数(步进速率、磁头卸载时间等)。
  55. /* DMA 命令 */
  56. #define DMA_READ 0x46 // DMA 读盘,DMA 方式字(送DMA 端口12,11)。
  57. #define DMA_WRITE 0x4A
  58. extern void rt_floppy_init(void);
  59. #endif