diff --git a/software/platform/raspberry-pico-w/msc_disk.c b/software/platform/raspberry-pico-w/msc_disk.c index 906f536..e88e04d 100644 --- a/software/platform/raspberry-pico-w/msc_disk.c +++ b/software/platform/raspberry-pico-w/msc_disk.c @@ -4,6 +4,7 @@ #include "pico.h" #include "filesystem.h" +#include "debug.h" // whether host does safe-eject static bool ejected = false; @@ -75,6 +76,7 @@ bool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, boo } static uint8_t blockBuf[512]; +static uint8_t WrBlockBuf[512]; #include "fs_task.h" #include "qor.h" @@ -89,7 +91,14 @@ void msc_disk_initialize() void fs_read_cb(bool success) { (void)success; - static uint8_t dummy; + static const uint8_t dummy = 0x42; + qor_mbox_notify(&ReadFsMailBox, (void **)&dummy, QOR_MBOX_OPTION_SEND_BACK); +} + +void fs_write_cb(bool success) +{ + (void)success; + static uint8_t dummy = 0x88; qor_mbox_notify(&ReadFsMailBox, (void **)&dummy, QOR_MBOX_OPTION_SEND_BACK); } @@ -99,16 +108,17 @@ int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void *buff { (void)lun; - // out of ramdisk - // if (lba >= DISK_BLOCK_NUM) - // return -1; - fs_task_read_block(lba, blockBuf, fs_read_cb); - uint8_t *ev; - uint32_t res = qor_mbox_wait(&ReadFsMailBox, (void **)&ev, 200); + uint8_t *ev_ptr = NULL; + uint32_t res = qor_mbox_wait(&ReadFsMailBox, (void **)&ev_ptr, 200); - // printf("lba 0x%x, bufsize %d, offset %d\n",lba, bufsize, offset); + if (res != QOR_MBOX_OK) + { + return 0; + } + + debug_printf("lba 0x%x, bufsize %d, offset %d\n", lba, bufsize, offset); // uint8_t const *addr = msc_disk[lba] + offset; uint8_t const *addr = blockBuf + offset; @@ -129,7 +139,19 @@ bool tud_msc_is_writable_cb(uint8_t lun) int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t *buffer, uint32_t bufsize) { (void)lun; - printf("write - lba 0x%x, bufsize%d\n", lba, bufsize); + // debug_printf("write - lba 0x%x, bufsize%d\n", lba, bufsize); + + memcpy(WrBlockBuf, buffer + offset, bufsize); + + fs_task_write_block(lba, WrBlockBuf, fs_write_cb); + + uint8_t *ev_ptr = NULL; + + uint32_t res = qor_mbox_wait(&ReadFsMailBox, (void **)&ev_ptr, 200); + if (res != QOR_MBOX_OK) + { + return 0; + } return (int32_t)bufsize; } diff --git a/software/platform/raspberry-pico-w/usb_descriptors.c b/software/platform/raspberry-pico-w/usb_descriptors.c index f516ab9..5849633 100644 --- a/software/platform/raspberry-pico-w/usb_descriptors.c +++ b/software/platform/raspberry-pico-w/usb_descriptors.c @@ -1,6 +1,9 @@ #include "tusb.h" #include "class/msc/msc.h" #include "device/usbd.h" + +#include "fs_task.h" + /* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug. * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC. * @@ -43,6 +46,9 @@ tusb_desc_device_t const desc_device = .bNumConfigurations = 0x01}; +#include "debug.h" +#include "usb_task.h" + // Invoked when received GET DEVICE DESCRIPTOR // Application return pointer to descriptor uint8_t const *tud_descriptor_device_cb(void) @@ -154,6 +160,8 @@ uint8_t const *tud_descriptor_configuration_cb(uint8_t index) //--------------------------------------------------------------------+ /* +Caractéristiques USB de la Lunii + T: Bus=03 Lev=03 Prnt=04 Port=00 Cnt=01 Dev#= 75 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=0c45 ProdID=6840 Rev=01.00 diff --git a/software/system/fs_task.c b/software/system/fs_task.c index 4061187..40dbf2c 100644 --- a/software/system/fs_task.c +++ b/software/system/fs_task.c @@ -36,6 +36,7 @@ typedef enum FS_LOAD_INDEX, FS_LOAD_STORY, FS_READ_SDCARD_BLOCK, + FS_WRITE_SDCARD_BLOCK, FS_AUDIO_NEXT_SAMPLES } fs_state_t; @@ -97,6 +98,18 @@ static void show_duration(uint32_t millisecondes) debug_printf("Temps : %d minutes, %d secondes, %d millisecondes\r\n", minutes, secondes, reste); } +static bool UsbConnected = false; + +void fs_task_usb_connected() +{ + UsbConnected = true; +} + +void fs_task_usb_disconnected() +{ + UsbConnected = true; +} + void FsTask(void *args) { ost_fs_event_t *message = NULL; @@ -192,6 +205,14 @@ void FsTask(void *args) } break; + case FS_WRITE_SDCARD_BLOCK: + sdcard_sector_write(message->addr, message->mem); + if (message->cb != NULL) + { + message->cb(true); + } + break; + default: break; } @@ -215,6 +236,17 @@ void fs_task_read_block(uint32_t addr, uint8_t *block, fs_result_cb_t cb) qor_mbox_notify(&FsMailBox, (void **)&ReadBlockEv, QOR_MBOX_OPTION_SEND_BACK); } +void fs_task_write_block(uint32_t addr, uint8_t *block, fs_result_cb_t cb) +{ + static ost_fs_event_t WriteBlockEv = { + .ev = FS_WRITE_SDCARD_BLOCK}; + + WriteBlockEv.mem = block; + WriteBlockEv.addr = addr; + WriteBlockEv.cb = cb; + qor_mbox_notify(&FsMailBox, (void **)&WriteBlockEv, QOR_MBOX_OPTION_SEND_BACK); +} + void fs_task_scan_index(fs_result_cb_t cb) { static ost_fs_event_t ScanIndexEv = { diff --git a/software/system/fs_task.h b/software/system/fs_task.h index 0cc7dc5..395b623 100644 --- a/software/system/fs_task.h +++ b/software/system/fs_task.h @@ -12,5 +12,8 @@ void fs_task_image_start(char *image); void fs_task_sound_start(char *sound); void fs_task_play_index(); void fs_task_read_block(uint32_t addr, uint8_t *block, fs_result_cb_t cb); +void fs_task_write_block(uint32_t addr, uint8_t *block, fs_result_cb_t cb); +void fs_task_usb_connected(); +void fs_task_usb_disconnected(); #endif // FS_TASK_H diff --git a/software/system/usb_task.c b/software/system/usb_task.c index 0343c4f..e511de8 100644 --- a/software/system/usb_task.c +++ b/software/system/usb_task.c @@ -27,10 +27,13 @@ // =========================================================================================================== // DEFINITIONS // =========================================================================================================== + +#define USB_EV_CONNECTED 0x42 + typedef struct { uint8_t ev; -} ost_hmi_event_t; +} ost_usb_event_t; typedef enum { @@ -48,9 +51,9 @@ static uint32_t UsbStack[4096]; static qor_mbox_t UsbMailBox; -static ost_hmi_event_t UsbEvent; +static ost_usb_event_t UsbEvent; -static ost_hmi_event_t *UsbQueue[10]; +static ost_usb_event_t *UsbQueue[10]; static ost_system_state_t OstState = OST_SYS_WAIT_INDEX; @@ -62,18 +65,40 @@ static ost_context_t OstContext; void UsbTask(void *args) { - ost_hmi_event_t *e = NULL; + ost_usb_event_t *message = NULL; // init device stack on configured roothub port tusb_init(); + bool ConnectedState = false; + uint32_t res = 0; + while (1) { - // tud_task(); // tinyusb device task - qor_sleep(10); + // res = qor_mbox_wait(&UsbMailBox, (void **)&message, 5); + + // if (res == QOR_MBOX_OK) + // { + // if (message->ev == USB_EV_CONNECTED) + // { + + // ConnectedState = true; + // } + // } + + tud_task(); // tinyusb device task + qor_sleep(5); } } +void usb_task_connected() +{ + static ost_usb_event_t message; + + message.ev = USB_EV_CONNECTED; + qor_mbox_notify(&UsbMailBox, (void **)&message, QOR_MBOX_OPTION_SEND_BACK); +} + #include "msc_disk.h" void usb_task_initialize() @@ -93,13 +118,17 @@ void usb_task_initialize() // Invoked when device is mounted void tud_mount_cb(void) { + debug_printf("[USB] Connected\r\n"); // blink_interval_ms = BLINK_MOUNTED; + // fs_task_usb_connected(); } // Invoked when device is unmounted void tud_umount_cb(void) { // blink_interval_ms = BLINK_NOT_MOUNTED; + debug_printf("[USB] Disconnected\r\n"); + // fs_task_usb_disconnected(); } // Invoked when usb bus is suspended diff --git a/software/system/usb_task.h b/software/system/usb_task.h index 248f492..421234b 100644 --- a/software/system/usb_task.h +++ b/software/system/usb_task.h @@ -4,5 +4,6 @@ #include void usb_task_initialize(); +void usb_task_connected(); #endif // USB_TASK_H