mirror of
https://github.com/LuckfoxTECH/luckfox-pico.git
synced 2026-01-19 17:59:18 +01:00
project:build.sh: Added fastboot support; custom modifications to U-Boot and kernel implemented using patches.
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp: Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem. sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately. sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades. sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for fastboot. Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
This commit is contained in:
@@ -362,6 +362,7 @@ ep_io (struct ep_data *epdata, void *buf, unsigned len)
|
||||
spin_unlock_irq (&epdata->dev->lock);
|
||||
|
||||
DBG (epdata->dev, "endpoint gone\n");
|
||||
wait_for_completion(&done);
|
||||
epdata->status = -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/module.h>
|
||||
@@ -35,6 +36,9 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
static DEFINE_IDA(driver_id_numbers);
|
||||
#define DRIVER_DRIVER_NAME_LENGTH_MAX 32
|
||||
|
||||
#define RAW_EVENT_QUEUE_SIZE 16
|
||||
|
||||
struct raw_event_queue {
|
||||
@@ -144,6 +148,7 @@ enum dev_state {
|
||||
STATE_DEV_INVALID = 0,
|
||||
STATE_DEV_OPENED,
|
||||
STATE_DEV_INITIALIZED,
|
||||
STATE_DEV_REGISTERING,
|
||||
STATE_DEV_RUNNING,
|
||||
STATE_DEV_CLOSED,
|
||||
STATE_DEV_FAILED
|
||||
@@ -159,6 +164,9 @@ struct raw_dev {
|
||||
/* Reference to misc device: */
|
||||
struct device *dev;
|
||||
|
||||
/* Make driver names unique */
|
||||
int driver_id_number;
|
||||
|
||||
/* Protected by lock: */
|
||||
enum dev_state state;
|
||||
bool gadget_registered;
|
||||
@@ -187,6 +195,7 @@ static struct raw_dev *dev_new(void)
|
||||
spin_lock_init(&dev->lock);
|
||||
init_completion(&dev->ep0_done);
|
||||
raw_event_queue_init(&dev->queue);
|
||||
dev->driver_id_number = -1;
|
||||
return dev;
|
||||
}
|
||||
|
||||
@@ -197,6 +206,9 @@ static void dev_free(struct kref *kref)
|
||||
|
||||
kfree(dev->udc_name);
|
||||
kfree(dev->driver.udc_name);
|
||||
kfree(dev->driver.driver.name);
|
||||
if (dev->driver_id_number >= 0)
|
||||
ida_free(&driver_id_numbers, dev->driver_id_number);
|
||||
if (dev->req) {
|
||||
if (dev->ep0_urb_queued)
|
||||
usb_ep_dequeue(dev->gadget->ep0, dev->req);
|
||||
@@ -417,9 +429,11 @@ out_put:
|
||||
static int raw_ioctl_init(struct raw_dev *dev, unsigned long value)
|
||||
{
|
||||
int ret = 0;
|
||||
int driver_id_number;
|
||||
struct usb_raw_init arg;
|
||||
char *udc_driver_name;
|
||||
char *udc_device_name;
|
||||
char *driver_driver_name;
|
||||
unsigned long flags;
|
||||
|
||||
if (copy_from_user(&arg, (void __user *)value, sizeof(arg)))
|
||||
@@ -438,36 +452,43 @@ static int raw_ioctl_init(struct raw_dev *dev, unsigned long value)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
driver_id_number = ida_alloc(&driver_id_numbers, GFP_KERNEL);
|
||||
if (driver_id_number < 0)
|
||||
return driver_id_number;
|
||||
|
||||
driver_driver_name = kmalloc(DRIVER_DRIVER_NAME_LENGTH_MAX, GFP_KERNEL);
|
||||
if (!driver_driver_name) {
|
||||
ret = -ENOMEM;
|
||||
goto out_free_driver_id_number;
|
||||
}
|
||||
snprintf(driver_driver_name, DRIVER_DRIVER_NAME_LENGTH_MAX,
|
||||
DRIVER_NAME ".%d", driver_id_number);
|
||||
|
||||
udc_driver_name = kmalloc(UDC_NAME_LENGTH_MAX, GFP_KERNEL);
|
||||
if (!udc_driver_name)
|
||||
return -ENOMEM;
|
||||
if (!udc_driver_name) {
|
||||
ret = -ENOMEM;
|
||||
goto out_free_driver_driver_name;
|
||||
}
|
||||
ret = strscpy(udc_driver_name, &arg.driver_name[0],
|
||||
UDC_NAME_LENGTH_MAX);
|
||||
if (ret < 0) {
|
||||
kfree(udc_driver_name);
|
||||
return ret;
|
||||
}
|
||||
if (ret < 0)
|
||||
goto out_free_udc_driver_name;
|
||||
ret = 0;
|
||||
|
||||
udc_device_name = kmalloc(UDC_NAME_LENGTH_MAX, GFP_KERNEL);
|
||||
if (!udc_device_name) {
|
||||
kfree(udc_driver_name);
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto out_free_udc_driver_name;
|
||||
}
|
||||
ret = strscpy(udc_device_name, &arg.device_name[0],
|
||||
UDC_NAME_LENGTH_MAX);
|
||||
if (ret < 0) {
|
||||
kfree(udc_driver_name);
|
||||
kfree(udc_device_name);
|
||||
return ret;
|
||||
}
|
||||
if (ret < 0)
|
||||
goto out_free_udc_device_name;
|
||||
ret = 0;
|
||||
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
if (dev->state != STATE_DEV_OPENED) {
|
||||
dev_dbg(dev->dev, "fail, device is not opened\n");
|
||||
kfree(udc_driver_name);
|
||||
kfree(udc_device_name);
|
||||
ret = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
@@ -482,14 +503,25 @@ static int raw_ioctl_init(struct raw_dev *dev, unsigned long value)
|
||||
dev->driver.suspend = gadget_suspend;
|
||||
dev->driver.resume = gadget_resume;
|
||||
dev->driver.reset = gadget_reset;
|
||||
dev->driver.driver.name = DRIVER_NAME;
|
||||
dev->driver.driver.name = driver_driver_name;
|
||||
dev->driver.udc_name = udc_device_name;
|
||||
dev->driver.match_existing_only = 1;
|
||||
dev->driver_id_number = driver_id_number;
|
||||
|
||||
dev->state = STATE_DEV_INITIALIZED;
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
return ret;
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
out_free_udc_device_name:
|
||||
kfree(udc_device_name);
|
||||
out_free_udc_driver_name:
|
||||
kfree(udc_driver_name);
|
||||
out_free_driver_driver_name:
|
||||
kfree(driver_driver_name);
|
||||
out_free_driver_id_number:
|
||||
ida_free(&driver_id_numbers, driver_id_number);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -507,6 +539,7 @@ static int raw_ioctl_run(struct raw_dev *dev, unsigned long value)
|
||||
ret = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
dev->state = STATE_DEV_REGISTERING;
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
|
||||
ret = usb_gadget_probe_driver(&dev->driver);
|
||||
|
||||
Reference in New Issue
Block a user