static uint32_t microSD_stack[DEFAULT_STACK_SIZE / sizeof(uint32_t)];
static struct sigaction signalHandler;
static struct semaphore event_trigger;
//static enum {
// STATE_NOT_PRESENT,
// STATE_PRESENT,
// STATE_UNKNOWN,
//
//}
static bool microSD_state = false;
bool mount_microSD(void) {
int ret = mount("/dev/mmcblk0p1", "/mnt/mmc", "vfat", MS_MGC_VAL | MS_SYNCHRONOUS | MS_RELATIME, "iocharset=utf8");
if (ret < 0) {
return false;
}
return true;
}
bool umount_microSD(void) {
int ret = umount2("/mnt/mmc", MNT_FORCE);
if (ret < 0) {
return false;
}
return true;
}
bool microSD_inserted(void) {
/* Active LOW */
return (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_SD_SENSE, 0, 0));
}
static void microSD_check(int signal)
{
// printf("signal received!");
// if (signal == SIGUSR1) {
semaphore_release(&event_trigger);
// printf("wait unlocked");
// }
}
static void NORETURN_ATTR microSD_thread(void)
{
while (true) {
/* Indefinitely wait for an event */
printf("Released! Checking...\n");
if (microSD_state != microSD_inserted()) {
/* Something has changed */
microSD_state = microSD_inserted();
/* Wait for the kernel to load microSD device */
if (microSD_state) {
printf("microsd inserted\n");
/* Loading microSD takes some time */
sleep(HZ);
mount_microSD();
printf("microSD mounted\n");
queue_broadcast(SYS_HOTSWAP_INSERTED, 0);
}
else {
queue_broadcast(SYS_HOTSWAP_EXTRACTED, 0);
printf("microSD removed\n");
umount_microSD();
printf("microSD umounted\n");
}
queue_broadcast(SYS_FS_CHANGED, 0);
}
semaphore_wait(&event_trigger, TIMEOUT_BLOCK);
}
}
/*
bool microsd_init = false;
if (microSD_inserted()) {
if (!microSD_state) {
queue_broadcast(SYS_HOTSWAP_INSERTED, 0);
backlight_on();
microsd_init = mount_microSD();
microSD_state = true;
}
}
else {
if (microSD_state) {
queue_broadcast(SYS_HOTSWAP_EXTRACTED, 0);
backlight_on();
microsd_init = umount_microSD();
microSD_state = false;
}
}
if (microsd_init)
queue_broadcast(SYS_FS_CHANGED, 0);
sleep(HZ);
}
*/
void sdsense_init(void) {
/* Setup GPIO pin for microSD sense */
gpio_control(DEV_CTRL_GPIO_SET_MUX, GPIO_SD_SENSE, CONFIG_DEFAULT, 0);
gpio_control(DEV_CTRL_GPIO_SET_INPUT, GPIO_SD_SENSE, CONFIG_DEFAULT, 0);
microSD_state = microSD_inserted();
/* Set up the handler, may be invoked also without a hotplug event
* (very unlikely on a "single-process" environment)
*/
semaphore_init(&event_trigger, 1, 0);
signalHandler.sa_handler = microSD_check;
signalHandler.sa_flags = 0;
sigemptyset(&signalHandler.sa_mask);
create_thread(microSD_thread, microSD_stack, sizeof(microSD_stack), 0, "microSD"
IF_PRIO(, PRIORITY_BACKGROUND) IF_COP(, CPU));
/* Now that we are ready, set the in-kernel call */
char temp[100];
sprintf(temp, "echo kill -s SIGUSR1 %i > /proc/sys/kernel/hotplug", getpid());
system(temp);
/**/
int err = sigaction(SIGUSR1, &signalHandler, NULL);
printf("Setup done! %i\n", err);
}