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 "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;
}

View file

@ -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

View file

@ -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 = {

View file

@ -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

View file

@ -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

View file

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