Pullrequest mis5001 clear patch 0305 (#242)

* project/app : Add uvc_app_tiny application

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>

* project/cfg/BoardConfig_IPC/overlay : Add Ubuntu system support for Rockit and RKNN libraries

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>

* sysdrv/source/kernel/drivers/of : Add support for dynamic device tree

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/kernel/drivers/usb/serial : Add CH343 driver support

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/kernel/drivers/staging : Disable partial logging of fbtft

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/kernel/drivers/pinctrl/pinctrl-rockchip.h : Fix pinctrl configuration failure issue

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/kernel/include/dt-bindings/soc/rockchip,boot-mode.h : Add support for the reboot U-Boot command in the BusyBox system

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/kernel/drivers/video : Add logo display support for LF40-480480-ARK and LF40-720720-ARK

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/kernel/arch/arm/boot/dts : Add device tree files for the Luckfox RV1103/RV1106 series boards

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/kernel/arch/arm/configs : Add device tree files for the Luckfox RV1103/RV1106 series boards

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/uboot/u-boot/drivers/mmc/mmc.c : Fix the issue where some Micro SD cards fail to boot

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/uboot/u-boot/common/image-fit.c : Add U-Boot support for luckfox-config

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/uboot/rkbin/bin/rv11 : Add firmware with a serial baud rate of 115200 and back up the original firmware

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/uboot/u-boot/arch/arm/dts : Add device tree files for the Luckfox RV1103/RV1106 series boards

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/uboot/u-boot/configs : Add defconfig files for the Luckfox RV1103/RV1106 series boards

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/uboot/u-boot : Add support for the reboot U-Boot command in the BusyBox system

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/kernel/drivers/media/i2c : Add MIS5001 driver support

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/source/kernel/arch/arm : Add default support for MIS5001 on Luckfox RV1106 series boards

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/tools/board : Delete irrelevant overwrite files and patch files

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/drv_ko/insmod_ko.sh : Register mis5001 driver during boot process

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>

* media/isp/release_camera_engine_rkaiq_rv1106_arm-rockchip830-linux-uclibcgnueabihf/isp_iqfiles : Add mis5001 iqfile

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>

* project/app/rkipc/rkipc/src/rv1106_ipc : Add rkipc application support for mis5001 sensor

Signed-off-by: eng29 <eng29@luckfox.com>

* project/cfg/BoardConfig_IPC : Enable default retrieval of mis5001 iqfile and include ROCKIT and RKNN libraries of RV1106 series board

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>

* project/build.sh : Remove operations related to applying and deleting patches

Signed-off-by: eng29 <eng29@luckfox.com>

* project/build.sh : Modify build system menu description; Apply lightweight system processing only during Buildroot and BusyBox system compilation

Signed-off-by: eng29 <eng29@luckfox.com>

* sysdrv/tools/board/buildroot/luckfox_pico_w_defconfig : Add pppd and pgrep for 4G module

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>

* sysdrv/tools/board/kernel/rv1106-luckfox-pico-ultra-ipc.dtsi : Add uart4m1 support for lastest luckfox-config tool

Signed-off-by: eng29 <eng29@luckfox.com>

---------

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
Signed-off-by: eng29 <eng29@luckfox.com>
This commit is contained in:
luckfox-eng29
2025-03-05 17:21:58 +08:00
committed by GitHub
parent a4230afbf4
commit 485f09ece6
208 changed files with 44172 additions and 15059 deletions

View File

@@ -14,7 +14,7 @@ __insmod()
__rmmod_camera_sensor()
{
for item in `echo "imx415 os04a10 sc4336 sc3336 sc530ai gc2053 sc200ai sc401ai sc450ai techpoint"`
for item in `echo "imx415 os04a10 sc4336 sc3336 sc530ai gc2053 sc200ai sc401ai sc450ai techpoint mis5001"`
do
if lsmod | grep $item | awk '{print $3}' |grep -w 0;then
rmmod $item
@@ -56,6 +56,7 @@ __insmod sc200ai.ko
__insmod sc401ai.ko
__insmod sc450ai.ko
__insmod techpoint.ko
__insmod mis5001.ko
__insmod video_rkcif.ko
__insmod video_rkisp.ko

View File

@@ -124,13 +124,7 @@
csi_dphy_input1: endpoint@1 {
reg = <1>;
remote-endpoint = <&sc4336_out>;
data-lanes = <1 2>;
};
csi_dphy_input2: endpoint@2 {
reg = <2>;
remote-endpoint = <&sc530ai_out>;
remote-endpoint = <&mis5001_out>;
data-lanes = <1 2>;
};
};
@@ -175,34 +169,13 @@
};
};
sc4336: sc4336@30 {
compatible = "smartsens,sc4336";
mis5001: mis5001@31 {
compatible = "imagedesign,mis5001";
status = "okay";
reg = <0x30>;
reg = <0x31>;
clocks = <&cru MCLK_REF_MIPI0>;
clock-names = "xvclk";
pwdn-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&mipi_refclk_out0>;
rockchip,camera-module-index = <0>;
rockchip,camera-module-facing = "back";
rockchip,camera-module-name = "OT01";
rockchip,camera-module-lens-name = "40IRC_F16";
port {
sc4336_out: endpoint {
remote-endpoint = <&csi_dphy_input1>;
data-lanes = <1 2>;
};
};
};
sc530ai: sc530ai@30 {
compatible = "smartsens,sc530ai";
status = "okay";
reg = <0x30>;
clocks = <&cru MCLK_REF_MIPI0>;
clock-names = "xvclk";
pwdn-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&mipi_refclk_out0>;
rockchip,camera-module-index = <0>;
@@ -210,8 +183,8 @@
rockchip,camera-module-name = "CMK-OT2115-PC1";
rockchip,camera-module-lens-name = "30IRC-F16";
port {
sc530ai_out: endpoint {
remote-endpoint = <&csi_dphy_input2>;
mis5001_out: endpoint {
remote-endpoint = <&csi_dphy_input1>;
data-lanes = <1 2>;
};
};

View File

@@ -189,7 +189,7 @@
&acodec {
#sound-dai-cells = <0>;
pa-ctl-gpios = <&gpio3 RK_PD3 GPIO_ACTIVE_HIGH>;
pa-ctl-gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
status = "okay";
};
@@ -249,6 +249,11 @@
data-lanes = <1 2>;
};
csi_dphy_input1: endpoint@1 {
reg = <1>;
remote-endpoint = <&mis5001_out>;
data-lanes = <1 2>;
};
};
port@1 {
@@ -290,6 +295,27 @@
};
};
};
mis5001: mis5001@31 {
compatible = "imagedesign,mis5001";
status = "okay";
reg = <0x31>;
clocks = <&cru MCLK_REF_MIPI0>;
clock-names = "xvclk";
reset-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&mipi_refclk_out0>;
rockchip,camera-module-index = <0>;
rockchip,camera-module-facing = "back";
rockchip,camera-module-name = "CMK-OT2115-PC1";
rockchip,camera-module-lens-name = "30IRC-F16";
port {
mis5001_out: endpoint {
remote-endpoint = <&csi_dphy_input1>;
data-lanes = <1 2>;
};
};
};
};
&mipi0_csi2 {
@@ -470,7 +496,7 @@
pinctrl-0 = <&uart3m0_xfer &uart3m1_xfer>;
};
&uart4 {
pinctrl-0 = <&uart4m0_xfer>;
pinctrl-0 = <&uart4m0_xfer &uart4m1_xfer>;
};
&uart5 {
pinctrl-0 = <&uart5m1_xfer>;

View File

@@ -196,6 +196,7 @@ CONFIG_V4L_PLATFORM_DRIVERS=y
CONFIG_VIDEO_ROCKCHIP_CIF=m
CONFIG_VIDEO_ROCKCHIP_ISP=m
CONFIG_VIDEO_RK_IRCUT=y
CONFIG_VIDEO_MIS5001=m
CONFIG_VIDEO_SC3336=m
CONFIG_DRM=y
CONFIG_DRM_EDID=y

View File

@@ -0,0 +1,7 @@
CONFIG_BT=y
CONFIG_BT_RFCOMM=y
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_HCIUART=y
CONFIG_BT_HCIUART_H4=y
CONFIG_RFKILL=y
CONFIG_RFKILL_RK=y

View File

@@ -1854,6 +1854,16 @@ config VIDEO_MIS4001
This is a Video4Linux2 sensor driver for the ImageDesign
MIS4001 camera.
config VIDEO_MIS5001
tristate "ImageDesign mis5001 sensor support"
depends on I2C && VIDEO_V4L2
select MEDIA_CONTROLLER
select VIDEO_V4L2_SUBDEV_API
select V4L2_FWNODE
help
This is a Video4Linux2 sensor driver for the ImageDesign
MIS5001 camera.
config VIDEO_MT9M001
tristate "mt9m001 support"
depends on I2C && VIDEO_V4L2

View File

@@ -119,6 +119,7 @@ obj-$(CONFIG_VIDEO_OV13855) += ov13855.o
obj-$(CONFIG_VIDEO_OV13858) += ov13858.o
obj-$(CONFIG_VIDEO_MIS2031) += mis2031.o
obj-$(CONFIG_VIDEO_MIS4001) += mis4001.o
obj-$(CONFIG_VIDEO_MIS5001) += mis5001.o
obj-$(CONFIG_VIDEO_MT9M001) += mt9m001.o
obj-$(CONFIG_VIDEO_MT9M032) += mt9m032.o
obj-$(CONFIG_VIDEO_MT9M111) += mt9m111.o

File diff suppressed because it is too large Load Diff

View File

@@ -121,4 +121,11 @@ config OF_DMA_DEFAULT_COHERENT
# arches should select this if DMA is coherent by default for OF devices
bool
config OF_DTBO
bool "Device Tree DTBO"
select OF_DYNAMIC
select OF_FLATTREE
select OF_RESOLVE
help
Device Tree DTBO
endif # OF

View File

@@ -13,5 +13,6 @@ obj-$(CONFIG_OF_RESERVED_MEM) += of_reserved_mem.o
obj-$(CONFIG_OF_RESOLVE) += resolver.o
obj-$(CONFIG_OF_OVERLAY) += overlay.o
obj-$(CONFIG_OF_NUMA) += of_numa.o
obj-$(CONFIG_OF_DTBO) += dtbocfg.o
obj-$(CONFIG_OF_UNITTEST) += unittest-data/

View File

@@ -0,0 +1,429 @@
/*********************************************************************************
*
* Copyright (C) 2016-2023 Ichiro Kawazome
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
********************************************************************************/
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_fdt.h>
#include <linux/configfs.h>
#include <linux/types.h>
#include <linux/stat.h>
#include <linux/limits.h>
#include <linux/file.h>
#include <linux/version.h>
#define DRIVER_NAME "dtbocfg"
#define DRIVER_VERSION "0.1.0"
/**
* Device Tree Overlay Item Structure
*/
struct dtbocfg_overlay_item {
struct config_item item;
#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0))
struct device_node* node;
#endif
int id;
void* dtbo;
int dtbo_size;
};
/**
* dtbocfg_overlay_create() - Create Device Tree Overlay
* @overlay: Pointer to Device Tree Overlay Item
* return Success(0) or Error Status.
*/
static int dtbocfg_overlay_item_create(struct dtbocfg_overlay_item *overlay)
{
int ret_val;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0))
{
int ovcs_id = 0;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 6, 0))
ret_val = of_overlay_fdt_apply(overlay->dtbo,overlay->dtbo_size, &ovcs_id, NULL);
#else
ret_val = of_overlay_fdt_apply(overlay->dtbo,overlay->dtbo_size, &ovcs_id);
#endif
if (ret_val != 0) {
pr_err("%s: Failed to apply overlay (ret_val=%d)\n", __func__, ret_val);
goto failed;
}
overlay->id = ovcs_id;
pr_debug("%s: apply OK(id=%d)\n", __func__, ovcs_id);
}
#else
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
of_fdt_unflatten_tree(overlay->dtbo, NULL, &overlay->node);
#else
of_fdt_unflatten_tree(overlay->dtbo, &overlay->node);
#endif
if (overlay->node == NULL) {
pr_err("%s: failed to unflatten tree\n", __func__);
ret_val = -EINVAL;
goto failed;
}
pr_debug("%s: unflattened OK\n", __func__);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0))
{
int ovcs_id = 0;
ret_val = of_overlay_apply(overlay->node, &ovcs_id);
if (ret_val != 0) {
pr_err("%s: Failed to apply overlay (ret_val=%d)\n", __func__, ret_val);
goto failed;
}
overlay->id = ovcs_id;
pr_debug("%s: apply OK(id=%d)\n", __func__, ovcs_id);
}
#else
{
of_node_set_flag(overlay->node, OF_DETACHED);
ret_val = of_resolve_phandles(overlay->node);
if (ret_val != 0) {
pr_err("%s: Failed to resolve tree\n", __func__);
goto failed;
}
pr_debug("%s: resolved OK\n", __func__);
ret_val = of_overlay_create(overlay->node);
if (ret_val < 0) {
pr_err("%s: Failed to create overlay (ret_val=%d)\n", __func__, ret_val);
goto failed;
}
overlay->id = ret_val;
}
#endif
#endif
pr_debug("%s: create OK\n", __func__);
return 0;
failed:
return ret_val;
}
/**
* dtbocfg_overlay_item_release() - Relase Device Tree Overlay
* @overlay: Pointer to Device Tree Overlay Item
* return none
*/
static void dtbocfg_overlay_item_release(struct dtbocfg_overlay_item *overlay)
{
if (overlay->id >= 0) {
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0))
of_overlay_remove(&overlay->id);
#else
of_overlay_destroy(overlay->id);
#endif
overlay->id = -1;
}
}
/**
* container_of_dtbocfg_overlay_item() - Get Device Tree Overlay Item Pointer from Configuration Item
* @item: Pointer to Configuration Item
* return Pointer to Device Tree Overlay Item
*/
static inline struct dtbocfg_overlay_item* container_of_dtbocfg_overlay_item(struct config_item *item)
{
return item ? container_of(item, struct dtbocfg_overlay_item, item) : NULL;
}
/**
* dtbocfg_overlay_item_status_store() - Set Status Attibute
* @item: Pointer to Configuration Item
* @page: Pointer to Value Buffer
* @count: Size of Value Buffer Size
* return Stored Size or Error Status.
*/
static ssize_t dtbocfg_overlay_item_status_store(struct config_item *item, const char *buf, size_t count)
{
struct dtbocfg_overlay_item *overlay = container_of_dtbocfg_overlay_item(item);
ssize_t status;
unsigned long value;
if (0 != (status = kstrtoul(buf, 10, &value))) {
goto failed;
}
if (value == 0) {
if (overlay->id >= 0) {
dtbocfg_overlay_item_release(overlay);
}
} else {
if (overlay->id < 0) {
dtbocfg_overlay_item_create(overlay);
}
}
return count;
failed:
return -EPERM;
}
/**
* dtbocfg_overlay_item_status_show() - Show Status Attibute
* @item : Pointer to Configuration Item
* @page : Pointer to Value for Store
* return String Size or Error Status.
*/
static ssize_t dtbocfg_overlay_item_status_show(struct config_item *item, char *page)
{
struct dtbocfg_overlay_item *overlay = container_of_dtbocfg_overlay_item(item);
return sprintf(page, "%d\n", overlay->id >= 0 ? 1 : 0);
}
/**
* dtbocfg_overlay_item_dtbo_write() - Write Device Tree Blob to Configuration Item
* @item : Pointer to Configuration Item
* @page : Pointer to Value Buffer
* @count: Size of Value Buffer
* return Stored Size or Error Status.
*/
static ssize_t dtbocfg_overlay_item_dtbo_write(struct config_item *item, const void *buf, size_t count)
{
struct dtbocfg_overlay_item *overlay = container_of_dtbocfg_overlay_item(item);
if (overlay->dtbo_size > 0) {
if (overlay->id >= 0) {
return -EPERM;
}
kfree(overlay->dtbo);
overlay->dtbo = NULL;
overlay->dtbo_size = 0;
}
overlay->dtbo = kmemdup(buf, count, GFP_KERNEL);
if (overlay->dtbo == NULL) {
overlay->dtbo_size = 0;
return -ENOMEM;
} else {
overlay->dtbo_size = count;
return count;
}
}
/**
* dtbocfg_overlay_item_dtbo_read() - Read Device Tree Blob from Configuration Item
* @item : Pointer to Configuration Item
* @page : Pointer to Value for Store, or NULL to query the buffer size
* @size : Size of the supplied buffer
* return Read Size
*/
static ssize_t dtbocfg_overlay_item_dtbo_read(struct config_item *item, void *buf, size_t size)
{
struct dtbocfg_overlay_item *overlay = container_of_dtbocfg_overlay_item(item);
if (overlay->dtbo == NULL)
return 0;
if (buf != NULL)
memcpy(buf, overlay->dtbo, overlay->dtbo_size);
return overlay->dtbo_size;
}
/**
* Device Tree Blob Overlay Attribute Structure
*/
CONFIGFS_BIN_ATTR(dtbocfg_overlay_item_, dtbo, NULL, 1024 * 1024); // 1MiB should be way more than enough
CONFIGFS_ATTR(dtbocfg_overlay_item_, status);
static struct configfs_attribute *dtbocfg_overlay_attrs[] = {
&dtbocfg_overlay_item_attr_status,
NULL,
};
static struct configfs_bin_attribute *dtbocfg_overlay_bin_attrs[] = {
&dtbocfg_overlay_item_attr_dtbo,
NULL,
};
/**
* dtbocfg_overlay_release() - Release Device Tree Overlay Item
* @item : Pointer to Configuration Item
* Return None
*/
static void dtbocfg_overlay_release(struct config_item *item)
{
struct dtbocfg_overlay_item *overlay = container_of_dtbocfg_overlay_item(item);
pr_debug("%s\n", __func__);
dtbocfg_overlay_item_release(overlay);
if (overlay->dtbo) {
kfree(overlay->dtbo);
overlay->dtbo = NULL;
overlay->dtbo_size = 0;
}
kfree(overlay);
}
/**
* Device Tree Blob Overlay Item Structure
*/
static struct configfs_item_operations dtbocfg_overlay_item_ops = {
.release = dtbocfg_overlay_release,
};
static struct config_item_type dtbocfg_overlay_item_type = {
.ct_item_ops = &dtbocfg_overlay_item_ops,
.ct_attrs = dtbocfg_overlay_attrs,
.ct_bin_attrs = dtbocfg_overlay_bin_attrs,
.ct_owner = THIS_MODULE,
};
/**
* dtbocfg_overlay_group_make_item() - Make Device Tree Overlay Group Item
* @group: Pointer to Configuration Group
* @name : Pointer to Group Name
* Return Pointer to Device Tree Overlay Group Item
*/
static struct config_item *dtbocfg_overlay_group_make_item(struct config_group *group, const char *name)
{
struct dtbocfg_overlay_item *overlay;
pr_debug("%s\n", __func__);
overlay = kzalloc(sizeof(*overlay), GFP_KERNEL);
if (!overlay)
return ERR_PTR(-ENOMEM);
overlay->id = -1;
overlay->dtbo = NULL;
overlay->dtbo_size = 0;
config_item_init_type_name(&overlay->item, name, &dtbocfg_overlay_item_type);
return &overlay->item;
}
/**
* dtbocfg_overlay_group_drop_item() - Drop Device Tree Overlay Group Item
* @group: Pointer to Configuration Group
* @item : Pointer to Device Tree Overlay Group Item
*/
static void dtbocfg_overlay_group_drop_item(struct config_group *group, struct config_item *item)
{
struct dtbocfg_overlay_item *overlay = container_of_dtbocfg_overlay_item(item);
pr_debug("%s\n", __func__);
config_item_put(&overlay->item);
}
/**
* Device Tree Blob Overlay Sub Group Structures
*/
static struct configfs_group_operations dtbocfg_overlays_ops = {
.make_item = dtbocfg_overlay_group_make_item,
.drop_item = dtbocfg_overlay_group_drop_item,
};
static struct config_item_type dtbocfg_overlays_type = {
.ct_group_ops = &dtbocfg_overlays_ops,
.ct_owner = THIS_MODULE,
};
static struct config_group dtbocfg_overlay_group;
/**
* Device Tree Blob Overlay Root Sub System Structures
*/
static struct configfs_group_operations dtbocfg_root_ops = {
/* empty - we don't allow anything to be created */
};
static struct config_item_type dtbocfg_root_type = {
.ct_group_ops = &dtbocfg_root_ops,
.ct_owner = THIS_MODULE,
};
static struct configfs_subsystem dtbocfg_root_subsys = {
.su_group = {
.cg_item = {
.ci_namebuf = "device-tree",
.ci_type = &dtbocfg_root_type,
},
},
.su_mutex = __MUTEX_INITIALIZER(dtbocfg_root_subsys.su_mutex),
};
/**
* dtbocfg_module_init()
*/
static int __init dtbocfg_module_init(void)
{
int retval = 0;
pr_info(DRIVER_NAME ": " DRIVER_VERSION "\n");
config_group_init(&dtbocfg_root_subsys.su_group);
config_group_init_type_name(&dtbocfg_overlay_group, "overlays", &dtbocfg_overlays_type);
retval = configfs_register_subsystem(&dtbocfg_root_subsys);
if (retval != 0) {
pr_err( "%s: couldn't register subsys\n", __func__);
goto register_subsystem_failed;
}
retval = configfs_register_group(&dtbocfg_root_subsys.su_group, &dtbocfg_overlay_group);
if (retval != 0) {
pr_err( "%s: couldn't register group\n", __func__);
goto register_group_failed;
}
pr_info(DRIVER_NAME ": OK\n");
return 0;
register_group_failed:
configfs_unregister_subsystem(&dtbocfg_root_subsys);
register_subsystem_failed:
return retval;
}
/**
* dtbocfg_module_exit()
*/
static void __exit dtbocfg_module_exit(void)
{
configfs_unregister_group(&dtbocfg_overlay_group);
configfs_unregister_subsystem(&dtbocfg_root_subsys);
}
module_init(dtbocfg_module_init);
module_exit(dtbocfg_module_exit);
MODULE_AUTHOR("ikwzm");
MODULE_DESCRIPTION("Device Tree Overlay Configuration File System");
MODULE_LICENSE("Dual BSD/GPL");

