RISC OS Open
Safeguarding the past, present and future of RISC OS for everyone
ROOL
Home | News | Downloads | Bugs | Bounties | Forum | Documents | Photos | Contact us
Account

HALDeviceExpCtl_IDE

Hardware Abstraction Layer
» HAL Device API
» List of HAL devices
» IDE parallel ATA controller
(HALDeviceExpCtl_IDE)

Device API

Currently, only API version 0 is defined. API version 0 only supports memory mapped controllers.

struct idedevice
{
  struct device dev;
  bool (*cableid)(struct idedevice *ide, int bus);
  size_t (*controllerinfo)(struct idedevice *ide,
                           int bus, union atainfo *info, size_t buflen);
  void (*setmodes)(struct idedevice *ide,
                   int bus, struct atamode *dev0, struct atamode *dev1);
};
Capabilities of the controller

The controllerinfo entry point is used to query the controller’s capabilities and limitations for each bus. The parameters are as follows:

Parameter Description
bus Bus number to query (return bus info), or -1 to return group info
info Pointer to an atainfo union into which the results are returned
buflen Maximum number of bytes that can be written to info

The function returns the amount of data that would be written to info had is not been limited by buflen, or zero if the bus does not exist.

union atainfo
{
    struct
    {
        uint32_t flags;
        volatile uint8_t *cmd;
        volatile uint8_t *ctrl;
        volatile uint8_t *bus_master_reg;
        int int_device;
        uint32_t available_pio_modes;
        uint32_t available_dma_modes;
        uint32_t available_ultradma_modes;
        uint16_t dma_id;              // see OS_Hardware device spec
        uint32_t dma_location;        //           "
        const char *dma_description;  //           "
        uint32_t dma_logical_channel; // or -1 to obtain at run-time
    } bus;
    struct
    {
        uint32_t buses;
        uint16_t dma_id;
        uint32_t dma_location;
        const char *dma_description;
    } group;
}

The bus flags are defined as:

Bit Meaning
0 Reserved for future use
1 32-bit PIO supported
2 IORDY flow control supported
3 48-bit LBA/DMA not supported

This is an internal call for use by the ADFS module and should not be used by user software.

Currently detected drives from cable

All 80 way ribbon cables, and some 40 way ribbon cables include connections to allow the cable type to be detected by software from the state of the CBLID- pin.

The cableid function returns true if CBLID- is currently low; returns false if high, or sensing unavailable.

This is an internal call for use by the ADFS module and should not be used by user software.

Setting the mode for data transfers

This entry point instructs the controller which mode is to be used for subsequent transfers on that bus. PIO, multi-word DMA, and ultra DMA are possible provided the software negotiates with the drive that it is capable and the controller is too.

Parameter Description
bus Bus number to modify
dev0 Settings for device 0
dev1 Settings for device 1

The dev0 and dev1 structures are updated to show the actual modes selected, if the requested modes were not available on that bus.

On entry, both DMA and Ultra DMA modes may be requested – the DMA mode indicates the fallback if Ultra DMA is not available. On exit, no more than 1 of dma_mode and udma_mode will be set to valid values.

The call specifies timings for both devices simultaneously, as it may not be possible to set independent timings, requiring the highest common mode to be set.

Either dev0 or dev1 may be NULL, indicating that that device is not in use and its atamode should not be changed.

struct atamode
{
    uint32_t flags;
    uint8_t pio_mode;  // (eg 0-4)
    uint8_t dma_mode;  // (eg 0-2) 0xFF if none
    uint8_t udma_mode; // (eg 0-5) 0xFF if none
    uint8_t reserved;  // set to 0xFF
}

The mode flags are defined as:

Bit Meaning
0 FIFOs enabled (i.e. non-packet device that waits for interrupts)

This is an internal call for use by the ADFS module and should not be used by user software.

Support in RISC OS

HALDeviceExpCtl_IDE is supported by the trunk version of the ADFS module.

Known implementations

Device ID Description Implemented in
HALDeviceID_IDE_SMC37C66x SMSC super IO ‘665/’669 HAL.IOMD.s.ATA
HALDeviceID_IDE_M5229 ALi M5229 HAL.Tungsten.s.ATA
Information source: HAL.Tungsten.doc.ATA in CVS
Revised on January 8, 2016 09:34:13 by Sprow (202)? (109.176.211.60)
Edit | Back in time (2 revisions) | See changes | History | Views: Print | Source | Linked from: List of HAL devices

Search the Wiki

Social

Follow us on and

ROOL Store

Buy RISC OS Open merchandise here, including SD cards for Raspberry Pi and more.

Donate! Why?

Help ROOL make things happen – please consider donating!

RISC OS IPR

RISC OS is an Open Source operating system owned by RISC OS Developments Ltd and licensed primarily under the Apache 2.0 license.

Navigation

  • Home Page
  • All Pages
  • Recently Revised
  • Authors
  • Feeds
Site design © RISC OS Open Limited 2018 except where indicated
The RISC OS Open Instiki theme is based on Insitki's default layout

Valid XHTML 1.0  |  Valid CSS

Instiki 0.19.1(MML+)
This site runs on Rails

Hosted by Arachsys