【Linux102】38-include/linux/fdreg.h


公粽号「专注Linux」,专注Linux内核开发

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.源码图像版

【Linux102】38-include/linux/fdreg.h

6.源码注释版图像

【Linux102】38-include/linux/fdreg.h



汇编语言

本系列将带领大家从0开始循序渐进学习汇编语言,直至完全掌握这门底层语言。同时给出学习平台DOSBox的使用教程。

😉【汇编语言】1—基础硬件知识

😉【汇编语言】2—寄存器基础知识

😉【汇编语言】3-寄存器与内存的交互

😉【汇编语言】4-第一个完整的汇编程序

😉【汇编语言】5-[BX]和loop指令

😉【汇编语言】6-包含多个段的程序

😉【汇编语言】7-灵活的5大寻址方式

😉【汇编语言】8-1-数据的位置

😉【汇编语言】8-2-数据的长度

😉【汇编语言】8-数据处理的两个基本问题(位置与长度)

😉【DOSBox】1-debug

😉【DOSBox】2-debug可执行文件

😉【DOSBox】3-完整开发流程


C语言

本系列将直击C语言的本质基础,流利处理出各个易错、实用的实战点,并非从零开始学习C。

😉【C语言】C Token(C89 C99 C11)

😉【C语言】指针基础

😉【C语言】数组基础

😉【C语言】结构体对齐

😉【C语言】华为C语言进阶测试

😉【C语言】触发刷新到磁盘的方式总结

😉【C语言】C语言文件操作的mode详解

😉【C语言】C语言文件知识全讲解

😉【C语言】从extern到头文件包含的最优实践

😉【C语言】C语言的关键字与重载机制

😉【C语言】长字符串的2种处理方式

😉【C语言】C语言嵌入汇编程序

😉【C语言】指针数组 VS 数组指针 原来这么简单!

😉【C语言】深浅拷贝、传参、赋值 本质剖析

😉【C语言】find-in-linux递归搜索文件名函数

😉【C陷阱与缺陷】-1-词法陷阱

😉【C陷阱与缺陷】-2-语法陷阱

😉【C陷阱与缺陷】-3-语义陷阱


Linux101系列

专注讲解Linux中的常用命令,共计发布100+文章。

😉【Linux101-1】ls

😉【Linux101-1】ls -l命令输出结果全解析

😉【Linux101-2】cd

😉【Linux101-3】cat

😉【Linux101-4】tac

😉【Linux101-5】head

😉【Linux101-6】tail

😉【Linux101-7】pwd

😉【Linux101-8】touch

😉【Linux101-9】cal

😉【Linux101-10】bc

😉【Linux101-11】df

😉【Linux101-12】uname

😉【Linux101-13】mkdir

😉【Linux101-14】gzip

😉【Linux101-15】tar

😉【Linux101-16】lsof

😉【Linux101-17】du

😉【Linux101-18】stat

😉【Linux101-19】top

😉【Linux101-20】echo


Linux102系列

本系列将精讲Linux0.11内核中的每一个文件,共计会发布100+文章。

😉【Linux102】1-Makefile

😉【Linux102】2-Makefile.header

😉【Linux102】3-system.map

😉【Linux102】4-bootsect.s

😉【Linux102】5-setup.s

😉【Linux102】6-head.s

😉【Linux102-D】/boot

😉【Linux102】7-main.c

😉【Linux102】8-kernel/asm.s

😉【Linux102】9-kernel/traps.c

😉【Linux102】10-kernel/printk.c

😉【Linux102】11-kernel/vsprintf.c

😉【Linux102】12-include/stdarg.h

😉【Linux102】13-kernel/mktime.c

😉【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】25-include/errno.h

😉【Linux102】26-include/sys/wait.h

😉【Linux102】27-include/inux/tty.h

😉【Linux102】28-include/termios.h

😉【Linux102】29-kernel/panic.c

😉【Linux102】30-include/sys/times.h

