Files
luban-lite-t3e-pro/bsp/artinchip/drv_bare/sdmc/sdcard.c
刘可亮 aaa66c7b20 V1.0.1
2023-11-09 20:19:51 +08:00

83 lines
1.8 KiB
C

/*
* Copyright (c) 2023, Artinchip Technology Co., Ltd
*
* SPDX-License-Identifier: Apache-2.0
*
* zrq <ruiqi.zheng@artinchip.com>
*/
#include <aic_core.h>
#include <aic_hal_gpio.h>
#include <mmc.h>
#ifdef LPKG_USING_DFS
#include <dfs_fs.h>
#ifdef LPKG_USING_DFS_ELMFAT
#include <dfs_elm.h>
#endif
#endif
#define SD_CHECK_PIN ("PC.6")
irqreturn_t sdcard_detect_irq_handler(int irq, void *args)
{
u8 pin;
u8 g, p;
u32 value = 0;
pin = hal_gpio_name2pin(SD_CHECK_PIN);
g = GPIO_GROUP(pin);
p = GPIO_GROUP_PIN(pin);
hal_gpio_get_value(g, p, &value);
hal_gpio_group_set_irq_stat(g, 0xFFFFFFFF);
if (value) {
printf("card removal detected!\n");
mmc_deinit(1);
#if defined(LPKG_USING_DFS_ELMFAT) && defined(AIC_SDMC_DRV)
if (dfs_unmount("/sdcard") < 0)
printf("Failed to umount sdmc with FatFS\n");
#endif
} else {
printf("card insertion detected!\n");
mmc_init(1);
#if defined(LPKG_USING_DFS_ELMFAT) && defined(AIC_SDMC_DRV)
if (dfs_mount("sdmc", "/sdcard", "elm", 0, (const void *)SDMC_DISK) < 0)
printf("Failed to mount sdmc with FatFS\n");
#endif
}
return IRQ_HANDLED;
}
void sdcard_detect_pin_init(void)
{
u8 pin;
u8 g, p;
pin = hal_gpio_name2pin(SD_CHECK_PIN);
g = GPIO_GROUP(pin);
p = GPIO_GROUP_PIN(pin);
hal_gpio_set_func(g, p, 1);
hal_gpio_set_debounce(g, p, 0xFFF);
hal_gpio_set_bias_pull(g, p, PIN_PULL_UP);
hal_gpio_direction_input(g, p);
hal_gpio_set_irq_mode(g, p, PIN_IRQ_MODE_EDGE_BOTH);
aicos_request_irq(GPIO_IRQn + g, sdcard_detect_irq_handler, 0, "pin_group", NULL);
aicos_irq_enable(GPIO_IRQn + g);
hal_gpio_enable_irq(g, p);
}
void sdcard_hotplug_init(void)
{
sdcard_detect_pin_init();
}