USB write success (still very slow, see errors in DMESG

This commit is contained in:
Anthony Rabine 2023-08-18 10:06:50 +02:00
parent e6a327295e
commit 2179b77d4d
6 changed files with 110 additions and 15 deletions

View file

@ -4,6 +4,7 @@
#include "pico.h" #include "pico.h"
#include "filesystem.h" #include "filesystem.h"
#include "debug.h"
// whether host does safe-eject // whether host does safe-eject
static bool ejected = false; 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 blockBuf[512];
static uint8_t WrBlockBuf[512];
#include "fs_task.h" #include "fs_task.h"
#include "qor.h" #include "qor.h"
@ -89,7 +91,14 @@ void msc_disk_initialize()
void fs_read_cb(bool success) void fs_read_cb(bool success)
{ {
(void)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); 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; (void)lun;
// out of ramdisk
// if (lba >= DISK_BLOCK_NUM)
// return -1;
fs_task_read_block(lba, blockBuf, fs_read_cb); fs_task_read_block(lba, blockBuf, fs_read_cb);
uint8_t *ev; uint8_t *ev_ptr = NULL;
uint32_t res = qor_mbox_wait(&ReadFsMailBox, (void **)&ev, 200); 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 = msc_disk[lba] + offset;
uint8_t const *addr = blockBuf + 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) int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t *buffer, uint32_t bufsize)
{ {
(void)lun; (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; return (int32_t)bufsize;
} }

View file

@ -1,6 +1,9 @@
#include "tusb.h" #include "tusb.h"
#include "class/msc/msc.h" #include "class/msc/msc.h"
#include "device/usbd.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. /* 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. * 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}; .bNumConfigurations = 0x01};
#include "debug.h"
#include "usb_task.h"
// Invoked when received GET DEVICE DESCRIPTOR // Invoked when received GET DEVICE DESCRIPTOR
// Application return pointer to descriptor // Application return pointer to descriptor
uint8_t const *tud_descriptor_device_cb(void) 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 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 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0c45 ProdID=6840 Rev=01.00 P: Vendor=0c45 ProdID=6840 Rev=01.00

View file

@ -36,6 +36,7 @@ typedef enum
FS_LOAD_INDEX, FS_LOAD_INDEX,
FS_LOAD_STORY, FS_LOAD_STORY,
FS_READ_SDCARD_BLOCK, FS_READ_SDCARD_BLOCK,
FS_WRITE_SDCARD_BLOCK,
FS_AUDIO_NEXT_SAMPLES FS_AUDIO_NEXT_SAMPLES
} fs_state_t; } 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); 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) void FsTask(void *args)
{ {
ost_fs_event_t *message = NULL; ost_fs_event_t *message = NULL;
@ -192,6 +205,14 @@ void FsTask(void *args)
} }
break; break;
case FS_WRITE_SDCARD_BLOCK:
sdcard_sector_write(message->addr, message->mem);
if (message->cb != NULL)
{
message->cb(true);
}
break;
default: default:
break; 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); 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) void fs_task_scan_index(fs_result_cb_t cb)
{ {
static ost_fs_event_t ScanIndexEv = { static ost_fs_event_t ScanIndexEv = {

View file

@ -12,5 +12,8 @@ void fs_task_image_start(char *image);
void fs_task_sound_start(char *sound); void fs_task_sound_start(char *sound);
void fs_task_play_index(); void fs_task_play_index();
void fs_task_read_block(uint32_t addr, uint8_t *block, fs_result_cb_t cb); 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 #endif // FS_TASK_H

View file

@ -27,10 +27,13 @@
// =========================================================================================================== // ===========================================================================================================
// DEFINITIONS // DEFINITIONS
// =========================================================================================================== // ===========================================================================================================
#define USB_EV_CONNECTED 0x42
typedef struct typedef struct
{ {
uint8_t ev; uint8_t ev;
} ost_hmi_event_t; } ost_usb_event_t;
typedef enum typedef enum
{ {
@ -48,9 +51,9 @@ static uint32_t UsbStack[4096];
static qor_mbox_t UsbMailBox; 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; static ost_system_state_t OstState = OST_SYS_WAIT_INDEX;
@ -62,18 +65,40 @@ static ost_context_t OstContext;
void UsbTask(void *args) void UsbTask(void *args)
{ {
ost_hmi_event_t *e = NULL; ost_usb_event_t *message = NULL;
// init device stack on configured roothub port // init device stack on configured roothub port
tusb_init(); tusb_init();
bool ConnectedState = false;
uint32_t res = 0;
while (1) while (1)
{ {
// tud_task(); // tinyusb device task // res = qor_mbox_wait(&UsbMailBox, (void **)&message, 5);
qor_sleep(10);
// 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" #include "msc_disk.h"
void usb_task_initialize() void usb_task_initialize()
@ -93,13 +118,17 @@ void usb_task_initialize()
// Invoked when device is mounted // Invoked when device is mounted
void tud_mount_cb(void) void tud_mount_cb(void)
{ {
debug_printf("[USB] Connected\r\n");
// blink_interval_ms = BLINK_MOUNTED; // blink_interval_ms = BLINK_MOUNTED;
// fs_task_usb_connected();
} }
// Invoked when device is unmounted // Invoked when device is unmounted
void tud_umount_cb(void) void tud_umount_cb(void)
{ {
// blink_interval_ms = BLINK_NOT_MOUNTED; // blink_interval_ms = BLINK_NOT_MOUNTED;
debug_printf("[USB] Disconnected\r\n");
// fs_task_usb_disconnected();
} }
// Invoked when usb bus is suspended // Invoked when usb bus is suspended

View file

@ -4,5 +4,6 @@
#include <stdint.h> #include <stdint.h>
void usb_task_initialize(); void usb_task_initialize();
void usb_task_connected();
#endif // USB_TASK_H #endif // USB_TASK_H