😉【Linux102】31-include/sys/utsname.h

😉【Linux102】32-include/stddef.h

😉【Linux102】33-include/linux/sys.h

😉【Linux102】34-kernel/sys.c

😉【Linux102】35-kernel/fork.c

😉【Linux102】36-include/asm/system.h


Linux内核精讲系列

和Linux内核102系列不同,本系列将会从全局描绘Linux内核的各个模块,而非逐行源码分析,适合想对Linux系统有宏观了解的家人阅读。

😉【Linux】学习Linux前必备的知识点

😉【Linux】Linux内核对进程的内存抽象

😉【Linux】Linux概述1-linux对物理内存的使用

😉【Linux】软件从写下到运行的全部流程

😉【Linux】CPU的三寻址:实模式、保护模式、长模式

😉【Linux】实模式与保护模式的寻址, 这次讲明白了!

😉【Linux】linux0.11的源码目录架构

😉【Linux】Makefile机制及基础详解

😉【Linux】编译并运行Linux0.11

😉【Linux】“进进内网文”—Linux的内核结构全貌

😉【Linux】linux的中断机制

😉【Linux】linux进程描述



关于小希

😉嘿嘿嘿,我是小希,专注Linux内核领域,同时讲解C语言汇编等知识。

我的微信:C_Linux_Cloud,期待与您学习交流!

加微信请备注哦


小希的座右铭:别看简单,简单也是难。别看难,难也是简单。我的文章都是讲述简单的知识,如果你喜欢这种风格:

不妨关注、评论、转发,让更多朋友看到哦~~~🙈

下一期想看什么?在评论区留言吧!我们下期见!