View File

@@ -170,7 +170,9 @@ static int overlay_notify(struct overlay_changeset *ovcs,
ret = blocking_notifier_call_chain(&overlay_notify_chain,
action, &nd);
if (notifier_to_errno(ret)) {
if (ret == NOTIFY_OK || ret == NOTIFY_STOP)
return 0;
if (ret) {
ret = notifier_to_errno(ret);
pr_err("overlay changeset %s notifier error %d, target: %pOF\n",
of_overlay_action_name[action], ret, nd.target);

View File

@@ -18,6 +18,8 @@
#ifndef _PINCTRL_ROCKCHIP_H
#define _PINCTRL_ROCKCHIP_H
#include <linux/gpio/driver.h>
#define RK_GPIO0_A0 0
#define RK_GPIO0_A1 1
#define RK_GPIO0_A2 2

View File

@@ -292,9 +292,9 @@ static void fbtft_update_display(struct fbtft_par *par, unsigned int start_line,
throughput = throughput ? (len * 1000) / throughput : 0;
throughput = throughput * 1000 / 1024;
dev_info(par->info->device,
"Display update: %ld kB/s, fps=%ld\n",
throughput, fps);
// dev_info(par->info->device,
// "Display update: %ld kB/s, fps=%ld\n",
// throughput, fps);
par->first_update_done = true;
}
}

View File

@@ -407,7 +407,7 @@ do { \
dev_info(dev, format, ##arg); \
} while (0)
#define fbtft_par_dbg(level, par, format, arg...) \
/*#define fbtft_par_dbg(level, par, format, arg...) \
do { \
if (unlikely((par)->debug & (level))) \
dev_info((par)->info->device, format, ##arg); \
@@ -418,6 +418,9 @@ do { \
if (unlikely((par)->debug & (level))) \
fbtft_dbg_hex(dev, sizeof(type), buf,\
(num) * sizeof(type), format, ##arg); \
} while (0)
} while (0)*/
#define fbtft_par_dbg(level, par, format, arg...) ;
#define fbtft_par_dbg_hex(level, par, dev, type, buf, num, format, arg...) ;
#endif /* __LINUX_FBTFT_H */

View File

@@ -112,6 +112,15 @@ config USB_SERIAL_CH341
To compile this driver as a module, choose M here: the
module will be called ch341.
config USB_SERIAL_CH343
tristate "USB Winchiphead CH343 Single Port Serial Driver"
help
Say Y here if you want to use a Winchiphead CH343 single port
USB to serial adapter.
To compile this driver as a module, choose M here: the
module will be called ch343.
config USB_SERIAL_WHITEHEAT
tristate "USB ConnectTech WhiteHEAT Serial Driver"
select USB_EZUSB_FX2

View File

@@ -15,6 +15,7 @@ obj-$(CONFIG_USB_SERIAL_AIRCABLE) += aircable.o
obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o
obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o
obj-$(CONFIG_USB_SERIAL_CH341) += ch341.o
obj-$(CONFIG_USB_SERIAL_CH343) += ch343.o
obj-$(CONFIG_USB_SERIAL_CP210X) += cp210x.o
obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o
obj-$(CONFIG_USB_SERIAL_CYPRESS_M8) += cypress_m8.o

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,243 @@
#ifndef _CH343_H
#define _CH343_H
/*
* Baud rate and default timeout
*/
#define DEFAULT_BAUD_RATE 9600
#define DEFAULT_TIMEOUT 2000
/*
* CMSPAR, some architectures can't have space and mark parity.
*/
#ifndef CMSPAR
#define CMSPAR 0
#endif
/*
* Major and minor numbers.
*/
#define CH343_TTY_MAJOR 170
#define CH343_TTY_MINORS 256
#define USB_MINOR_BASE 70
/*
* Requests.
*/
#define USB_RT_CH343 (USB_TYPE_CLASS | USB_RECIP_INTERFACE)
#define CMD_R 0x95
#define CMD_W 0x9A
#define CMD_C1 0xA1
#define CMD_C2 0xA4
#define CMD_C3 0x05
#define CMD_C4 0xA8
#define CMD_C5 0x5E
#define CMD_C6 0x5F
#define CH343_CTO_O 0x10
#define CH343_CTO_D 0x20
#define CH343_CTO_R 0x40
#define CH343_CTO_A 0x80
#define CH343_CTI_C 0x01
#define CH343_CTI_DS 0x02
#define CH343_CTI_R 0x04
#define CH343_CTI_DC 0x08
#define CH343_CTI_ST 0x0f
#define CH343_CTT_M 0x08
#define CH343_CTT_F 0x44
#define CH343_CTT_P 0x04
#define CH343_CTT_O 0x02
#define CH343_LO 0x02
#define CH343_LE 0x04
#define CH343_LB
#define CH343_LP 0x00
#define CH343_LF 0x40
#define CH343_LM 0x08
#define CH343_L_R_CT 0x80
#define CH343_L_R_CL 0x04
#define CH343_L_R_T 0x08
#define CH343_L_E_R 0x80
#define CH343_L_E_T 0x40
#define CH343_L_P_S 0x38
#define CH343_L_P_M 0x28
#define CH343_L_P_E 0x18
#define CH343_L_P_O 0x08
#define CH343_L_SB 0x04
#define CH343_L_C8 0x03
#define CH343_L_C7 0x02
#define CH343_L_C6 0x01
#define CH343_L_C5 0x00
#define CH343_N_B 0x80
#define CH343_N_AB 0x10
/*
* Internal driver structures.
*/
/*
* The only reason to have several buffers is to accommodate assumptions
* in line disciplines. They ask for empty space amount, receive our URB size,
* and proceed to issue several 1-character writes, assuming they will fit.
* The very first write takes a complete URB. Fortunately, this only happens
* when processing onlcr, so we only need 2 buffers. These values must be
* powers of 2.
*/
#define CH343_NW 16
#define CH343_NR 16
struct ch343_wb {
unsigned char *buf;
dma_addr_t dmah;
int len;
int use;
struct urb *urb;
struct ch343 *instance;
};
struct ch343_rb {
int size;
unsigned char *base;
dma_addr_t dma;
int index;
struct ch343 *instance;
};
struct usb_ch343_line_coding {
__u32 dwDTERate;
__u8 bCharFormat;
#define USB_CH343_1_STOP_BITS 0
#define USB_CH343_1_5_STOP_BITS 1
#define USB_CH343_2_STOP_BITS 2
__u8 bParityType;
#define USB_CH343_NO_PARITY 0
#define USB_CH343_ODD_PARITY 1
#define USB_CH343_EVEN_PARITY 2
#define USB_CH343_MARK_PARITY 3
#define USB_CH343_SPACE_PARITY 4
__u8 bDataBits;
} __attribute__((packed));
typedef enum {
CHIP_CH342F = 0x00,
CHIP_CH342K,
CHIP_CH343GP,
CHIP_CH343G_AUTOBAUD,
CHIP_CH343K,
CHIP_CH343J,
CHIP_CH344L,
CHIP_CH344L_V2,
CHIP_CH344Q,
CHIP_CH347T,
CHIP_CH9101UH,
CHIP_CH9101RY,
CHIP_CH9102F,
CHIP_CH9102X,
CHIP_CH9103M,
CHIP_CH9104L,
} CHIPTYPE;
struct gpioinfo {
int group;
int pin;
};
struct ch343_gpio {
int gpiocount;
struct gpioinfo io[64];
};
struct ch343_gpio ch343_gpios[] = {
{ 0, {}},
{ 0, {}},
{ 0, {}},
{ 0, {}},
{ 0, {}},
{ 0, {}},
/* CH344L */
{ 8, {}},
/* CH344L-V2 */
{ 8, {}},
/* CH344Q */
{ 8, {}},
/* CH347T */
{ 4, {}},
/* CH9101UH */
{ 5, {{3, 2}, {3, 3}, {1, 3}, {1, 2}, {1, 5}, {2, 4}}},
/* CH9101RY */
{ 4, {{1, 3}, {3, 3}, {3, 2}, {2, 4}}},
/* CH9102F */
{ 5, {{2, 1}, {2, 7}, {2, 4}, {2, 6}, {2, 3}}},
/* CH9102X */
{ 6, {{2, 3}, {2, 5}, {2, 1}, {2, 7}, {3, 0}, {2, 2}}},
/* CH9103M */
{12, {{1, 3}, {1, 2}, {3, 2}, {2, 6}, {1, 0}, {1, 6}, {2, 3}, {2, 5}, {3, 0}, {2, 2}, {1, 5}, {2, 4}}},
/* CH9104L */
{24, {}},
};
struct ch343 {
struct usb_device *dev; /* the corresponding usb device */
struct usb_interface *control; /* control interface */
struct usb_interface *data; /* data interface */
struct tty_port port; /* our tty port data */
struct urb *ctrlurb; /* urbs */
u8 *ctrl_buffer; /* buffers of urbs */
dma_addr_t ctrl_dma; /* dma handles of buffers */
struct ch343_wb wb[CH343_NW];
unsigned long read_urbs_free;
struct urb *read_urbs[CH343_NR];
struct ch343_rb read_buffers[CH343_NR];
int rx_buflimit;
int rx_endpoint;
spinlock_t read_lock;
int write_used; /* number of non-empty write buffers */
int transmitting;
spinlock_t write_lock;
struct mutex mutex;
bool disconnected;
struct usb_ch343_line_coding line; /* bits, stop, parity */
struct work_struct work; /* work queue entry for line discipline waking up */
unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */
unsigned int ctrlout; /* output control lines (DTR, RTS) */
struct async_icount iocount; /* counters for control line changes */
struct async_icount oldcount; /* for comparison of counter */
wait_queue_head_t wioctl; /* for ioctl */
unsigned int writesize; /* max packet size for the output bulk endpoint */
unsigned int readsize, ctrlsize; /* buffer sizes for freeing */
unsigned int minor; /* ch343 minor number */
unsigned char clocal; /* termios CLOCAL */
unsigned int susp_count; /* number of suspended interfaces */
u8 bInterval;
struct usb_anchor delayed; /* writes queued for a device about to be woken */
unsigned long quirks;
u8 iface;
CHIPTYPE chiptype;
u16 idVendor;
u16 idProduct;
u8 gpio5dir;
};
#define CDC_DATA_INTERFACE_TYPE 0x0a
/* constants describing various quirks and errors */
#define NO_UNION_NORMAL BIT(0)
#define SINGLE_RX_URB BIT(1)
#define NO_CAP_LINE BIT(2)
#define NO_DATA_INTERFACE BIT(4)
#define IGNORE_DEVICE BIT(5)
#define QUIRK_CONTROL_LINE_STATE BIT(6)
#define CLEAR_HALT_CONDITIONS BIT(7)
#endif

View File

@@ -88,6 +88,9 @@
# define DPRINTK(fmt, args...)
#endif
#define CURSOR_ENABLE 0
#define SHOW_CENTER 1
/*
* FIXME: Locking
*
@@ -365,6 +368,7 @@ static int get_color(struct vc_data *vc, struct fb_info *info,
static void fb_flashcursor(struct work_struct *work)
{
#if CURSOR_ENABLE
struct fb_info *info = container_of(work, struct fb_info, queue);
struct fbcon_ops *ops = info->fbcon_par;
struct vc_data *vc = NULL;
@@ -395,6 +399,7 @@ static void fb_flashcursor(struct work_struct *work)
ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
get_color(vc, info, c, 0));
console_unlock();
#endif
}
static void cursor_timer_handler(struct timer_list *t)
@@ -601,7 +606,12 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
if (fb_get_color_depth(&info->var, &info->fix) == 1)
erase &= ~0x400;
logo_height = fb_prepare_logo(info, ops->rotate);
logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);
#if SHOW_CENTER
logo_height += (info->var.yres/2) - (logo_height/2);
#endif
logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);
q = (unsigned short *) (vc->vc_origin +
vc->vc_size_row * rows);
step = logo_lines * cols;
@@ -1331,6 +1341,7 @@ static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
static void fbcon_cursor(struct vc_data *vc, int mode)
{
#if CURSOR_ENABLE
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
struct fbcon_ops *ops = info->fbcon_par;
int c = scr_readw((u16 *) vc->vc_pos);
@@ -1352,6 +1363,7 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
get_color(vc, info, c, 0));
#endif
}
static int scrollback_phys_max = 0;

View File

@@ -38,7 +38,7 @@
#include <asm/fb.h>
#define SHOW_CENTER 1
/*
* Frame buffer device initialization and setup routines
*/
@@ -520,6 +520,11 @@ static int fb_show_logo_line(struct fb_info *info, int rotate,
image.dy = y;
}
#if SHOW_CENTER
image.dx = (info->var.xres - logo->width) / 2;
image.dy = (info->var.yres - logo->height) / 2;
#endif
image.width = logo->width;
image.height = logo->height;

File diff suppressed because it is too large Load Diff

View File

@@ -23,4 +23,6 @@
/* reboot system quiescent */
#define BOOT_QUIESCENT (REBOOT_FLAG + 14)
#define BOOT_TO_UBOOT (REBOOT_FLAG + 16)
#endif

View File

@@ -18,29 +18,29 @@
u-boot,spl-boot-order = &spi_nor, &emmc;
};
adc-keys {
compatible = "adc-keys";
io-channels = <&saradc 0>;
io-channel-names = "buttons";
poll-interval = <100>;
keyup-threshold-microvolt = <1800000>;
u-boot,dm-spl;
status = "okay";
adc-keys {
compatible = "adc-keys";
io-channels = <&saradc 0>;
io-channel-names = "buttons";
poll-interval = <100>;
keyup-threshold-microvolt = <1800000>;
u-boot,dm-spl;
status = "okay";
volumeup-key {
u-boot,dm-spl;
linux,code = <KEY_VOLUMEUP>;
label = "volume up";
press-threshold-microvolt = <0>;
};
volumeup-key {
u-boot,dm-spl;
linux,code = <KEY_VOLUMEUP>;
label = "volume up";
press-threshold-microvolt = <0>;
};
volumedown-key {
u-boot,dm-spl;
linux,code = <KEY_VOLUMEDOWN>;
label = "volume down";
press-threshold-microvolt = <400781>;
};
};
volumedown-key {
u-boot,dm-spl;
linux,code = <KEY_VOLUMEDOWN>;
label = "volume down";
press-threshold-microvolt = <400781>;
};
};
};

View File

@@ -18,29 +18,29 @@
u-boot,spl-boot-order = &spi_nand, &emmc;
};
adc-keys {
compatible = "adc-keys";
io-channels = <&saradc 0>;
io-channel-names = "buttons";
poll-interval = <100>;
keyup-threshold-microvolt = <1800000>;
u-boot,dm-spl;
status = "okay";
adc-keys {
compatible = "adc-keys";
io-channels = <&saradc 0>;
io-channel-names = "buttons";
poll-interval = <100>;
keyup-threshold-microvolt = <1800000>;
u-boot,dm-spl;
status = "okay";
volumeup-key {
u-boot,dm-spl;
linux,code = <KEY_VOLUMEUP>;
label = "volume up";
press-threshold-microvolt = <0>;
};
volumeup-key {
u-boot,dm-spl;
linux,code = <KEY_VOLUMEUP>;
label = "volume up";
press-threshold-microvolt = <0>;
};
volumedown-key {
u-boot,dm-spl;
linux,code = <KEY_VOLUMEDOWN>;
label = "volume down";
press-threshold-microvolt = <400781>;
};
};
volumedown-key {
u-boot,dm-spl;
linux,code = <KEY_VOLUMEDOWN>;
label = "volume down";
press-threshold-microvolt = <400781>;
};
};
};

