#include <exec/errors.h>
#include <exec/memory.h>
#include <devices/trackdisk.h>
struct ExecBase* SysBase;
const char DevName[]="mntsd.device";
const char DevIdString[]="mntsd 1.0 (28 Feb 2018)";
const UWORD DevVersion=1;
const UWORD DevRevision=0;
#include "stabs.h"
int __UserDevInit(struct Device* dev)
{
return 1;
}
int __UserDevCleanup(void)
{
return 0;
}
int __UserDevOpen(struct IORequest *io, ULONG unitnum, ULONG flags)
{
io->io_Error = 0;
return 0;
}
int __UserDevClose(struct IORequest *io)
{
return 0;
}
ADDTABL_1(__BeginIO,a1);
void __BeginIO(struct IOStdReq *iostd) {
unsigned int err = IOERR_NOCMD;
unsigned int offset;
struct DriveGeometry *geo;
switch (iostd->io_Command) {
case CMD_RESET:
case CMD_UPDATE:
case CMD_CLEAR:
case CMD_STOP:
case CMD_START:
case CMD_FLUSH:
case TD_MOTOR:
case TD_SEEK:
case TD_REMOVE:
case TD_CHANGENUM:
case TD_CHANGESTATE:
case TD_PROTSTATUS:
case TD_ADDCHANGEINT:
case TD_REMCHANGEINT:
iostd->io_Actual = 0;
err = 0;
break;
case TD_GETDRIVETYPE:
iostd->io_Actual = DG_DIRECT_ACCESS;
err = 0;
break;
case TD_GETGEOMETRY:
geo = (struct DriveGeometry *)iostd->io_Data;
geo->dg_SectorSize = 512;
geo->dg_TotalSectors = 22;
geo->dg_Cylinders = 80;
geo->dg_CylSectors = 44;
geo->dg_Heads = 2;
geo->dg_TrackSectors = 22;
geo->dg_BufMemType = MEMF_PUBLIC;
geo->dg_DeviceType = DG_DIRECT_ACCESS;
geo->dg_Flags = DGF_REMOVABLE;
err = 0;
break;
case TD_FORMAT:
case CMD_WRITE:
offset = iostd->io_Offset;
iostd->io_Actual = iostd->io_Length;
err = 0;//SD_ReadWrite(sdu, io, offset, 1);
break;
case CMD_READ:
offset = iostd->io_Offset;
iostd->io_Actual = iostd->io_Length;
err = 0;//SD_ReadWrite(sdu, io, offset, 0);
break;
default:
kprintf("Unknown IO command: %ld\n", iostd->io_Command);
err = IOERR_NOCMD;
break;
}
iostd->io_Error = err;
if (!(iostd->io_Flags & IOF_QUICK)) {
// ReplyMsg does this: io->io_Message.mn_Node.ln_Type = NT_REPLYMSG;
ReplyMsg(&iostd->io_Message);
}
}
ADDTABL_1(__AbortIO,a1);
void __AbortIO(struct IORequest* io) {
if (!io) return;
io->io_Error = IOERR_ABORTED;
}
ADDTABL_END(); @spidi, post #7
czy sterownik nie musi odnosić się do sprzętu ? np. jakiegoś adresu pod którym znajduje się dane urządzenie ?
//SD_ReadWrite(sdu, io, offset, 1); musiałoby jakieś dane zwracać i może wówczas pokaże się ikonka dysku
@piotr_go, post #10