Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement