Files
haiku-beta6/headers/private/drivers/mmc.h
T

118 lines
3.4 KiB
C
Raw Normal View History

2019-02-10 22:39:02 +01:00
/*
2019-02-19 20:12:08 +01:00
* Copyright 2019-2020, Haiku, Inc. All Rights Reserved.
2019-02-10 22:39:02 +01:00
* Distributed under the terms of the MIT License.
*
* Authors:
* Adrien Destugues, [email protected]
*/
#ifndef _MMC_H
#define _MMC_H
#include <device_manager.h>
2018-12-23 11:31:48 +01:00
#define MMC_BUS_MODULE_NAME "bus_managers/mmc/driver_v1"
2019-02-10 22:39:02 +01:00
2020-12-06 17:44:45 +01:00
struct IOOperation;
2019-02-17 11:54:12 +01:00
enum {
CARD_TYPE_MMC,
CARD_TYPE_SD,
CARD_TYPE_SDHC,
CARD_TYPE_UHS1,
CARD_TYPE_UHS2,
CARD_TYPE_SDIO
};
2020-10-14 15:10:01 +02:00
// Commands for SD cards defined in SD Specifications Part 1:
// Physical Layer Simplified Specification Version 8.00
// They are in the common .h file for the mmc stack because the SDHCI driver
// currently needs to map them to the corresponding expected response types.
enum SD_COMMANDS {
// Basic commands, class 0
SD_GO_IDLE_STATE = 0,
SD_ALL_SEND_CID = 2,
SD_SEND_RELATIVE_ADDR = 3,
SD_SELECT_DESELECT_CARD = 7,
SD_SEND_IF_COND = 8,
SD_SEND_CSD = 9,
SD_STOP_TRANSMISSION = 12,
2020-12-13 12:25:03 +01:00
// Block oriented read and write commands, class 2
2020-10-14 15:10:01 +02:00
SD_READ_SINGLE_BLOCK = 17,
SD_READ_MULTIPLE_BLOCKS = 18,
2020-12-13 12:25:03 +01:00
SD_WRITE_SINGLE_BLOCK = 24,
SD_WRITE_MULTIPLE_BLOCKS = 25,
2021-01-17 15:22:52 +01:00
// Erase commands, class 5
SD_ERASE_WR_BLK_START = 32,
SD_ERASE_WR_BLK_END = 33,
SD_ERASE = 38,
2020-10-14 15:10:01 +02:00
// Application specific commands, class 8
SD_APP_CMD = 55,
// I/O mode commands, class 9
SD_IO_ABORT = 52,
};
enum SDHCI_APPLICATION_COMMANDS {
2021-01-12 21:58:59 +01:00
SD_SET_BUS_WIDTH = 6,
2020-10-14 15:10:01 +02:00
SD_SEND_OP_COND = 41,
};
2019-02-19 20:12:08 +01:00
// Interface between mmc_bus and underlying implementation (sdhci_pci or any
// other thing that can execute mmc commands)
2019-02-10 22:39:02 +01:00
typedef struct mmc_bus_interface {
driver_module_info info;
status_t (*set_clock)(void* controller, uint32_t kilohertz);
2020-12-13 12:25:03 +01:00
// Configure the bus clock. The bus is initialized with a slow clock
// that allows device enumeration in all cases, but after enumeration
// the mmc_bus knows how fast each card can go, and configures the bus
// accordingly.
2019-02-10 22:39:02 +01:00
status_t (*execute_command)(void* controller, uint8_t command,
uint32_t argument, uint32_t* result);
2020-12-13 12:25:03 +01:00
// Execute a command with no I/O phase
status_t (*do_io)(void* controller, uint8_t command,
2020-12-15 21:22:37 +01:00
IOOperation* operation, bool offsetAsSectors);
2020-12-13 12:25:03 +01:00
// Execute a command that involves a data transfer.
void (*set_scan_semaphore)(void* controller, sem_id sem);
// Pass the semaphore used for device rescan to the bus controller
2021-01-14 18:35:05 +01:00
void (*set_bus_width)(void* controller, int width);
// Set the data bus width to 1, 4 or 8 bit mode.
2019-02-10 22:39:02 +01:00
} mmc_bus_interface;
2020-07-26 13:49:20 +02:00
// Interface between mmc device driver (mmc_disk, sdio drivers, ...) and mmc_bus
2020-12-13 12:25:03 +01:00
// This interface is rather generic as it allows implementation of drivers for
// different type of cards, which will use different commands. The bus
// provides a generic interface for all of them, and is not specific to any
// type of card.
2020-07-26 13:49:20 +02:00
typedef struct mmc_device_interface {
driver_module_info info;
2021-01-16 22:50:22 +01:00
status_t (*execute_command)(device_node* node, void* cookie, uint16_t rca,
2021-01-12 21:58:59 +01:00
uint8_t command, uint32_t argument, uint32_t* result);
2020-12-13 12:25:03 +01:00
// Execute a command with no I/O phase
2021-01-16 22:50:22 +01:00
status_t (*do_io)(device_node* controller, void* cookie, uint16_t rca,
2020-12-15 21:22:37 +01:00
uint8_t command, IOOperation* operation, bool offsetAsSectors);
2020-12-13 12:25:03 +01:00
// Execute a command that involves a data transfer.
2021-01-16 22:50:22 +01:00
void (*set_bus_width)(device_node* controller, void* cookie, int width);
2021-01-14 18:35:05 +01:00
// Set the data bus width to 1, 4 or 8 bit mode.
2020-07-26 13:49:20 +02:00
} mmc_device_interface;
2019-02-19 20:12:08 +01:00
// Device attribute paths for the MMC device
const char* const kMmcRcaAttribute = "mmc/rca";
const char* const kMmcTypeAttribute = "mmc/type";
2019-02-19 20:12:08 +01:00
2019-02-10 22:39:02 +01:00
#endif /* _MMC_H */