View File

@@ -28,6 +28,8 @@
/* enter bootrom download mode */
#define BOOT_BROM_DOWNLOAD 0xEF08A53C
#define BOOT_TO_UBOOT (REBOOT_FLAG + 16)
#ifndef __ASSEMBLY__
int setup_boot_mode(void);
#endif

View File

@@ -206,6 +206,11 @@ int rockchip_get_boot_mode(void)
printf("boot mode: quiescent\n");
boot_mode[PL] = BOOT_MODE_QUIESCENT;
break;
case BOOT_TO_UBOOT:
printf("boot mode: uboot\n");
boot_mode[PL] = BOOT_MODE_UBOOT_TERMINAL;
clear_boot_reg = 1;
break;
default:
printf("boot mode: None\n");
boot_mode[PL] = BOOT_MODE_UNDEFINE;
@@ -231,6 +236,8 @@ int setup_boot_mode(void)
{
char env_preboot[256] = {0};
env_set("cli", NULL); /* removed by default */
switch (rockchip_get_boot_mode()) {
case BOOT_MODE_BOOTLOADER:
printf("enter fastboot!\n");
@@ -263,6 +270,10 @@ int setup_boot_mode(void)
printf("enter charging!\n");
env_set("preboot", "setenv preboot; charge");
break;
case BOOT_MODE_UBOOT_TERMINAL:
printf("enter uboot!\n");
env_set("cli", "yes");
break;
}
return 0;

View File

@@ -220,7 +220,8 @@ static int __abortboot(int bootdelay)
#endif
#ifdef CONFIG_ARCH_ROCKCHIP
if (!IS_ENABLED(CONFIG_CONSOLE_DISABLE_CLI) && ctrlc()) { /* we press ctrl+c ? */
// if (!IS_ENABLED(CONFIG_CONSOLE_DISABLE_CLI) && ctrlc()) { /* we press ctrl+c ? */
if ((!IS_ENABLED(CONFIG_CONSOLE_DISABLE_CLI) && ctrlc()) || env_get("cli")) { /* we press ctrl+c ? */
#else
/*
* Check if key already pressed

View File

@@ -32,6 +32,7 @@ DECLARE_GLOBAL_DATA_PTR;
#include <u-boot/sha1.h>
#include <u-boot/sha256.h>
#define FDT_DEFAULT_LOAD_ADDR 0x00c00000
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
@@ -2140,7 +2141,13 @@ int fit_image_load_index(bootm_headers_t *images, ulong addr,
ret = fit_image_select(fit, noffset, images->verify);
if (ret) {
bootstage_error(bootstage_id + BOOTSTAGE_SUB_HASH);
return ret;
/* Use the memory fdt directly */
printf(" Use the memory fdt directly\n");
*datap = FDT_DEFAULT_LOAD_ADDR;
fit_image_get_data_size(fit, noffset, (int *)&size);
*lenp = (ulong)size;
return noffset;
//return ret;
}
bootstage_mark(bootstage_id + BOOTSTAGE_SUB_CHECK_ARCH);
@@ -2175,7 +2182,6 @@ int fit_image_load_index(bootm_headers_t *images, ulong addr,
fit_image_check_os(fit, noffset, IH_OS_ARM_TRUSTED_FIRMWARE) ||
fit_image_check_os(fit, noffset, IH_OS_OP_TEE) ||
fit_image_check_os(fit, noffset, IH_OS_U_BOOT) ||
fit_image_check_os(fit, noffset, IH_OS_QNX) ||
fit_image_check_os(fit, noffset, IH_OS_OPENRTOS);
/*
@@ -2261,8 +2267,10 @@ int fit_image_load_index(bootm_headers_t *images, ulong addr,
return -EXDEV;
}
//printf(" Loading %s from 0x%08lx to 0x%08lx\n",
// prop_name, data, load);
printf(" Loading %s from 0x%08lx to 0x%08lx\n",
prop_name, data, load);
prop_name, image_start, load);
dst = map_sysmem(load, len);
memmove(dst, buf, len);

View File

@@ -2288,6 +2288,11 @@ int mmc_start_init(struct mmc *mmc)
/* Test for SD version 2 */
err = mmc_send_if_cond(mmc);
if (err) {
mmc_go_idle(mmc);
mmc_get_blk_desc(mmc)->hwpart = 0;
mmc_send_if_cond(mmc);
}
/* Now try to get the SD card's operating condition */
err = sd_send_op_cond(mmc);

View File

@@ -20,6 +20,7 @@ enum _boot_mode {
BOOT_MODE_WATCHDOG,
BOOT_MODE_DFU,
BOOT_MODE_QUIESCENT,
BOOT_MODE_UBOOT_TERMINAL,
BOOT_MODE_UNDEFINE,
};

View File

@@ -1,48 +0,0 @@
#!/bin/sh
#
# sshd Starts sshd.
#
# Make sure the ssh-keygen progam exists
[ -f /usr/bin/ssh-keygen ] || exit 0
umask 077
start() {
chown root:root /var/empty/
# Create any missing keys
/usr/bin/ssh-keygen -A
printf "Starting sshd: "
/usr/sbin/sshd
touch /var/lock/sshd
echo "OK"
}
stop() {
printf "Stopping sshd: "
killall sshd
rm -f /var/lock/sshd
echo "OK"
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?

View File

@@ -1,27 +0,0 @@
#!/bin/sh
check_hciconfig() {
if command -v hciattach &> /dev/null; then
if lsmod | grep -q "aic8800_fdrv"; then
hciattach -s 1500000 /dev/ttyS1 any 1500000 flow nosleep&
sleep 2
if hciconfig -a | grep -q "hci0"; then
hciconfig hci0 up&
else
echo "hci0 not found or not available."
fi
else
echo "aic8800_fdrv not found."
fi
fi
}
case $1 in
start)
check_hciconfig
;;
*)
exit 1
;;
esac

View File

@@ -1,55 +0,0 @@
#!/bin/sh
#
# python Starts python code.
#
# Make sure the python progam exists
[ -f /usr/bin/python ] || exit 0
umask 077
main_path="/root/main.py"
boot_path="/root/boot.py"
start() {
# Run python progam
if [ -f $main_path ]; then
echo "running $main_path..."
python $main_path
else
if [ -f $boot_path ]; then
echo "running $boot_path..."
python $boot_path
else
echo "$main_path and $boot_path not exist ,pass..."
fi
fi
echo "OK"
}
stop() {
printf "Stopping python: "
killall python
echo "OK"
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?

View File

@@ -1,16 +0,0 @@
#!/bin/sh
case $1 in
start)
if [ "$(hwclock | grep "1969")" ]; then
echo "RTC time calibration"
date -s 2024-01-01
hwclock -w
else
echo "RTC does not require time calibration"
fi
;;
*)
exit 1
;;
esac

Binary file not shown.

View File

@@ -66,6 +66,7 @@ BR2_PACKAGE_LIBV4L=y
BR2_PACKAGE_LIBV4L_UTILS=y
BR2_PACKAGE_CJSON=y
BR2_PACKAGE_CJSON_UTILS=y
BR2_PACKAGE_PCRE2=y
BR2_PACKAGE_BLUEZ_TOOLS=y
BR2_PACKAGE_BLUEZ5_UTILS_CLIENT=y
BR2_PACKAGE_BLUEZ5_UTILS_TOOLS=y
@@ -77,6 +78,9 @@ BR2_PACKAGE_IW=y
BR2_PACKAGE_LRZSZ=y
BR2_PACKAGE_NTP=y
BR2_PACKAGE_OPENSSH=y
BR2_PACKAGE_PPPD=y
BR2_PACKAGE_PPPD_FILTER=y
BR2_PACKAGE_PPPD_RADIUS=y
BR2_PACKAGE_SAMBA4=y
BR2_PACKAGE_SOCAT=y
BR2_PACKAGE_BASH=y
@@ -84,6 +88,7 @@ BR2_PACKAGE_BASH_LOADABLE_EXAMPLES=y
BR2_PACKAGE_DIALOG=y
BR2_PACKAGE_TIME=y
BR2_PACKAGE_HTOP=y
BR2_PACKAGE_PROCPS_NG=y
BR2_PACKAGE_UTIL_LINUX_LIBMOUNT=y
BR2_PACKAGE_NANO=y
BR2_PACKAGE_HOST_DTC=y

View File

@@ -1,24 +0,0 @@
export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
export EDITOR='/bin/vi'
#export PS1='[\u@\h \W]# '
if [ "$PS1" ]; then
if [ "`id -u`" -eq 0 ]; then
#export PS1='# '
export PS1='[\u@\h \W]# '
else
#export PS1='$ '
export PS1='[\u@\h \W]$ '
fi
fi
# Source configuration files from /etc/profile.d
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
. $i
fi
done
unset i

View File

@@ -1,13 +0,0 @@
[global]
workgroup = WORKGROUP
server string = luckfox samba server
security = user
passdb backend = smbpasswd
smb passwd file = /etc/samba/smbpasswd
[public]
comment = public share
path = /
read only = no
user = root
create mask = 0755
directory mask = 0755

View File

@@ -1,9 +0,0 @@
root:$1$dXmV8ZLO$eNAQzSYOgRkYMJRdsHwLS1:19664::::::
daemon:*:::::::
bin:*:::::::
sys:*:::::::
sync:*:::::::
mail:*:::::::
www-data:*:::::::
operator:*:::::::
nobody:*:::::::

View File

@@ -1 +0,0 @@
root:0:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:EF8BDD6C516032CDB7C15080FFE1B2D5:[U ]:LCT-5FEF3549:

View File

@@ -1,116 +0,0 @@
# $OpenBSD: sshd_config,v 1.104 2021/07/02 05:11:21 dtucker Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/bin:/sbin:/usr/bin:/usr/sbin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
# Change to no to disable s/key passwords
#KbdInteractiveAuthentication yes
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the KbdInteractiveAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via KbdInteractiveAuthentication may bypass
# the setting of "PermitRootLogin prohibit-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and KbdInteractiveAuthentication to 'no'.
#UsePAM no
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# override default of no subsystems
Subsystem sftp /usr/libexec/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server

View File

@@ -1,2 +0,0 @@
./custom.tar.gz
./*.tar.gz

File diff suppressed because it is too large Load Diff

View File

@@ -1,99 +0,0 @@
From 94a0b2232c729c757547b88f2cbc035cef7e0bc1 Mon Sep 17 00:00:00 2001
From: luckfox-eng29 <eng29@luckfox.com>
Date: Tue, 8 Oct 2024 21:50:54 +0800
Subject: [PATCH] patch:logo_center
Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
---
.../source/kernel/drivers/video/fbdev/core/fbcon.c | 14 +++++++++++++-
.../source/kernel/drivers/video/fbdev/core/fbmem.c | 7 ++++++-
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/sysdrv/source/kernel/drivers/video/fbdev/core/fbcon.c b/sysdrv/source/kernel/drivers/video/fbdev/core/fbcon.c
index 27828435d..c3ac676bb 100644
--- a/sysdrv/source/kernel/drivers/video/fbdev/core/fbcon.c
+++ b/sysdrv/source/kernel/drivers/video/fbdev/core/fbcon.c
@@ -88,6 +88,9 @@
# define DPRINTK(fmt, args...)
#endif
+#define CURSOR_ENABLE 0
+#define SHOW_CENTER 1
+
/*
* FIXME: Locking
*
@@ -365,6 +368,7 @@ static int get_color(struct vc_data *vc, struct fb_info *info,
static void fb_flashcursor(struct work_struct *work)
{
+#if CURSOR_ENABLE
struct fb_info *info = container_of(work, struct fb_info, queue);
struct fbcon_ops *ops = info->fbcon_par;
struct vc_data *vc = NULL;
@@ -395,6 +399,7 @@ static void fb_flashcursor(struct work_struct *work)
ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
get_color(vc, info, c, 0));
console_unlock();
+#endif
}
static void cursor_timer_handler(struct timer_list *t)
@@ -601,7 +606,12 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
if (fb_get_color_depth(&info->var, &info->fix) == 1)
erase &= ~0x400;
logo_height = fb_prepare_logo(info, ops->rotate);
- logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);
+
+#if SHOW_CENTER
+ logo_height += (info->var.yres/2) - (logo_height/2);
+#endif
+
+ logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);
q = (unsigned short *) (vc->vc_origin +
vc->vc_size_row * rows);
step = logo_lines * cols;
@@ -1331,6 +1341,7 @@ static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
static void fbcon_cursor(struct vc_data *vc, int mode)
{
+#if CURSOR_ENABLE
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
struct fbcon_ops *ops = info->fbcon_par;
int c = scr_readw((u16 *) vc->vc_pos);
@@ -1352,6 +1363,7 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
get_color(vc, info, c, 0));
+#endif
}
static int scrollback_phys_max = 0;
diff --git a/sysdrv/source/kernel/drivers/video/fbdev/core/fbmem.c b/sysdrv/source/kernel/drivers/video/fbdev/core/fbmem.c
index d787a344b..690d48fba 100644
--- a/sysdrv/source/kernel/drivers/video/fbdev/core/fbmem.c
+++ b/sysdrv/source/kernel/drivers/video/fbdev/core/fbmem.c
@@ -38,7 +38,7 @@
#include <asm/fb.h>
-
+#define SHOW_CENTER 1
/*
* Frame buffer device initialization and setup routines
*/
@@ -520,6 +520,11 @@ static int fb_show_logo_line(struct fb_info *info, int rotate,
image.dy = y;
}
+#if SHOW_CENTER
+image.dx = (info->var.xres - logo->width) / 2;
+image.dy = (info->var.yres - logo->height) / 2;
+#endif
+
image.width = logo->width;
image.height = logo->height;
--
2.34.1

File diff suppressed because it is too large Load Diff

View File

@@ -1,20 +0,0 @@
#!/bin/sh
load_luckfoxconfig() {
if [ -f /usr/bin/luckfox-config ]; then
luckfox-config load
fi
if [ "$(cat /proc/device-tree/model)" == "Luckfox Pico Ultra" ] ||
[ "$(cat /proc/device-tree/model)" == "Luckfox Pico Ultra W" ]; then
luckfox_switch_rgb_resolution &
fi
}
case $1 in
start)
load_luckfoxconfig
;;
*)
exit 1
;;
esac

View File

@@ -1,206 +0,0 @@
#!/bin/bash
LUCKFOX_FDT_DTB=/tmp/.fdt.dtb
LUCKFOX_FDT_HDR_DTB=/tmp/.fdt_header.dtb
LUCKFOX_FDT_HDR_OVERLAY_DTS=/tmp/.fdt_header_overlay.dts
LUCKFOX_FDT_HDR_OVERLAY_DTBO=/tmp/.fdt_header_overlay.dtbo
LUCKFOX_FDT_DUMP_TXT=/tmp/.fdt_dump.txt
LF_CUSTOM_DTS_PATH="/mnt/cfg"
SYS_OVERLAYS_PATH="/sys/kernel/config/device-tree/overlays"
LUCKFOX_CHIP_MEDIA_CLASS="emmc"
LUCKFOX_CHIP_MEDIA="/dev/mmcblk0p4"
function luckfox_tools_check() {
if ! command -v dialog &>/dev/null; then
echo "The dialog is not installed "
exit
fi
if ! command -v dtc &>/dev/null; then
echo "The dtc is not installed"
exit
fi
# get media class dev
if [[ -e /dev/mmcblk0p4 ]]; then
LUCKFOX_CHIP_MEDIA_CLASS="emmc"
LUCKFOX_CHIP_MEDIA=/dev/mmcblk0p4
elif [[ -e /dev/mmcblk1p4 ]]; then
LUCKFOX_CHIP_MEDIA_CLASS="sdmmc"
LUCKFOX_CHIP_MEDIA=/dev/mmcblk1p4
luckfox_set_pin_parameter "SDMMC" 1
elif [[ -e /dev/mtdblock3 ]]; then
LUCKFOX_CHIP_MEDIA_CLASS="spi_nand"
LUCKFOX_CHIP_MEDIA=/dev/mtdblock3
else
LUCKFOX_CHIP_MEDIA_CLASS="unknown"
echo "Do not know the storage medium of Luckfox!"
exit
fi
}
# -- Static Overlay --
function luckfox_sha256_convert() {
local sha256_hash=$1
local formatted_hash=""
for ((i = 0; i < ${#sha256_hash}; i += 8)); do
formatted_hash+="0x${sha256_hash:$i:8} "
done
echo "$formatted_hash"
}
function luckfox_update_fdt() {
# get fdt_header
local origin_fdt_size_hex origin_fdt_size
dd if=$LUCKFOX_CHIP_MEDIA of=$LUCKFOX_FDT_HDR_DTB bs=1 skip=0 count=2048 >/dev/null 2>&1
# get size
if [ ! -f $LUCKFOX_FDT_HDR_DTB ]; then
echo "$LUCKFOX_FDT_HDR_DTB can't be found!"
return
fi
origin_fdt_size_hex=$(fdtdump $LUCKFOX_FDT_HDR_DTB | grep -A 5 "fdt {" | grep "data-size" | awk '{print $3}' | tr -d ';<>')
origin_fdt_size=$(printf "%d\n" "$origin_fdt_size_hex")
# get fdt dtb
dd if=$LUCKFOX_CHIP_MEDIA of=$LUCKFOX_FDT_DTB bs=1 skip=2048 count="$origin_fdt_size" >/dev/null 2>&1
# create fdt dump
if [ ! -f $LUCKFOX_FDT_DTB ]; then
echo "$LUCKFOX_FDT_DTB can't be found!"
return
fi
fdtdump $LUCKFOX_FDT_DTB >$LUCKFOX_FDT_DUMP_TXT
}
function luckfox_fdt_overlay() {
#region
local fdt_overlay_dtbo="$1"
local fdt_dtb_size fdt_size fdt_size_hex fdt_hash_data
fdtoverlay -i $LUCKFOX_FDT_DTB -o $LUCKFOX_FDT_DTB "$fdt_overlay_dtbo" >/dev/null 2>&1
fdt_dtb_size=$(ls -la $LUCKFOX_FDT_DTB | awk '{print $5}')
kernel_offset=$(fdtdump $LUCKFOX_FDT_HDR_DTB | grep -A 2 "kernel {" | grep "data-position" | sed -n 's/.*<\(0x[0-9a-fA-F]*\)>.*/\1/p')
fdt_offset=$(fdtdump $LUCKFOX_FDT_HDR_DTB | grep -A 2 "fdt {" | grep "data-position" | sed -n 's/.*<\(0x[0-9a-fA-F]*\)>.*/\1/p')
kernel_offset_dec=$((kernel_offset))
fdt_offset_dec=$((fdt_offset))
result_dec=$((kernel_offset_dec - fdt_offset_dec))
if [ $result_dec -lt "$fdt_dtb_size" ]; then
echo "Kernel will be affected !"
fi
dd if=$LUCKFOX_FDT_DTB of=$LUCKFOX_CHIP_MEDIA bs=1 seek=2048 count="$fdt_dtb_size" >/dev/null 2>&1
# fdt header
if [ ! -f $LUCKFOX_FDT_DTB ]; then
echo "$LUCKFOX_FDT_DTB can't be found!"
return
fi
fdt_size=$(ls -la $LUCKFOX_FDT_DTB | awk '{print $5}')
fdt_size_hex=$(printf "%x\n" "$fdt_size")
fdt_hash_data=$(luckfox_sha256_convert "$(sha256sum $LUCKFOX_FDT_DTB | awk '{print $1}')")
fdt_header_content="
/dts-v1/;
/plugin/;
&{/images/fdt}{
data-size=<0x$fdt_size_hex>;
hash{
value=<$fdt_hash_data>;
};
};
"
echo "$fdt_header_content" >$LUCKFOX_FDT_HDR_OVERLAY_DTS
dtc -I dts -O dtb $LUCKFOX_FDT_HDR_OVERLAY_DTS -o $LUCKFOX_FDT_HDR_OVERLAY_DTBO
if [ ! -f $LUCKFOX_FDT_HDR_OVERLAY_DTBO ]; then
echo "$LUCKFOX_FDT_HDR_OVERLAY_DTBO can't found!"
return
fi
fdtoverlay -i $LUCKFOX_FDT_HDR_DTB -o $LUCKFOX_FDT_HDR_DTB $LUCKFOX_FDT_HDR_OVERLAY_DTBO >/dev/null 2>&1
dd if=$LUCKFOX_FDT_HDR_DTB of=$LUCKFOX_CHIP_MEDIA bs=1 seek=0 count=2048 >/dev/null 2>&1
#endregion
}
# Load the device tree dynamically
function luckfox_load_dynamic_dts() {
local dtbo_node_name
if [ ! -d ${LF_CUSTOM_DTS_PATH}/dtbo/ ]; then
exit 1
#echo "Can't find ${LF_CUSTOM_DTS_PATH}/dtbo dir !"
fi
for dts_file in ${LF_CUSTOM_DTS_PATH}/dtbo/*.dts; do
#Get DTBO name
dtbo_node_name="$(basename "$dts_file" .dts)"
#Check DTBO path
if [ -d "${SYS_OVERLAYS_PATH}/${dtbo_node_name}" ]; then
echo "Node is exist"
continue
fi
#DTS->DTBO
dtc -I dts -O dtb ${LF_CUSTOM_DTS_PATH}/dtbo/${dtbo_node_name}.dts -o \
${LF_CUSTOM_DTS_PATH}/dtbo/${dtbo_node_name}.dtbo
if [ ! -f "${LF_CUSTOM_DTS_PATH}/dtbo/${dtbo_node_name}.dtbo" ]; then
echo "${dtbo_node_name}.dts to dtbo error!"
continue
else
mkdir -p ${SYS_OVERLAYS_PATH}/${dtbo_node_name}
fi
#Load and enable DTBO
cat ${LF_CUSTOM_DTS_PATH}/dtbo/${dtbo_node_name}.dtbo > \
${SYS_OVERLAYS_PATH}/${dtbo_node_name}/dtbo
echo 1 >${SYS_OVERLAYS_PATH}/${dtbo_node_name}/status
rm ${LLF_CUSTOM_DTS_PATH}/dtbo/${dtbo_node_name}.dtbo
done
}
#Overwrite the disk device tree (requires restart)
function luckfox_load_static_dts() {
local dtbo_node_name
if [ ! -d ${LF_CUSTOM_DTS_PATH}/fdt_overlay/ ]; then
echo "Can't find ${LF_CUSTOM_DTS_PATH}/fdt_overlay dir!"
fi
for dts_file in ${LF_CUSTOM_DTS_PATH}/fdt_overlay/*.dts; do
#Get DTBO name
dtbo_node_name="$(basename "$dts_file" .dts)"
#DTS->DTBO
dtc -I dts -O dtb ${LF_CUSTOM_DTS_PATH}/fdt_overlay/${dtbo_node_name}.dts -o \
${LF_CUSTOM_DTS_PATH}/fdt_overlay/${dtbo_node_name}.dtbo
if [ ! -f "${LF_CUSTOM_DTS_PATH}/fdt_overlay/${dtbo_node_name}.dtbo" ]; then
echo "${dtbo_node_name}.dts to dtbo error!"
continue
fi
# load to disk
luckfox_update_fdt
luckfox_fdt_overlay ${LF_CUSTOM_DTS_PATH}/fdt_overlay/${dtbo_node_name}.dtbo
rm ${LUCKFOX_FDT_OVERLAY_DTBO}
done
}
case $1 in
start)
luckfox_load_dynamic_dts
;;
stop)
luckfox_tools_check
luckfox_load_static_dts
;;
*)
exit 1
;;
esac

File diff suppressed because it is too large Load Diff

View File

@@ -1,69 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <sys/ioctl.h>
#include <dirent.h>
#define INPUT_DIR "/dev/input"
#define EVENT_PREFIX "event"
void check_adc_keys_event(const char *device_path) {
int fd;
char name[256] = "Unknown";
struct input_event ev;
fd = open(device_path, O_RDONLY);
if (fd < 0) {
perror("Unable to open device");
return;
}
if (ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) {
perror("Unable to get device name");
close(fd);
return;
}
if (strstr(name, "adc-keys") != NULL) {
printf("Found ADC keys device: %s\n", device_path);
while (read(fd, &ev, sizeof(struct input_event)) > 0) {
if (ev.type == EV_KEY) {
if (ev.value == 0) {
printf("Key released: code %d\n", ev.code);
system("luckfox-config rgb_switch");
system("reboot");
}
}
}
}
close(fd);
}
int main() {
struct dirent *entry;
DIR *dp;
dp = opendir(INPUT_DIR);
if (dp == NULL) {
perror("Unable to open /dev/input directory");
return EXIT_FAILURE;
}
while ((entry = readdir(dp))) {
if (strncmp(entry->d_name, EVENT_PREFIX, strlen(EVENT_PREFIX)) == 0) {
char device_path[256];
snprintf(device_path, sizeof(device_path), "%s/%s", INPUT_DIR, entry->d_name);
check_adc_keys_event(device_path);
}
}
closedir(dp);
return EXIT_SUCCESS;
}

View File

@@ -1,9 +0,0 @@
#!/bin/bash
/usr/bin/filesystem_resize.sh
/etc/init.d/S50usbdevice start
luckfox-config load
if [ -n "$(hwclock | grep "invalid")" ]; then
date -s 2024-01-01
hwclock -w
fi

View File

@@ -1 +0,0 @@
libfdt.so.1.7.0

View File

@@ -1,172 +0,0 @@
From 816477167f7fec38674690a576a9f17100707441 Mon Sep 17 00:00:00 2001
From: luckfox-eng29 <eng29@luckfox.com>
Date: Wed, 21 Aug 2024 14:35:48 +0800
Subject: [PATCH] uboot compatible luckfox
---
.../arm/include/asm/arch-rockchip/boot_mode.h | 2 ++
.../u-boot/arch/arm/mach-rockchip/boot_mode.c | 19 +++++++++++++++----
sysdrv/source/uboot/u-boot/common/autoboot.c | 3 ++-
sysdrv/source/uboot/u-boot/common/image-fit.c | 14 +++++++++++---
sysdrv/source/uboot/u-boot/drivers/mmc/mmc.c | 5 +++++
.../source/uboot/u-boot/include/boot_rkimg.h | 3 ++-
6 files changed, 37 insertions(+), 9 deletions(-)
diff --git a/sysdrv/source/uboot/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h b/sysdrv/source/uboot/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h
index 063fd6b47..a34ec828f 100644
--- a/sysdrv/source/uboot/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h
+++ b/sysdrv/source/uboot/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h
@@ -28,6 +28,8 @@
/* enter bootrom download mode */
#define BOOT_BROM_DOWNLOAD 0xEF08A53C
+#define BOOT_TO_UBOOT (REBOOT_FLAG + 16)
+
#ifndef __ASSEMBLY__
int setup_boot_mode(void);
#endif
diff --git a/sysdrv/source/uboot/u-boot/arch/arm/mach-rockchip/boot_mode.c b/sysdrv/source/uboot/u-boot/arch/arm/mach-rockchip/boot_mode.c
index 6f4858bba..cd8b65f25 100644
--- a/sysdrv/source/uboot/u-boot/arch/arm/mach-rockchip/boot_mode.c
+++ b/sysdrv/source/uboot/u-boot/arch/arm/mach-rockchip/boot_mode.c
@@ -194,7 +194,7 @@ int rockchip_get_boot_mode(void)
boot_mode[PL] = BOOT_MODE_CHARGING;
clear_boot_reg = 1;
break;
- case BOOT_PANIC:
+ case BOOT_PANIC:
printf("boot mode: panic\n");
boot_mode[PL] = BOOT_MODE_PANIC;
break;
@@ -203,9 +203,14 @@ int rockchip_get_boot_mode(void)
boot_mode[PL] = BOOT_MODE_WATCHDOG;
break;
case BOOT_QUIESCENT:
- printf("boot mode: quiescent\n");
- boot_mode[PL] = BOOT_MODE_QUIESCENT;
- break;
+ printf("boot mode: quiescent\n");
+ boot_mode[PL] = BOOT_MODE_QUIESCENT;
+ break;
+ case BOOT_TO_UBOOT:
+ printf("boot mode: uboot\n");
+ boot_mode[PL] = BOOT_MODE_UBOOT_TERMINAL;
+ clear_boot_reg = 1;
+ break;
default:
printf("boot mode: None\n");
boot_mode[PL] = BOOT_MODE_UNDEFINE;
@@ -231,6 +236,8 @@ int setup_boot_mode(void)
{
char env_preboot[256] = {0};
+ env_set("cli", NULL); /* removed by default */
+
switch (rockchip_get_boot_mode()) {
case BOOT_MODE_BOOTLOADER:
printf("enter fastboot!\n");
@@ -263,6 +270,10 @@ int setup_boot_mode(void)
printf("enter charging!\n");
env_set("preboot", "setenv preboot; charge");
break;
+ case BOOT_MODE_UBOOT_TERMINAL:
+ printf("enter uboot!\n");
+ env_set("cli", "yes");
+ break;
}
return 0;
diff --git a/sysdrv/source/uboot/u-boot/common/autoboot.c b/sysdrv/source/uboot/u-boot/common/autoboot.c
index c64d566d1..9cf947b98 100644
--- a/sysdrv/source/uboot/u-boot/common/autoboot.c
+++ b/sysdrv/source/uboot/u-boot/common/autoboot.c
@@ -220,7 +220,8 @@ static int __abortboot(int bootdelay)
#endif
#ifdef CONFIG_ARCH_ROCKCHIP
- if (!IS_ENABLED(CONFIG_CONSOLE_DISABLE_CLI) && ctrlc()) { /* we press ctrl+c ? */
+// if (!IS_ENABLED(CONFIG_CONSOLE_DISABLE_CLI) && ctrlc()) { /* we press ctrl+c ? */
+ if ((!IS_ENABLED(CONFIG_CONSOLE_DISABLE_CLI) && ctrlc()) || env_get("cli")) { /* we press ctrl+c ? */
#else
/*
* Check if key already pressed
diff --git a/sysdrv/source/uboot/u-boot/common/image-fit.c b/sysdrv/source/uboot/u-boot/common/image-fit.c
index 0ee9eab69..632551b88 100644
--- a/sysdrv/source/uboot/u-boot/common/image-fit.c
+++ b/sysdrv/source/uboot/u-boot/common/image-fit.c
@@ -32,6 +32,7 @@ DECLARE_GLOBAL_DATA_PTR;
#include <u-boot/sha1.h>
#include <u-boot/sha256.h>
+#define FDT_DEFAULT_LOAD_ADDR 0x00c00000
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
@@ -2140,7 +2141,13 @@ int fit_image_load_index(bootm_headers_t *images, ulong addr,
ret = fit_image_select(fit, noffset, images->verify);
if (ret) {
bootstage_error(bootstage_id + BOOTSTAGE_SUB_HASH);
- return ret;
+ /* Use the memory fdt directly */
+ printf(" Use the memory fdt directly\n");
+ *datap = FDT_DEFAULT_LOAD_ADDR;
+ fit_image_get_data_size(fit, noffset, (int *)&size);
+ *lenp = (ulong)size;
+ return noffset;
+ //return ret;
}
bootstage_mark(bootstage_id + BOOTSTAGE_SUB_CHECK_ARCH);
@@ -2175,7 +2182,6 @@ int fit_image_load_index(bootm_headers_t *images, ulong addr,
fit_image_check_os(fit, noffset, IH_OS_ARM_TRUSTED_FIRMWARE) ||
fit_image_check_os(fit, noffset, IH_OS_OP_TEE) ||
fit_image_check_os(fit, noffset, IH_OS_U_BOOT) ||
- fit_image_check_os(fit, noffset, IH_OS_QNX) ||
fit_image_check_os(fit, noffset, IH_OS_OPENRTOS);
/*
@@ -2261,8 +2267,10 @@ int fit_image_load_index(bootm_headers_t *images, ulong addr,
return -EXDEV;
}
+ //printf(" Loading %s from 0x%08lx to 0x%08lx\n",
+ // prop_name, data, load);
printf(" Loading %s from 0x%08lx to 0x%08lx\n",
- prop_name, data, load);
+ prop_name, image_start, load);
dst = map_sysmem(load, len);
memmove(dst, buf, len);
diff --git a/sysdrv/source/uboot/u-boot/drivers/mmc/mmc.c b/sysdrv/source/uboot/u-boot/drivers/mmc/mmc.c
index 59805d33a..d352b00a3 100644
--- a/sysdrv/source/uboot/u-boot/drivers/mmc/mmc.c
+++ b/sysdrv/source/uboot/u-boot/drivers/mmc/mmc.c
@@ -2288,6 +2288,11 @@ int mmc_start_init(struct mmc *mmc)
/* Test for SD version 2 */
err = mmc_send_if_cond(mmc);
+ if (err) {
+ mmc_go_idle(mmc);
+ mmc_get_blk_desc(mmc)->hwpart = 0;
+ mmc_send_if_cond(mmc);
+ }
/* Now try to get the SD card's operating condition */
err = sd_send_op_cond(mmc);
diff --git a/sysdrv/source/uboot/u-boot/include/boot_rkimg.h b/sysdrv/source/uboot/u-boot/include/boot_rkimg.h
index 9cb709703..fc8356704 100644
--- a/sysdrv/source/uboot/u-boot/include/boot_rkimg.h
+++ b/sysdrv/source/uboot/u-boot/include/boot_rkimg.h
@@ -20,7 +20,8 @@ enum _boot_mode {
BOOT_MODE_WATCHDOG,
BOOT_MODE_DFU,
BOOT_MODE_QUIESCENT,
- BOOT_MODE_UNDEFINE,
+ BOOT_MODE_UBOOT_TERMINAL,
+ BOOT_MODE_UNDEFINE,
};
struct bootloader_message {
--
2.34.1

View File

@@ -1,622 +0,0 @@
From 8a7f8dcc33ffb580540df5e1dd02b3d3572cb6ee Mon Sep 17 00:00:00 2001
From: luckfox-eng29 <eng29@luckfox.com>
Date: Wed, 25 Sep 2024 18:49:11 +0800
Subject: [PATCH] patch for 115200 bin
Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
---
...rv1106_ddr_924MHz_1500000Baud_tb_v1.15.bin | Bin 0 -> 22632 bytes
.../rv1106_ddr_924MHz_1500000Baud_v1.15.bin | Bin 0 -> 22632 bytes
.../bin/rv11/rv1106_ddr_924MHz_tb_v1.15.bin | Bin 22632 -> 22632 bytes
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 sysdrv/source/uboot/rkbin/bin/rv11/rv1106_ddr_924MHz_1500000Baud_tb_v1.15.bin
create mode 100644 sysdrv/source/uboot/rkbin/bin/rv11/rv1106_ddr_924MHz_1500000Baud_v1.15.bin
diff --git a/sysdrv/source/uboot/rkbin/bin/rv11/rv1106_ddr_924MHz_1500000Baud_tb_v1.15.bin b/sysdrv/source/uboot/rkbin/bin/rv11/rv1106_ddr_924MHz_1500000Baud_tb_v1.15.bin
new file mode 100644
index 0000000000000000000000000000000000000000..95767c2f7a73114dae8356f9ebbca6a10689ecee
GIT binary patch
literal 22632
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
literal 0
HcmV?d00001
diff --git a/sysdrv/source/uboot/rkbin/bin/rv11/rv1106_ddr_924MHz_1500000Baud_v1.15.bin b/sysdrv/source/uboot/rkbin/bin/rv11/rv1106_ddr_924MHz_1500000Baud_v1.15.bin
new file mode 100644
index 0000000000000000000000000000000000000000..95767c2f7a73114dae8356f9ebbca6a10689ecee
GIT binary patch
literal 22632
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
literal 0
HcmV?d00001
diff --git a/sysdrv/source/uboot/rkbin/bin/rv11/rv1106_ddr_924MHz_tb_v1.15.bin b/sysdrv/source/uboot/rkbin/bin/rv11/rv1106_ddr_924MHz_tb_v1.15.bin
index 95767c2f7a73114dae8356f9ebbca6a10689ecee..561ee68249c2d41d8d300baad7d0aff8b2728ee2 100644
GIT binary patch
delta 18
acmaE{f$_x##tkN}%nXMZH=DZ}3IhO3qXv}#
delta 18
acmaE{f$_x##tkN}%n6UhHk-Q|3IhO82nQ<w
--
2.34.1

View File

@@ -1,17 +0,0 @@
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2022 Rockchip Electronics Co., Ltd.
*/
#include "rv1106-thunder-boot.dtsi"
/ {
thunder_boot_mmc: thunder-boot-mmc {
compatible = "rockchip,thunder-boot-mmc";
reg = <0xffaa0000 0x4000>;
clocks = <&cru HCLK_SDMMC>, <&cru CCLK_SRC_SDMMC>;
clock-names = "biu", "ciu";
memory-region-src = <&ramdisk_c>;
memory-region-dst = <&ramdisk_r>;
};
};