Linux102系列会详细讲解Linux0.11版本中的102个文件,本文讲解linux0.11的第38个文件
【Linux102】38-include/linux/fdreg.h的文件源码。
1. include/linux/fdreg.h 的主要作用
这个头文件为操作软盘控制器提供了统一的符号定义和函数接口声明,是底层软盘驱动程序开发的基础,使得开发者可以通过这些抽象的符号和函数来与软盘控制器硬件进行交互,而无需直接使用具体的数值地址和命令码,提高了代码的可读性和可维护性。
2.源码用到的文件
NO
3.源码版
/*
* This file contains some defines for the floppy disk controller.
* Various sources. Mostly "IBM Microcomputers: A Programmers
* Handbook", Sanches and Canton.
*/
#ifndef _FDREG_H
#define _FDREG_H
extern int ticks_to_floppy_on(unsigned int nr);
extern void floppy_on(unsigned int nr);
extern void floppy_off(unsigned int nr);
extern void floppy_select(unsigned int nr);
extern void floppy_deselect(unsigned int nr);
/* Fd controller regs. S&C, about page 340 */
#define FD_STATUS 0x3f4
#define FD_DATA 0x3f5
#define FD_DOR 0x3f2 /* Digital Output Register */
#define FD_DIR 0x3f7 /* Digital Input Register (read) */
#define FD_DCR 0x3f7 /* Diskette Control Register (write)*/
/* Bits of main status register */
#define STATUS_BUSYMASK 0x0F /* drive busy mask */
#define STATUS_BUSY 0x10 /* FDC busy */
#define STATUS_DMA 0x20 /* 0- DMA mode */
#define STATUS_DIR 0x40 /* 0- cpu->fdc */
#define STATUS_READY 0x80 /* Data reg ready */
/* Bits of FD_ST0 */
#define ST0_DS 0x03 /* drive select mask */
#define ST0_HA 0x04 /* Head (Address) */
#define ST0_NR 0x08 /* Not Ready */
#define ST0_ECE 0x10 /* Equipment chech error */
#define ST0_SE 0x20 /* Seek end */
#define ST0_INTR 0xC0 /* Interrupt code mask */
/* Bits of FD_ST1 */
#define ST1_MAM 0x01 /* Missing Address Mark */
#define ST1_WP 0x02 /* Write Protect */
#define ST1_ND 0x04 /* No Data - unreadable */
#define ST1_OR 0x10 /* OverRun */
#define ST1_CRC 0x20 /* CRC error in data or addr */
#define ST1_EOC 0x80 /* End Of Cylinder */
/* Bits of FD_ST2 */
#define ST2_MAM 0x01 /* Missing Addess Mark (again) */
#define ST2_BC 0x02 /* Bad Cylinder */
#define ST2_SNS 0x04 /* Scan Not Satisfied */
#define ST2_SEH 0x08 /* Scan Equal Hit */
#define ST2_WC 0x10 /* Wrong Cylinder */
#define ST2_CRC 0x20 /* CRC error in data field */
#define ST2_CM 0x40 /* Control Mark = deleted */
/* Bits of FD_ST3 */
#define ST3_HA 0x04 /* Head (Address) */
#define ST3_TZ 0x10 /* Track Zero signal (1=track 0) */
#define ST3_WP 0x40 /* Write Protect */
/* Values for FD_COMMAND */
#define FD_RECALIBRATE 0x07 /* move to track 0 */
#define FD_SEEK 0x0F /* seek track */
#define FD_READ 0xE6 /* read with MT, MFM, SKip deleted */
#define FD_WRITE 0xC5 /* write with MT, MFM */
#define FD_SENSEI 0x08 /* Sense Interrupt Status */
#define FD_SPECIFY 0x03 /* specify HUT etc */
/* DMA commands */
#define DMA_READ 0x46
#define DMA_WRITE 0x4A
#endif
4.源码注释版本
/*
* 本文件包含软盘控制器的一些定义
* 来源多样,主要参考《IBM微型计算机:程序员手册》(Sanches和Canton著)
*/
#ifndef _FDREG_H // 防止头文件重复包含的宏定义
#define _FDREG_H
// 外部函数声明
// 计算使第nr个软盘驱动器启动所需的滴答数
extern int ticks_to_floppy_on(unsigned int nr);
// 开启第nr个软盘驱动器
extern void floppy_on(unsigned int nr);
// 关闭第nr个软盘驱动器
extern void floppy_off(unsigned int nr);
// 选择第nr个软盘驱动器
extern void floppy_select(unsigned int nr);
// 取消选择第nr个软盘驱动器
extern void floppy_deselect(unsigned int nr);
/* 软盘控制器寄存器地址(参考Sanches和Canton的书,约340页) */
#define FD_STATUS 0x3f4 // 状态寄存器
#define FD_DATA 0x3f5 // 数据寄存器
#define FD_DOR 0x3f2 // 数字输出寄存器(Digital Output Register)
#define FD_DIR 0x3f7 // 数字输入寄存器(读操作)(Digital Input Register)
#define FD_DCR 0x3f7 // 软盘控制寄存器(写操作)(Diskette Control Register)
/* 主状态寄存器的位定义 */
#define STATUS_BUSYMASK 0x0F // 驱动器忙状态掩码(用于提取驱动器忙状态)
#define STATUS_BUSY 0x10 // FDC(软盘控制器)忙
#define STATUS_DMA 0x20 // DMA模式标志(0表示处于DMA模式)
#define STATUS_DIR 0x40 // 数据传输方向(0表示CPU到FDC)
#define STATUS_READY 0x80 // 数据寄存器就绪(可以进行读写操作)
/* FD_ST0状态寄存器的位定义 */
#define ST0_DS 0x03 // 驱动器选择掩码(用于提取被选中的驱动器)
#define ST0_HA 0x04 // 磁头地址(Head Address)
#define ST0_NR 0x08 // 未就绪(Not Ready)
#define ST0_ECE 0x10 // 设备检查错误(Equipment Check Error)
#define ST0_SE 0x20 // 寻道结束(Seek End)
#define ST0_INTR 0xC0 // 中断代码掩码(用于提取中断代码)
/* FD_ST1状态寄存器的位定义 */
#define ST1_MAM 0x01 // 丢失地址标记(Missing Address Mark)
#define ST1_WP 0x02 // 写保护(Write Protect)
#define ST1_ND 0x04 // 无数据(不可读)(No Data - unreadable)
#define ST1_OR 0x10 // 溢出(OverRun)
#define ST1_CRC 0x20 // 数据或地址中的CRC错误
#define ST1_EOC 0x80 // 柱面结束(End Of Cylinder)
/* FD_ST2状态寄存器的位定义 */
#define ST2_MAM 0x01 // 丢失地址标记(再次出现)(Missing Address Mark)
#define ST2_BC 0x02 // 坏柱面(Bad Cylinder)
#define ST2_SNS 0x04 // 扫描未完成(Scan Not Satisfied)
#define ST2_SEH 0x08 // 扫描匹配命中(Scan Equal Hit)
#define ST2_WC 0x10 // 错误柱面(Wrong Cylinder)
#define ST2_CRC 0x20 // 数据字段中的CRC错误
#define ST2_CM 0x40 // 控制标记=已删除(Control Mark = deleted)
/* FD_ST3状态寄存器的位定义 */
#define ST3_HA 0x04 // 磁头地址(Head Address)
#define ST3_TZ 0x10 // 零磁道信号(1表示在0磁道)(Track Zero signal)
#define ST3_WP 0x40 // 写保护(Write Protect)
/* 软盘控制器命令值 */
#define FD_RECALIBRATE 0x07 // 重新校准(移动到0磁道)
#define FD_SEEK 0x0F // 寻道磁道
#define FD_READ 0xE6 // 读操作(带MT, MFM, 跳过已删除)
#define FD_WRITE 0xC5 // 写操作(带MT, MFM)
#define FD_SENSEI 0x08 // 检测中断状态(Sense Interrupt Status)
#define FD_SPECIFY 0x03 // 指定HUT等参数
/* DMA命令 */
#define DMA_READ 0x46 // DMA读命令
#define DMA_WRITE 0x4A // DMA写命令
#endif // _FDREG_H宏定义结束
5.源码图像版