duanchangxu1604@ubuntu:~/NVMP$ find . -name "mtd" ./nvmp/package/mtd ./nvmp/tools/mstarbin/src/src/mtd ./nvmp/tools/mstarbin/src/src/ubinize/include_mtd/mtd ./nvmp/tools/mstarbin/src/include/linux/mtd ./nvmp/tools/mstarbin/src/include/mtd ./nvmp/build_dir/host/u-boot-2012.04.01/drivers/mtd ./nvmp/build_dir/host/u-boot-2012.04.01/include/linux/mtd ./nvmp/build_dir/host/u-boot-2012.04.01/include/mtd ./nvmp/build_dir/host/mtd-utils-1.4.5/include/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/libmpp/mpp/src/project/kbuild/4.9.84/i6b0/include/linux/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/libmpp/mpp/src/project/kbuild/4.9.84/i6b0/include/uapi/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/bootloader/factory_boot/drivers/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/bootloader/factory_boot/doc/device-tree-bindings/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/bootloader/factory_boot/include/linux/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/bootloader/factory_boot/include/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/bootloader/normal_boot/drivers/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/bootloader/normal_boot/doc/device-tree-bindings/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/bootloader/normal_boot/include/linux/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/bootloader/normal_boot/include/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/linux-4.9.84/drivers/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/linux-4.9.84/user_headers/include/mtd ./nvmp/build_dir/target-arm-openwrt-linux-uclibcgnueabi-c110v2/linux-mstar_ssc335/linux-4.9.84/include/config/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/bootloader/factory_boot/drivers/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/bootloader/factory_boot/doc/device-tree-bindings/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/bootloader/factory_boot/include/linux/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/bootloader/factory_boot/include/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/bootloader/factory_boot/include/config/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/bootloader/normal_boot/drivers/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/bootloader/normal_boot/doc/device-tree-bindings/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/bootloader/normal_boot/include/linux/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/bootloader/normal_boot/include/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/bootloader/normal_boot/include/config/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/linux-5.10.117/Documentation/devicetree/bindings/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/linux-5.10.117/Documentation/driver-api/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/linux-5.10.117/drivers/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/linux-5.10.117/include/linux/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/linux-5.10.117/include/config/mtd ./nvmp/build_dir/target-arm-openwrt-linux-gnueabi-c212v3/linux-ssc37x_ssc375/linux-5.10.117/include/uapi/mtd ./nvmp/target/linux/ar71xx/files/drivers/mtd ./nvmp/target/linux/generic/files-3.10/drivers/mtd ./nvmp/target/linux/generic/files-3.3/drivers/mtd ./sdk/soc/ssc37x/linux-5.10.61/Documentation/devicetree/bindings/mtd ./sdk/soc/ssc37x/linux-5.10.61/Documentation/driver-api/mtd ./sdk/soc/ssc37x/linux-5.10.61/drivers/mtd ./sdk/soc/ssc37x/linux-5.10.61/include/linux/mtd ./sdk/soc/ssc37x/linux-5.10.61/include/config/mtd ./sdk/soc/ssc37x/linux-5.10.61/include/uapi/mtd ./sdk/soc/ssc37x/uclibc-toolchain-ssc375/arm-sigmastar-linux-uclibcgnueabihf-9.1.0/arm-sigmastar-linux-uclibcgnueabihf/sysroot/usr/include/mtd ./sdk/soc/ssc37x/linux-5.10.117/Documentation/devicetree/bindings/mtd ./sdk/soc/ssc37x/linux-5.10.117/Documentation/driver-api/mtd ./sdk/soc/ssc37x/linux-5.10.117/drivers/mtd ./sdk/soc/ssc37x/linux-5.10.117/include/linux/mtd ./sdk/soc/ssc37x/linux-5.10.117/include/config/mtd ./sdk/soc/ssc37x/linux-5.10.117/include/uapi/mtd ./sdk/soc/ssc37x/boot/src/drivers/mtd ./sdk/soc/ssc37x/boot/src/doc/device-tree-bindings/mtd ./sdk/soc/ssc37x/boot/src/include/linux/mtd ./sdk/soc/ssc37x/boot/src/include/mtd ./sdk/soc/ssc37x/boot/src/include/config/ms/mtd ./sdk/soc/ssc37x/boot-ssc375/src/drivers/mtd ./sdk/soc/ssc37x/boot-ssc375/src/doc/device-tree-bindings/mtd ./sdk/soc/ssc37x/boot-ssc375/src/include/linux/mtd ./sdk/soc/ssc37x/boot-ssc375/src/include/mtd ./sdk/soc/ssc37x/boot-ssc375/src/include/config/mtd ./sdk/soc/ssc37x/uclibc-toolchain/arm-sigmastar-linux-uclibcgnueabihf-9.1.0/arm-sigmastar-linux-uclibcgnueabihf/sysroot/usr/include/mtd ./sdk/soc/ssc335/glibc-toolchain-9.1.0/gcc-sigmastar-9.1.0-2019.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/mtd ./sdk/soc/ssc335/boot/src/drivers/mtd ./sdk/soc/ssc335/boot/src/doc/device-tree-bindings/mtd ./sdk/soc/ssc335/boot/src/include/linux/mtd ./sdk/soc/ssc335/boot/src/include/mtd ./sdk/soc/ssc335/linux-4.9.84/Documentation/devicetree/bindings/mtd ./sdk/soc/ssc335/linux-4.9.84/Documentation/mtd ./sdk/soc/ssc335/linux-4.9.84/drivers/mtd ./sdk/soc/ssc335/linux-4.9.84/include/linux/mtd ./sdk/soc/ssc335/linux-4.9.84/include/uapi/mtd ./sdk/soc/ssc335/mpp/ssc335/src/project/kbuild/4.9.84/i6b0/include/linux/mtd ./sdk/soc/ssc335/mpp/ssc335/src/project/kbuild/4.9.84/i6b0/include/uapi/mtd ./sdk/soc/ssc335/uclibc-toolchain/arm-buildroot-linux-uclibcgnueabihf-4.9.4/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/include/mtd 哪个才是我需要的mtd文件呢
09-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值