mirror of
https://github.com/arabine/open-story-teller.git
synced 2025-12-06 17:09:06 +01:00
USB write success (still very slow, see errors in DMESG
This commit is contained in:
parent
e6a327295e
commit
2179b77d4d
6 changed files with 110 additions and 15 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 = {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue