d1fee57dee
The main differences: - The initialization sequence requires an additional command (this was already done) - The layout of the CSD register and the way to compute the device geometry from it changes - The read and write commands parameter is a sector number instead of a byte position Change-Id: Ie729e333c9748f36b37acd70c970adfd425cf0b6 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3512 Reviewed-by: Alex von Gluck IV <kallisti5@unixzen.com>
106 lines
2.9 KiB
C
106 lines
2.9 KiB
C
/*
|
|
* Copyright 2019-2020, Haiku, Inc. All Rights Reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* Adrien Destugues, pulkomandy@pulkomandy.tk
|
|
*/
|
|
#ifndef _MMC_H
|
|
#define _MMC_H
|
|
|
|
|
|
#include <device_manager.h>
|
|
|
|
|
|
#define MMC_BUS_MODULE_NAME "bus_managers/mmc/driver_v1"
|
|
|
|
|
|
struct IOOperation;
|
|
|
|
|
|
enum {
|
|
CARD_TYPE_MMC,
|
|
CARD_TYPE_SD,
|
|
CARD_TYPE_SDHC,
|
|
CARD_TYPE_UHS1,
|
|
CARD_TYPE_UHS2,
|
|
CARD_TYPE_SDIO
|
|
};
|
|
|
|
|
|
// 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,
|
|
|
|
// Block oriented read and write commands, class 2
|
|
SD_READ_SINGLE_BLOCK = 17,
|
|
SD_READ_MULTIPLE_BLOCKS = 18,
|
|
|
|
SD_WRITE_SINGLE_BLOCK = 24,
|
|
SD_WRITE_MULTIPLE_BLOCKS = 25,
|
|
|
|
// Application specific commands, class 8
|
|
SD_APP_CMD = 55,
|
|
|
|
// I/O mode commands, class 9
|
|
SD_IO_ABORT = 52,
|
|
};
|
|
|
|
|
|
enum SDHCI_APPLICATION_COMMANDS {
|
|
SD_SEND_OP_COND = 41,
|
|
};
|
|
|
|
|
|
// Interface between mmc_bus and underlying implementation (sdhci_pci or any
|
|
// other thing that can execute mmc commands)
|
|
typedef struct mmc_bus_interface {
|
|
driver_module_info info;
|
|
|
|
status_t (*set_clock)(void* controller, uint32_t kilohertz);
|
|
// 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.
|
|
status_t (*execute_command)(void* controller, uint8_t command,
|
|
uint32_t argument, uint32_t* result);
|
|
// Execute a command with no I/O phase
|
|
status_t (*do_io)(void* controller, uint8_t command,
|
|
IOOperation* operation, bool offsetAsSectors);
|
|
// Execute a command that involves a data transfer.
|
|
} mmc_bus_interface;
|
|
|
|
|
|
// Interface between mmc device driver (mmc_disk, sdio drivers, ...) and mmc_bus
|
|
// 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.
|
|
typedef struct mmc_device_interface {
|
|
driver_module_info info;
|
|
status_t (*execute_command)(device_node* node, uint8_t command,
|
|
uint32_t argument, uint32_t* result);
|
|
// Execute a command with no I/O phase
|
|
status_t (*do_io)(device_node* controller, uint16_t rca,
|
|
uint8_t command, IOOperation* operation, bool offsetAsSectors);
|
|
// Execute a command that involves a data transfer.
|
|
} mmc_device_interface;
|
|
|
|
|
|
// Device attribute paths for the MMC device
|
|
static const char* kMmcRcaAttribute = "mmc/rca";
|
|
static const char* kMmcTypeAttribute = "mmc/type";
|
|
|
|
|
|
#endif /* _MMC_H */
|