6.源码注释版图像


本系列将带领大家从0开始循序渐进学习汇编语言,直至完全掌握这门底层语言。同时给出学习平台DOSBox的使用教程。
本系列将直击C语言的本质基础,流利处理出各个易错、实用的实战点,并非从零开始学习C。
专注讲解Linux中的常用命令,共计发布100+文章。
本系列将精讲Linux0.11内核中的每一个文件,共计会发布100+文章。
😉【Linux102】11-kernel/vsprintf.c
😉【Linux102】12-include/stdarg.h
😉【Linux102】14-kernel/system_call.s
😉【Linux102】15-include/linux/sched.h
😉【Linux102】18-include/signal.h
😉【Linux102】19-include/sys/types.h
😉【Linux102】20-include/linux/kernel.h
😉【Linux102】21-include/asm/segment.h
😉【Linux102】22-include/linux/head.h
😉【Linux102】23-include/linux/mm.h
😉【Linux102】24-include/linux/fs.h
😉【Linux102】26-include/sys/wait.h
😉【Linux102】27-include/inux/tty.h
😉【Linux102】28-include/termios.h
😉【Linux102】30-include/sys/times.h
😉【Linux102】31-include/sys/utsname.h
😉【Linux102】32-include/stddef.h
😉【Linux102】33-include/linux/sys.h
😉【Linux102】36-include/asm/system.h
和Linux内核102系列不同,本系列将会从全局描绘Linux内核的各个模块,而非逐行源码分析,适合想对Linux系统有宏观了解的家人阅读。
😉【Linux】Linux概述1-linux对物理内存的使用
关于小希
😉嘿嘿嘿,我是小希,专注Linux内核领域,同时讲解C语言、汇编等知识。
我的微信:C_Linux_Cloud,期待与您学习交流!

加微信请备注哦
小希的座右铭:
别看简单,简单也是难。别看难,难也是简单。我的文章都是讲述简单的知识,如果你喜欢这种风格:
下一期想看什么?在评论区留言吧!我们下期见!

686

被折叠的 条评论
为什么被折叠?



