您尚未登录。

#1 Re: 工业芯 匠芯创 » d133的rtp如何配置? » 2025-04-18 11:23:01

tkez 说:

最近在研究D13X如何使用电阻屏,您能不能详细指导一下呢?已知的资料太少了。我也遇到很多问题,校准屏幕时触摸没反应,感觉不是硬件的问题。

没原来的编译环境了,手头也没d133板子了。只有当时在论坛留下的这点记录了。如果校准例程能正常运行的话,那么lvgl程序里的rtp部分,就按校准程序修改。

#2 Re: 工业芯 匠芯创 » Luban_Lite适配电阻屏遇到很多问题 » 2025-04-18 10:26:16

我记得lvgl下的例程,有ctp处理部分,当时按找这个文件复制出来,修改为rtp处理部分。官方的校准例子,那个好像只是ctp的。

#3 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » ml307a csdk,串口打印数和预想的不一样。 » 2025-04-07 14:32:03

volatile uint32_t sampleIndex = 0;
volatile uint64_t currentAdd = 0;

sampleIndex是uint32_t类型,currentAdd是uint64_t类型,改成都是uint32_t类型,正常了。不过没搞懂出问题的原因...

volatile uint32_t sampleIndex = 0;
volatile uint32_t currentAdd = 0;

#4 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 拆了娃的故事机,发现电路板上元件不多啊。 » 2025-04-06 06:43:11

Gentlepig
回复: 5

47C5FE4E-96F7-4D7E-ACCC-CA4F5350D04E.jpeg79E648E9-AE6B-494D-9F8B-967CD8D0B023.jpeg
娃用micro usb头把mini usb座怼坏了。打算拆开换一个。
主电路板貌似是单面板,主要元件应该是单片机和band flash.64脚的单片机,这不会是stm32吧?不过故事机有个魔音功能,需要单片机带录音功能吧。

#5 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » ML307A的https库使用问题。 » 2025-03-28 17:06:09

联系到了一家代理的技术支持,告知这个问题。给了1.5.0的sdk,之前用的是1.4.6版本的。
使用该版本sdk,可正常进行https连接,用的是ssl无身份验证方式,可以成功,没试单向或双向证书验证。

另有两个问题记录下。
设置https的header,有cm_httpclient_specific_header_set()和cm_httpclient_custom_header_set()两个函数,不知道有啥区别,最后用了specific这个函数。想多次调用这个函数设置多个header项,发现只有最后一个能成功,后来才明白,需要一次性设置。header字符串里每个子项之间用\r\n间隔。
这个在文档里没有写明。

上电后参考例程里,等待网络通讯正常且同步ntp日期后,才进行https发送。结果第一次https发送有几率返回650,在第一https发送前加了5秒延时后问题解决。

#6 NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » ML307A的https库使用问题。 » 2025-03-24 09:37:59

Gentlepig
回复: 3
/**
 * @brief 创建客户端实例
 *
 * @param [in] url              服务器地址(服务器地址url需要填写完整,例如(服务器url仅为格式示例)"https://39.106.55.200:80")
 * @param [in] callback         客户端相关回调函数(使用cm_httpclient_sync_request()同步接口可忽略该参数,传NULL即可)
 * @param [out] handle          实例句柄
 *
 * @return 0 成功/其他 失败(见cm_httpclient_ret_code_e)
 *
 * @details 创建客户端实例
 */
cm_httpclient_ret_code_e cm_httpclient_create(const uint8_t *url, cm_httpclient_event_callback_func callback, cm_httpclient_handle_t *handle);

例程是用这个函数连接百度网站,是https get。

ret = cm_httpclient_create((const uint8_t *)"https://www.baidu.com", __cm_httpclient_callback, &client);          //创建客户端实例
cm_httpclient_sync_param_t param = {HTTPCLIENT_REQUEST_GET, (const uint8_t *)"/", 0, NULL};          //GET方法,必须设置请求路径
ret = cm_httpclient_sync_request(client, param, &response);                         //发送请求,同步接口

且设置了ssl验证方法为单向验证,且设置了证书。可以成功get百度。
试过改成ssl验证方式为无身份验证,也可以成功get百度。

但是,我换成其他https网站,比如https:www.bing.com,或者其他,大都是无法成功https get的,直接返回个650错误。无论我设置无身份验证还是设单项验证+设置证书。
如果改为http get,则大都能收到返回,比如400.
这是为什么呢?按说这个作为4g模组,比如客户纯当at模组来用,应该能实现https连接吧。

看例程里有阿里云相关,看了下,没直接用这套cm_httpclient_create,而是直接用的lwip里的tcp相关。

#7 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » ml307a csdk,串口打印数和预想的不一样。 » 2025-03-19 13:02:45

void uartPrintf(char *str, ...)
{
    static char s[600];        //这个需要根据实际情况修改
    va_list args;
    int len;
    if ((str == NULL) || (strlen(str) == 0))
        return;
    va_start(args, str);
    len = vsnprintf((char*)s, 600, str, args);
    va_end(args);
    cm_uart_write(OPENCPU_MAIN_UART, s, len, 1000);
}

这是参照例程写的uartPrintf函数。

#8 NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » ml307a csdk,串口打印数和预想的不一样。 » 2025-03-19 08:55:21

Gentlepig
回复: 2

搜了下,好像用的是freertos。
在我自己建的一个任务里调用这个函数,每调用一次,sampleIndex自加一。结果用uartPrintf()打印currentAdd和sampleIndex和预想的不一样。
currentAdd和sampleIndex,都声明为全局变量。

    currentAdd += sampleIndex;      //暂时这样计数显示,需要改
    uartPrintf("sampleIndex:%d ", sampleIndex);
    uartPrintf("currentAdd:%d ", currentAdd);
    uartPrintf("sampleIndex:%d, currentAdd:%d ", sampleIndex, currentAdd);
    uartPrintf("sampleIndex:%d ", sampleIndex);
    uartPrintf("currentAdd:%d ", currentAdd);
    uartPrintf("currentAdd:%d, sampleIndex:%d \r\n", currentAdd, sampleIndex);
sampleIndex:0 currentAdd:0 sampleIndex:0, currentAdd:0 sampleIndex:0 currentAdd:0 currentAdd:0, sampleIndex:0 
sampleIndex:1 currentAdd:0 sampleIndex:1, currentAdd:1 sampleIndex:1 currentAdd:0 currentAdd:0, sampleIndex:1 
sampleIndex:2 currentAdd:0 sampleIndex:2, currentAdd:3 sampleIndex:2 currentAdd:0 currentAdd:0, sampleIndex:3 
sampleIndex:3 currentAdd:0 sampleIndex:3, currentAdd:6 sampleIndex:3 currentAdd:0 currentAdd:0, sampleIndex:6 
sampleIndex:4 currentAdd:0 sampleIndex:4, currentAdd:10 sampleIndex:4 currentAdd:0 currentAdd:0, sampleIndex:10 
sampleIndex:5 currentAdd:0 sampleIndex:5, currentAdd:15 sampleIndex:5 currentAdd:0 currentAdd:0, sampleIndex:15 
sampleIndex:6 currentAdd:0 sampleIndex:6, currentAdd:21 sampleIndex:6 currentAdd:0 currentAdd:0, sampleIndex:21 
sampleIndex:7 currentAdd:0 sampleIndex:7, currentAdd:28 sampleIndex:7 currentAdd:0 currentAdd:0, sampleIndex:28 

而且,多次打印,前后uartPrintf()打印的都不一样。

#9 Re: 8051/STC8/AT89C51/N76E003 » 请教,avr单片机例程,不明白这个先乘1000再除1000有什么作用。 » 2025-03-06 08:35:06

wheregone 说:

让我联想到 KEIL C51 常量的大坑

能细说下吗?虽然不怎么用51,但还是没准以后还会用到。

#10 Re: 工业芯 匠芯创 » D133EBS这个芯片性能如何?跟STM32哪款芯片对比呢? » 2025-03-03 08:32:33

主要是各种国产引脚兼容的stm32型号太多了,而且stm32价格也不贵了。

#11 Re: 工业芯 匠芯创 » 移植FlashDB的问题。 » 2025-03-03 08:31:17

本地仓库选项里有的,选中后编译就行了,应该算是官方给适配好了。

#12 Re: 工业芯 匠芯创 » D133EBS这个芯片性能如何?跟STM32哪款芯片对比呢? » 2025-02-28 10:48:12

玩这个芯片主要是为了刷屏,不刷屏的话,我还是愿意用stm32。

#13 Re: 工业芯 匠芯创 » 购买的新的D133EBS芯片如何烧录SDK? » 2025-02-28 10:46:46

芯片带usb口,是通过usb口烧录程序的,程序是存到外部flash里的。
所以画板子,需要留usb口,外部spi flash。
照着官方原理图删减吧。

#14 Re: 8051/STC8/AT89C51/N76E003 » 请教,avr单片机例程,不明白这个先乘1000再除1000有什么作用。 » 2025-02-25 08:29:18

海石生风 说:

他是为了保留括号,两种方法都可以。如同进门迈左脚还是右脚,没啥好讨论的。

感谢,不纠结了。

#15 8051/STC8/AT89C51/N76E003 » 请教,avr单片机例程,不明白这个先乘1000再除1000有什么作用。 » 2025-02-24 08:33:13

Gentlepig
回复: 7
	/*
	 * Find AVCC based on the fact that we know the bandgap voltage.
	 * To avoid excessive rounding we multiply 1024 by 1000 before dividing
	 * with the ADC result and then divide the result by 1000 afterwards.
	 * the final result is the supply voltage in millivolts.
	 */
	supply_voltage = ((BG_VOLTAGE * ((1024000) / bandgap)) / 1000);

例程是将VCC作为参考电压,采集内部1.1V电压的adc值,倒推Vcc电压值。
因为是10位adc,所以满量程是1024,BG_VOLTAG是内部1.1V电压值,是1100. bandgap是测量内部1.1电压得到的adc值。
好奇这里为什么先是1024放大1000倍,最后结果再除1000. 要是说为了避免丢掉四舍五入,但感觉结果还是会舍弃小数位的。
为何不直接这样?

supply_voltage = BG_VOLTAGE * 1024 / bandgap;

#16 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机外接pca8565,利用它的定时器功能,每10秒差大约2毫秒的误差? » 2025-02-20 13:09:32

memory 说:

应该是32k不准,用示波器或者逻辑分析仪接clkout测试一下

感谢,大概率是这个问题。clkout管脚没接出来,看了下手册,开漏输出,不加上拉测不出来。

#17 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机外接pca8565,利用它的定时器功能,每10秒差大约2毫秒的误差? » 2025-02-20 09:40:33

Gentlepig
回复: 2

单片机利用Pca8565的定时器功能,每10秒拉低单片机的外部中断引脚,单片机中断函数里利用串口发数。
发现每次比预想的10秒少2毫秒。
改成1秒定时器后的PC上串口收到的数据如下:

[09:36:19.831]收←◆AA BB CC 
[09:36:20.831]收←◆AA BB CC 
[09:36:21.831]收←◆AA BB CC 
[09:36:22.830]收←◆AA BB CC 
[09:36:23.831]收←◆AA BB CC 
[09:36:24.830]收←◆AA BB CC 
[09:36:25.830]收←◆AA BB CC 
[09:36:26.830]收←◆AA BB CC 
[09:36:27.830]收←◆AA BB CC 
[09:36:28.829]收←◆AA BB CC 
[09:36:29.830]收←◆AA BB CC 
[09:36:30.829]收←◆AA BB CC 
[09:36:31.829]收←◆AA BB CC 
[09:36:32.829]收←◆AA BB CC 
[09:36:33.829]收←◆AA BB CC 
[09:36:34.828]收←◆AA BB CC 
[09:36:35.828]收←◆AA BB CC 
[09:36:36.828]收←◆AA BB CC 
[09:36:37.828]收←◆AA BB CC 
[09:36:38.827]收←◆AA BB CC 
[09:36:39.828]收←◆AA BB CC 
[09:36:40.827]收←◆AA BB CC 
[09:36:41.827]收←◆AA BB CC 
[09:36:42.827]收←◆AA BB CC 
[09:36:43.827]收←◆AA BB CC 
[09:36:44.826]收←◆AA BB CC 
[09:36:45.827]收←◆AA BB CC 
[09:36:46.826]收←◆AA BB CC 
[09:36:47.826]收←◆AA BB CC 
[09:36:48.826]收←◆AA BB CC 
[09:36:49.826]收←◆AA BB CC 

#18 Re: 全志 SOC » t113s3在uboot里选中了disp2_sunxi,设备树选了个tft08006,我在驱动里加了个死循环,结果没停下来... » 2025-01-06 15:20:28

根据信息里的reloc pc,利用objdum -S u-boot,进行反汇编,查看报错行数,定位到是:

* disable irq type */
     1 static void spi_disable_irq(u32 bitmap, void __iomem *base_addr)
     2 {
     5     u32 reg_val = readl(base_addr + SPI_INT_CTL_REG);
     6 
     7     bitmap &= SPI_INTEN_MASK;
     8     reg_val &= ~bitmap;
     9     writel(reg_val, base_addr + SPI_INT_CTL_REG);
    10 }

该函数的第一行语句。尝试将base_addr打印出来,发现第一次和后边几次的数不一样。
往上找该函数的调用,在spi_xfer()里找到了。尝试打印sspi的bus, cs, base_addr等信息:

nt spi_xfer(struct spi_slave *slave, unsigned int bitlen,
     1         const void *dout, void *din, unsigned long flags)
     2 {
     3     struct sunxi_spi_slave *sspi = to_sunxi_slave(slave);
     4     unsigned int len = bitlen / 8;
     5     int timeout = 0xfffff;
     6     printf("bus:%X, cs:%X, bus:%X, base addr:%X\n", sspi->slave.bus, sspi->slave.cs, sspi->bus, sspi-
     7     void __iomem *base_addr = (void __iomem *)(unsigned long)sspi->base_addr;
     8 

结果发现除第一次打印外的,都正常,只是第一次打印的cs,bus数据莫名其妙。

partno erro : can't find partition bootloader                                                               
[00.521]bmp_name=bootlogo.bmp size 84870                                                                    
bus:EA000019, cs:EAFFFFFE, bus:E8FD9FFF, base addr:EB00007D                                                 
data abort                                                                                                  
pc : [<47f0bb36>]          lr : [<47f0baf9>]                                                                
reloc pc : [<43042b36>]    lr : [<43042af9>]                                                                
sp : 43e66cd8  ip : 00000000     fp : 47fb494c                                                              
r10: 00000000  r9 : 43ea8e70     r8 : 43e66d0c                                                              
r7 : 00000000  r6 : 43e66d08     r5 : 00000000  r4 : eb00007d                                               
r3 : 0000002a  r2 : 80000000     r1 : 43e66d09  r0 : 47fb493c                                               
Flags: nZcv  IRQs on  FIQs off  Mode SVC_32                                                                 
Code: bf142e00 f04f46aa f1b80a00 bf080f00 (69232500)                                                        
bus:1, cs:0, bus:1, base addr:4026000                                                                       
bus:1, cs:0, bus:1, base addr:4026000                                                                       
bus:1, cs:0, bus:1, base addr:4026000                                                                       
bus:1, cs:0, bus:1, base addr:4026000      

----------------------------------------------

在spi_xfer()函数开头,判断sspi->bus是不是1,不是1直接返回0.
结果全是bus:1, cs:0, bus:1, base addr:4026000,且会打印很久,uboot到最后屏幕也没有初始化,不过最后倒是能进到内核了。

#19 Re: 全志 SOC » 开源个 D1 / D1-H核心板 » 2025-01-06 15:14:23

陈哈哈 说:

D1-H和t113-i是pin to pin么,还有请教一下为啥DDR3 x16可以共用数据线,芯片是16位宽,要挂两颗DDR3不是应该用x8的DDR才对嘛。

好像是根据片选信号来一片一片读的,我也没搞清楚cs0,cs1的接法。

#20 Re: 全志 SOC » t113s3在uboot里选中了disp2_sunxi,设备树选了个tft08006,我在驱动里加了个死循环,结果没停下来... » 2025-01-06 10:12:28

群里有朋友给了uboot和spi文件,暂时还没来得及试。先放到这里记录下。
dts:

 	spi0_pins_a: spi0@0 {
		pins = "PC2", "PC4", "PC5"; /* clk, mosi, miso */
		function = "spi0";
		muxsel = <2>;
		drive-strength = <20>;
	};

	spi0_pins_b: spi0@1 {
/*		pins = "PC3", "PC7", "PC6"; */
		pins = "PC3"; 
		function = "spi0";
		muxsel = <2>;
		drive-strength = <20>;
		bias-pull-up;   /* cs, hold, wp should be pulled up */
	};

 &spi0 {
	clock-frequency = <100000000>;
	pinctrl-0 = <&spi0_pins_a &spi0_pins_b>;
	pinctrl-1 = <&spi0_pins_c>;
	pinctrl-names = "default", "sleep";
	/*spi-supply = <&reg_dcdc1>;*/
	spi_slave_mode = <0>;
	spi0_cs_number = <1>;
    spi0_cs_bitmap = <1>;
	status = "okay";

	eth1: dm9051@0 {
		compatible = "davicom,dm9051";
		spi-max-frequency=<80000000>;
		reg = <0x0>;
		spi-rx-bus-width = <0x01>;
		spi-tx-bus-width = <0x01>;

    	interrupt-parent = <&pio>;
		interrupts = <PC 7 IRQ_TYPE_EDGE_FALLING>;

        reset-gpios = <&pio PC 6 GPIO_ACTIVE_LOW>;

        local-mac-address = [ 00 60 6e 99 5a a5 ];

/*
		spi-cpol;
		spi-cpha;
*/
		status = "okay";

	};
};

spi-sunxi.c:

/*
 * drivers/spi/spi-sunxi.c
 *
 * Copyright (C) 2012 - 2016 Reuuimlla Limited
 * Pan Nan <pannan@reuuimllatech.com>
 *
 * SUNXI SPI Controller Driver
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * 2013.5.7 Mintow <duanmintao@allwinnertech.com>
 *    Adapt to support sun8i/sun9i of Allwinner.
 *
 * 2021-3-2 liuyu <liuyu@allwinnertech.com>
 *	1 : use the new kernel framework to transfer
 *	2 : support soft cs gpio
 *	3 : delet unused dts node : cs_bitmap
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/reset.h>
#include <linux/pinctrl/consumer.h>
#include <linux/spi/spi.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>
#include <linux/spi/spi_bitbang.h>
#include <asm/cacheflush.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/sched.h>
#include <linux/kthread.h>
#include <linux/signal.h>
#include <linux/dmaengine.h>
#include <linux/dma-mapping.h>
#include <linux/clk/sunxi.h>
#include <linux/regulator/consumer.h>
#include "spi-sunxi.h"
#include "spi-slave-protocol.h"

/* For debug */
#define SPI_ERR(fmt, arg...)	pr_warn("%s()%d - "fmt, __func__, __LINE__, ##arg)

static u32 debug_mask = 1;
#define dprintk(level_mask, fmt, arg...)				\
do {									\
	if (unlikely(debug_mask & level_mask))				\
		pr_warn("%s()%d - "fmt, __func__, __LINE__, ##arg);	\
} while (0)

#define SUNXI_SPI_OK   0
#define SUNXI_SPI_FAIL -1

#define XFER_TIMEOUT	5000

enum spi_mode_type {
	SINGLE_HALF_DUPLEX_RX,		/* single mode, half duplex read */
	SINGLE_HALF_DUPLEX_TX,		/* single mode, half duplex write */
	SINGLE_FULL_DUPLEX_RX_TX,	/* single mode, full duplex read and write */
	DUAL_HALF_DUPLEX_RX,		/* dual mode, half duplex read */
	DUAL_HALF_DUPLEX_TX,		/* dual mode, half duplex write */
	QUAD_HALF_DUPLEX_RX,		/* quad mode, half duplex read */
	QUAD_HALF_DUPLEX_TX,		/* quad mode, half duplex write */
	MODE_TYPE_NULL,
};

#if IS_ENABLED(CONFIG_DMA_ENGINE)

#define SPI_MAX_PAGES	100
enum spi_dma_dir {
	SPI_DMA_RWNULL,
	SPI_DMA_WDEV = DMA_TO_DEVICE,
	SPI_DMA_RDEV = DMA_FROM_DEVICE,
};

typedef struct {
	enum spi_dma_dir dir;
	struct dma_chan *chan;
	int nents;
	struct scatterlist sg[SPI_MAX_PAGES];
	struct page *pages[SPI_MAX_PAGES];
} spi_dma_info_t;

u64 sunxi_spi_dma_mask = DMA_BIT_MASK(32);

#endif

struct sunxi_spi {
	#define SPI_FREE   (1<<0)
	#define SPI_SUSPND (1<<1)
	#define SPI_BUSY   (1<<2)

#if IS_ENABLED(CONFIG_DMA_ENGINE)
	spi_dma_info_t dma_rx;
	spi_dma_info_t dma_tx;
#endif

	struct platform_device *pdev;
	struct spi_master *master;/* kzalloc */
	struct spi_device *spi;
	struct spi_dbi_config *dbi_config;
	struct sunxi_slave *slave;
	struct pinctrl		 *pctrl;

	struct clk *pclk;  /* PLL clock */
	struct clk *mclk;  /* spi module clock */
	struct clk *bus_clk; /*spi bus clock*/
	struct reset_control *reset; /*reset clock*/

	struct task_struct *task;

	struct completion done;  /* wakup another spi transfer */
	spinlock_t lock;

	char dev_name[48];
	enum spi_mode_type mode_type;
	void __iomem *base_addr; /* register */

	u32 base_addr_phy;
	u32 mode; /* 0: master mode, 1: slave mode */
	u32 irq; /* irq NO. */
	int busy;
	int result; /* 0: succeed -1:fail */
	int task_flag;
	int dbi_enabled;
	u32 sample_mode;
	u32 sample_delay;
};

int spi_get_dbi_config(const struct spi_device *spi, struct spi_dbi_config *dbi_config)
{
	struct sunxi_spi *sspi = spi->master->dev.driver_data;

	if (!sspi->dbi_enabled)
		return -EINVAL;

	memcpy(dbi_config, sspi->dbi_config, sizeof(struct spi_dbi_config));
	return 0;
}
EXPORT_SYMBOL_GPL(spi_get_dbi_config);

int spi_set_dbi_config(struct spi_device *spi, const struct spi_dbi_config *dbi_config)
{
	struct sunxi_spi *sspi = spi->master->dev.driver_data;

	if (!sspi->dbi_enabled)
		return -EINVAL;

	memcpy(sspi->dbi_config, dbi_config, sizeof(struct spi_dbi_config));
	return 0;
}
EXPORT_SYMBOL_GPL(spi_set_dbi_config);

void spi_dump_reg(struct sunxi_spi *sspi, u32 offset, u32 len)
{
	u32 i;
	u8 buf[64], cnt = 0;

	for (i = 0; i < len; i = i + REG_INTERVAL) {
		if (i%HEXADECIMAL == 0)
			cnt += sprintf(buf + cnt, "0x%08x: ",
					(u32)(sspi->base_addr_phy  + offset + i));

		cnt += sprintf(buf + cnt, "%08x ",
				readl(sspi->base_addr + offset + i));

		if (i%HEXADECIMAL == REG_CL) {
			pr_warn("%s\n", buf);
			cnt = 0;
		}
	}
}

void spi_dump_data(u8 *buf, u32 len)
{
	u32 i, cnt = 0;
	u8 *tmp;

	tmp = kzalloc(len, GFP_KERNEL);
	if (!tmp)
		return;

	for (i = 0; i < len; i++) {
		if (i%HEXADECIMAL == 0)
			cnt += sprintf(tmp + cnt, "0x%08x: ", i);

		cnt += sprintf(tmp + cnt, "%02x ", buf[i]);

		if ((i%HEXADECIMAL == REG_END) || (i == (len - 1))) {
			pr_warn("%s\n", tmp);
			cnt = 0;
		}
	}

	kfree(tmp);
}

static void dbi_disable_irq(u32 bitmap, void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_DBI_INT_REG);

	bitmap &= DBI_INT_STA_MASK;
	reg_val &= ~bitmap;
	writel(reg_val, base_addr + SPI_DBI_INT_REG);
}

static void dbi_enable_irq(u32 bitmap, void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_DBI_INT_REG);


	bitmap &= DBI_INT_STA_MASK;
	reg_val |= bitmap;
	writel(reg_val, base_addr + SPI_DBI_INT_REG);
}

static s32 set_dbi_timer_param(struct sunxi_spi *sspi, struct spi_device *spi)
{
	u32 timer_val = 0, pixel_cycle = 0;
	s32 ret = -1;
	void __iomem *base_addr = sspi->base_addr;

	if (!sspi || !base_addr)
		goto OUT;

	goto OUT; /*not use */

	if (sspi->dbi_config->dbi_te_en || !sspi->dbi_config->dbi_fps) {
		writel(0x0, base_addr + SPI_DBI_TIMER_REG);
		goto OUT;
	}

	if (sspi->dbi_config->dbi_interface == D2LI) {
		switch (sspi->dbi_config->dbi_format) {
		case DBI_RGB111:
			pixel_cycle = 8;
			break;
		case DBI_RGB444:
		case DBI_RGB565:
			pixel_cycle = 9;
			break;
		case DBI_RGB666:
			pixel_cycle = 10;
			break;
		case DBI_RGB888:
			pixel_cycle = 13;
			break;
		default:
			break;
		}
	} else {
		switch (sspi->dbi_config->dbi_format) {
		case DBI_RGB111:
			pixel_cycle = 8;
			break;
		case DBI_RGB444:
			pixel_cycle = 12;
			break;
		case DBI_RGB565:
			pixel_cycle = 16;
			break;
		case DBI_RGB666:
		case DBI_RGB888:
			pixel_cycle = 24;
			break;
		default:
			break;
		}
	}
	timer_val = spi->max_speed_hz / sspi->dbi_config->dbi_fps -
		    pixel_cycle * sspi->dbi_config->dbi_video_h * sspi->dbi_config->dbi_video_v;

	timer_val |= 0x80000000;
	writel(timer_val, base_addr + SPI_DBI_TIMER_REG);
	ret = 0;

OUT:
	return ret;
}

/* config dbi */
static void spi_config_dbi(struct sunxi_spi *sspi, struct spi_device *spi)
{
	u32 reg_val = 0;
	u32 reg_tmp = 0;
	u32 config = sspi->dbi_config->dbi_mode;
	void __iomem *base_addr = sspi->base_addr;

	/*1. command type */
	if (config & SPI_DBI_COMMAND_READ_) {
		reg_val |= DBI_CR_READ;
		reg_tmp = readl(base_addr + SPI_DBI_CR_REG1);
		writel(reg_tmp | sspi->dbi_config->dbi_read_bytes,
			base_addr + SPI_DBI_CR_REG1);
	} else
		reg_val &= ~DBI_CR_READ;

	/*3. output data sequence */
	if (config & SPI_DBI_LSB_FIRST_)
		reg_val |= DBI_CR_LSB_FIRST;
	else
		reg_val &= ~DBI_CR_LSB_FIRST;

	/*4. transmit data type */
	if (config & SPI_DBI_TRANSMIT_VIDEO_) {
		reg_val |= DBI_CR_TRANSMIT_MODE;
		writel((sspi->dbi_config->dbi_video_v << 16)|(sspi->dbi_config->dbi_video_h),
			base_addr + SPI_DBI_VIDEO_SIZE);
		if (sspi->dbi_config->dbi_te_en)
			dbi_enable_irq(DBI_TE_INT_EN, base_addr);
		else
			dbi_enable_irq(DBI_FRAM_DONE_INT_EN, base_addr);
	} else {
		reg_val &= ~DBI_CR_TRANSMIT_MODE;

		writel(0x0, base_addr + SPI_DBI_VIDEO_SIZE);
		dbi_disable_irq(DBI_FRAM_DONE_INT_EN | DBI_TE_INT_EN, base_addr);
		dbi_enable_irq(DBI_FIFO_EMPTY_INT_EN, base_addr);
	}


	/*5. output data format */
	reg_val &= ~(DBI_CR_FORMAT_MASK);
	if (sspi->dbi_config->dbi_format == DBI_RGB111)
		reg_val &= ~(0x7 << DBI_CR_FORMAT);
	else
		reg_val |= ((sspi->dbi_config->dbi_format) << DBI_CR_FORMAT);

	/*6. dbi interface select */
	reg_val &= ~(DBI_CR_INTERFACE_MASK);

	if (sspi->dbi_config->dbi_interface == L3I1)
		reg_val &= ~((0x7) << DBI_CR_INTERFACE);
	else
		reg_val |= ((sspi->dbi_config->dbi_interface) << DBI_CR_INTERFACE);

	if (sspi->dbi_config->dbi_format <= DBI_RGB565)
		reg_val |= 0x1;
	else
		reg_val &= ~0x1;

	if (sspi->dbi_config->dbi_out_sequence == DBI_OUT_RGB)
		reg_val &= ~((0x7) << 16);
	else
		reg_val |= ((sspi->dbi_config->dbi_out_sequence) << 16);

	if (sspi->dbi_config->dbi_src_sequence == DBI_SRC_RGB)
		reg_val &= ~((0xf) << 4);
	else
		reg_val |= ((sspi->dbi_config->dbi_src_sequence) << 4);

	if (sspi->dbi_config->dbi_rgb_bit_order == 1)
		reg_val |= ((0x1) << 2);
	else
		reg_val &= ~((0x1) << 2);

	if (sspi->dbi_config->dbi_rgb32_alpha_pos == 1)
		reg_val |= ((0x1) << 1);
	else
		reg_val &= ~((0x1) << 1);

	writel(reg_val, base_addr + SPI_DBI_CR_REG);

	reg_val = 0;

	if (sspi->dbi_config->dbi_interface == D2LI) {
		reg_val |= DBI_CR2_DCX_PIN;
		reg_val &= ~DBI_CR2_SDI_PIN;
	} else {
		reg_val |= DBI_CR2_SDI_PIN;
		reg_val &= ~DBI_CR2_DCX_PIN;
	}

	if ((sspi->dbi_config->dbi_te_en == DBI_TE_DISABLE) ||
	    !(config & SPI_DBI_TRANSMIT_VIDEO_)) {
		reg_val &= ~(0x3 << 0); // te disable
	} else {
		/*te enable*/
		reg_val |= 0x1;
		if (sspi->dbi_config->dbi_te_en == DBI_TE_FALLING_EDGE)
			reg_val |= (0x1 << 1);
		else
			reg_val &= ~(0x1 << 1);
	}

	writel(reg_val, base_addr + SPI_DBI_CR_REG2);


	dprintk(DEBUG_INFO, "DBI mode configurate : %x\n", reg_val);

	reg_val = 0;
	if (config & SPI_DBI_DCX_DATA_)
		reg_val |= DBI_CR1_DCX_DATA;
	else
		reg_val &= ~DBI_CR1_DCX_DATA;

	if (sspi->dbi_config->dbi_rgb16_pixel_endian == 1)
		reg_val |= ((0x1) << 21);
	else
		reg_val &= ~((0x1) << 21);

	/* dbi en mode sel */
	if ((sspi->dbi_config->dbi_te_en == DBI_TE_DISABLE) ||
	    !(config & SPI_DBI_TRANSMIT_VIDEO_)) {
		if (!set_dbi_timer_param(sspi, spi))
			reg_val |= (0x2 << 29); // timer trigger mode
		else
			reg_val &= ~(0x3 << 29); // always on mode
	} else {
		/*te trigger mode */
		reg_val |= ((0x3) << 29);
	}

	/* config dbi clock mode: auto gating */
	if (sspi->dbi_config->dbi_clk_out_mode == SPI_DBI_CLK_ALWAYS_ON)
		reg_val &= ~(DBI_CR1_CLK_AUTO);
	else
		reg_val |= DBI_CR1_CLK_AUTO;

	writel(reg_val, base_addr + SPI_DBI_CR_REG1);

	if ((debug_mask & DEBUG_INIT) && (debug_mask & DEBUG_DATA)) {
		dprintk(DEBUG_DATA, "[spi%d] dbi register dump reg:\n", sspi->master->bus_num);
		spi_dump_reg(sspi, 0x100, 0x30);
	}
}

/* enable spi dbi */
static void spi_enable_dbi(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_GC_REG);

	reg_val |= SPI_GC_DBI_EN;
	writel(reg_val, base_addr + SPI_GC_REG);
}

/* set dbi mode */
static void spi_set_dbi(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_GC_REG);

	reg_val |= SPI_GC_DBI_MODE_SEL;
	writel(reg_val, base_addr + SPI_GC_REG);
}

/* spi controller config chip select
 * only spi controller cs mode can use this function
 * */
static s32 sunxi_spi_ss_select(u32 chipselect, void __iomem *base_addr)
{
	char ret;
	u32 reg_val = readl(base_addr + SPI_TC_REG);

	if (chipselect < 4) {
		reg_val &= ~SPI_TC_SS_MASK;/* SS-chip select, clear two bits */
		reg_val |= chipselect << SPI_TC_SS_BIT_POS;/* set chip select */
		writel(reg_val, base_addr + SPI_TC_REG);
		ret = SUNXI_SPI_OK;
	} else {
		SPI_ERR("Chip Select set fail! cs = %d\n", chipselect);
		ret = SUNXI_SPI_FAIL;
	}

	return ret;
}

/* config spi */
static void spi_config_tc(u32 master, u32 config, void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_TC_REG);

	/*1. POL */
	if (config & SPI_POL_ACTIVE_)
		reg_val |= SPI_TC_POL;/*default POL = 1 */
	else
		reg_val &= ~SPI_TC_POL;

	/*2. PHA */
	if (config & SPI_PHA_ACTIVE_)
		reg_val |= SPI_TC_PHA;/*default PHA = 1 */
	else
		reg_val &= ~SPI_TC_PHA;

	/*3. SSPOL,chip select signal polarity */
	if (config & SPI_CS_HIGH_ACTIVE_)
		reg_val &= ~SPI_TC_SPOL;
	else
		reg_val |= SPI_TC_SPOL; /*default SSPOL = 1,Low level effect */

	/*4. LMTF--LSB/MSB transfer first select */
	if (config & SPI_LSB_FIRST_ACTIVE_)
		reg_val |= SPI_TC_FBS;
	else
		reg_val &= ~SPI_TC_FBS;/*default LMTF =0, MSB first */

	/*master mode: set DDB,DHB,SMC,SSCTL*/
	if (master == 1) {
		/*5. dummy burst type */
		if (config & SPI_DUMMY_ONE_ACTIVE_)
			reg_val |= SPI_TC_DDB;
		else
			reg_val &= ~SPI_TC_DDB;/*default DDB =0, ZERO */

		/*6.discard hash burst-DHB */
		if (config & SPI_RECEIVE_ALL_ACTIVE_)
			reg_val &= ~SPI_TC_DHB;
		else
			reg_val |= SPI_TC_DHB;/*default DHB =1, discard unused burst */

		/*7. set SMC = 1 , SSCTL = 0 ,TPE = 1 */
		reg_val &= ~SPI_TC_SSCTL;
	} else {
		/* tips for slave mode config */
		dprintk(DEBUG_INFO, "slave mode configurate control register\n");
	}

	writel(reg_val, base_addr + SPI_TC_REG);
}

/* set spi clock */
static void spi_set_clk(u32 spi_clk, u32 ahb_clk, struct sunxi_spi *sspi)
{
	dprintk(DEBUG_INFO, "set spi clock %d, mclk %d\n", spi_clk, ahb_clk);

	clk_set_rate(sspi->mclk, spi_clk);
	if (clk_get_rate(sspi->mclk) != spi_clk) {
#if 0
		clk_set_rate(sspi->mclk, ahb_clk);
		SPI_ERR("[spi%d] set spi clock failed, use clk:%d\n",
				sspi->master->bus_num, ahb_clk);
#else
        //add by fae
		u32 get_spi = clk_set_rate(sspi->mclk, spi_clk);
		clk_set_rate(sspi->mclk, get_spi);

		SPI_ERR("[spi%d] set spi clock failed, use clk:%d\n",
				sspi->master->bus_num, get_spi);
#endif
	}
}

/* delay internal read sample point*/
static void spi_sample_delay(u32 sdm, u32 sdc, u32 sdc1,
					void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_TC_REG);
	u32 org_val = reg_val;

	if (sdm)
		reg_val |= SPI_TC_SDM;
	else
		reg_val &= ~SPI_TC_SDM;

	if (sdc)
		reg_val |= SPI_TC_SDC;
	else
		reg_val &= ~SPI_TC_SDC;

	if (sdc1)
		reg_val |= SPI_TC_SDC1;
	else
		reg_val &= ~SPI_TC_SDC1;

	if (reg_val != org_val)
		writel(reg_val, base_addr + SPI_TC_REG);
}

static void spi_set_sample_mode(unsigned int mode, void __iomem *base_addr)
{
	unsigned int sample_mode[7] = {
		DELAY_NORMAL_SAMPLE, DELAY_0_5_CYCLE_SAMPLE,
		DELAY_1_CYCLE_SAMPLE, DELAY_1_5_CYCLE_SAMPLE,
		DELAY_2_CYCLE_SAMPLE, DELAY_2_5_CYCLE_SAMPLE,
		DELAY_3_CYCLE_SAMPLE
	};
	spi_sample_delay((sample_mode[mode] >> DELAY_SDM_POS) & 0xf,
			(sample_mode[mode] >> DELAY_SDC_POS) & 0xf,
			(sample_mode[mode] >>  DELAY_SDC1_POS)& 0xf,
			base_addr);
}

static void spi_samp_dl_sw_status(unsigned int status, void __iomem *base_addr)
{
	unsigned int rval = readl(base_addr + SPI_SAMPLE_DELAY_REG);

	if (status)
		rval |= SPI_SAMP_DL_SW_EN;
	else
		rval &= ~SPI_SAMP_DL_SW_EN;

	writel(rval, base_addr + SPI_SAMPLE_DELAY_REG);
}

static void spi_samp_mode_enable(unsigned int status, void __iomem *base_addr)
{
	unsigned int rval = readl(base_addr + SPI_GC_REG);

	if (status)
		rval |= SPI_SAMP_MODE_EN;
	else
		rval &= ~SPI_SAMP_MODE_EN;

	writel(rval, base_addr + SPI_GC_REG);
}

static void spi_set_sample_delay(unsigned int sample_delay,
		void __iomem *base_addr)
{
	unsigned int rval = readl(base_addr + SPI_SAMPLE_DELAY_REG)
					& (~(0x3f << 0));

	rval |= sample_delay;
	writel(rval, base_addr + SPI_SAMPLE_DELAY_REG);
}

/* start spi transfer */
static void spi_start_xfer(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_TC_REG);

	reg_val |= SPI_TC_XCH;
	writel(reg_val, base_addr + SPI_TC_REG);
}

/* enable spi bus */
static void spi_enable_bus(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_GC_REG);

	reg_val |= SPI_GC_EN;
	writel(reg_val, base_addr + SPI_GC_REG);
}

/* disbale spi bus */
static void spi_disable_bus(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_GC_REG);

	reg_val &= ~SPI_GC_EN;
	writel(reg_val, base_addr + SPI_GC_REG);
}

/* set master mode */
static void spi_set_master(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_GC_REG);

	reg_val |= SPI_GC_MODE;
	writel(reg_val, base_addr + SPI_GC_REG);
}

/* set slaev mode */
static void spi_set_slave(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_GC_REG);
	u32 val = SPI_GC_MODE;

	reg_val &= ~val;
	writel(reg_val, base_addr + SPI_GC_REG);
}

/* enable transmit pause */
static void spi_enable_tp(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_GC_REG);

	reg_val |= SPI_GC_TP_EN;
	writel(reg_val, base_addr + SPI_GC_REG);
}

/* soft reset spi controller */
static void spi_soft_reset(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_GC_REG);

	reg_val |= SPI_GC_SRST;
	writel(reg_val, base_addr + SPI_GC_REG);
}

/* enable irq type */
static void spi_enable_irq(u32 bitmap, void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_INT_CTL_REG);

	bitmap &= SPI_INTEN_MASK;
	reg_val |= bitmap;
	writel(reg_val, base_addr + SPI_INT_CTL_REG);
}

/* disable irq type */
static void spi_disable_irq(u32 bitmap, void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_INT_CTL_REG);

	bitmap &= SPI_INTEN_MASK;
	reg_val &= ~bitmap;
	writel(reg_val, base_addr + SPI_INT_CTL_REG);
}

#if IS_ENABLED(CONFIG_DMA_ENGINE)
/* enable dma irq */
static void spi_enable_dma_irq(u32 bitmap, void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_FIFO_CTL_REG);

	bitmap &= SPI_FIFO_CTL_DRQEN_MASK;
	reg_val |= bitmap;
	writel(reg_val, base_addr + SPI_FIFO_CTL_REG);

	spi_set_dma_mode(base_addr);
}

/* disable dma irq */
static void spi_disable_dma_irq(u32 bitmap, void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_FIFO_CTL_REG);

	bitmap &= SPI_FIFO_CTL_DRQEN_MASK;
	reg_val &= ~bitmap;
	writel(reg_val, base_addr + SPI_FIFO_CTL_REG);
}

static void spi_enable_dbi_dma(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_DBI_CR_REG2);

	reg_val |= DBI_CR2_DMA_ENABLE;
	writel(reg_val, base_addr + SPI_DBI_CR_REG2);
}

static void spi_disable_dbi_dma(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_DBI_CR_REG2);

	reg_val &= ~(DBI_CR2_DMA_ENABLE);
	writel(reg_val, base_addr + SPI_DBI_CR_REG2);
}
#endif

/* query irq enable */
static u32 spi_qry_irq_enable(void __iomem *base_addr)
{
	return (SPI_INTEN_MASK & readl(base_addr + SPI_INT_CTL_REG));
}

/* query dbi irq pending */
static u32 dbi_qry_irq_pending(void __iomem *base_addr)
{
	return (DBI_INT_STA_MASK & readl(base_addr + SPI_DBI_INT_REG));
}

/* clear irq pending */
static void dbi_clr_irq_pending(u32 pending_bit, void __iomem *base_addr)
{
	pending_bit &= DBI_INT_STA_MASK;
	writel(pending_bit, base_addr + SPI_DBI_INT_REG);
}

/* query irq pending */
static u32 spi_qry_irq_pending(void __iomem *base_addr)
{
	return (SPI_INT_STA_MASK & readl(base_addr + SPI_INT_STA_REG));
}

/* clear irq pending */
static void spi_clr_irq_pending(u32 pending_bit, void __iomem *base_addr)
{
	pending_bit &= SPI_INT_STA_MASK;
	writel(pending_bit, base_addr + SPI_INT_STA_REG);
}

/* query txfifo bytes */
static u32 spi_query_txfifo(void __iomem *base_addr)
{
	u32 reg_val = (SPI_FIFO_STA_TX_CNT & readl(base_addr + SPI_FIFO_STA_REG));

	reg_val >>= SPI_TXCNT_BIT_POS;
	return reg_val;
}

/* query rxfifo bytes */
static u32 spi_query_rxfifo(void __iomem *base_addr)
{
	u32 reg_val = (SPI_FIFO_STA_RX_CNT & readl(base_addr + SPI_FIFO_STA_REG));

	reg_val >>= SPI_RXCNT_BIT_POS;
	return reg_val;
}

/* reset fifo */
static void spi_reset_fifo(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_FIFO_CTL_REG);

	reg_val |= (SPI_FIFO_CTL_RX_RST|SPI_FIFO_CTL_TX_RST);
	/* Set the trigger level of RxFIFO/TxFIFO. */
	reg_val &= ~(SPI_FIFO_CTL_RX_LEVEL|SPI_FIFO_CTL_TX_LEVEL);
	reg_val |= (0x20<<16) | 0x20;
	writel(reg_val, base_addr + SPI_FIFO_CTL_REG);
}

static void spi_set_rx_trig(u32 val, void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_FIFO_CTL_REG);

	reg_val &= ~SPI_FIFO_CTL_RX_LEVEL;
	reg_val |= val & SPI_FIFO_CTL_RX_LEVEL;
	writel(reg_val, base_addr + SPI_FIFO_CTL_REG);

}

/* set transfer total length BC, transfer length TC and single transmit length STC */
static void spi_set_bc_tc_stc(u32 tx_len, u32 rx_len, u32 stc_len, u32 dummy_cnt, void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_BURST_CNT_REG);

	/* set MBC(0x30) = tx_len + rx_len + dummy_cnt */
	reg_val &= ~SPI_BC_CNT_MASK;
	reg_val |= (SPI_BC_CNT_MASK & (tx_len + rx_len + dummy_cnt));
	writel(reg_val, base_addr + SPI_BURST_CNT_REG);

	/* set MTC(0x34) = tx_len */
	reg_val = readl(base_addr + SPI_TRANSMIT_CNT_REG);
	reg_val &= ~SPI_TC_CNT_MASK;
	reg_val |= (SPI_TC_CNT_MASK & tx_len);
	writel(reg_val, base_addr + SPI_TRANSMIT_CNT_REG);

	/* set BBC(0x38) = dummy cnt & single mode transmit counter */
	reg_val = readl(base_addr + SPI_BCC_REG);
	reg_val &= ~SPI_BCC_STC_MASK;
	reg_val |= (SPI_BCC_STC_MASK & stc_len);
	reg_val &= ~(0xf << 24);
	reg_val |= (dummy_cnt << 24);
	writel(reg_val, base_addr + SPI_BCC_REG);
}

/* set ss c
 * sunxi_spi_ss_ctrl : software control or spi controller control
 * owner = 1 : software contorl
 * owner = 0 : spi controller control
 * */
static void sunxi_spi_ss_ctrl(void __iomem *base_addr, bool owner)
{
	u32 reg_val = readl(base_addr + SPI_TC_REG);

	owner &= 0x1;
	if (owner)
		reg_val |= SPI_TC_SS_OWNER;
	else
		reg_val &= ~SPI_TC_SS_OWNER;
	writel(reg_val, base_addr + SPI_TC_REG);
}

/* set dhb, 1: discard unused spi burst; 0: receiving all spi burst */
static void spi_set_all_burst_received(void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr+SPI_TC_REG);

	reg_val &= ~SPI_TC_DHB;
	writel(reg_val, base_addr + SPI_TC_REG);
}

static void spi_disable_dual(void __iomem  *base_addr)
{
	u32 reg_val = readl(base_addr+SPI_BCC_REG);
	reg_val &= ~SPI_BCC_DUAL_MODE;
	writel(reg_val, base_addr + SPI_BCC_REG);
}

static void spi_enable_dual(void __iomem  *base_addr)
{
	u32 reg_val = readl(base_addr+SPI_BCC_REG);
	reg_val &= ~SPI_BCC_QUAD_MODE;
	reg_val |= SPI_BCC_DUAL_MODE;
	writel(reg_val, base_addr + SPI_BCC_REG);
}

static void spi_disable_quad(void __iomem  *base_addr)
{
	u32 reg_val = readl(base_addr+SPI_BCC_REG);

	reg_val &= ~SPI_BCC_QUAD_MODE;
	writel(reg_val, base_addr + SPI_BCC_REG);
}

static void spi_enable_quad(void __iomem  *base_addr)
{
	u32 reg_val = readl(base_addr+SPI_BCC_REG);

	reg_val |= SPI_BCC_QUAD_MODE;
	writel(reg_val, base_addr + SPI_BCC_REG);
}
static int spi_regulator_request(struct sunxi_spi_platform_data *pdata,
			struct device *dev)
{
	struct regulator *regu = NULL;

	if (pdata->regulator != NULL)
		return 0;

	regu = devm_regulator_get(dev, "spi");
	if (IS_ERR(regu)) {
		SPI_ERR("%s: spi get supply failed!\n", __func__);
		return -1;
	}

	pdata->regulator = regu;
	return 0;
}

static int spi_regulator_enable(struct sunxi_spi_platform_data *pdata)
{
	if (pdata->regulator == NULL)
		return 0;

	if (regulator_enable(pdata->regulator) != 0) {
		SPI_ERR("enable regulator %s failed!\n", pdata->regulator_id);
		return -1;
	}
	return 0;
}

static int spi_regulator_disable(struct sunxi_spi_platform_data *pdata)
{
	if (pdata->regulator == NULL)
		return 0;

	if (regulator_disable(pdata->regulator) != 0) {
		SPI_ERR("enable regulator %s failed!\n", pdata->regulator_id);
		return -1;
	}
	return 0;
}

#if IS_ENABLED(CONFIG_DMA_ENGINE)

/* ------------------------------- dma operation start----------------------- */
/* dma full done callback for spi rx */
static void sunxi_spi_dma_cb_rx(void *data)
{
	struct sunxi_spi *sspi = (struct sunxi_spi *)data;
	unsigned long flags = 0;
	void __iomem *base_addr = sspi->base_addr;

	spin_lock_irqsave(&sspi->lock, flags);
	dprintk(DEBUG_INFO, "[spi%d] dma read data end\n", sspi->master->bus_num);

	if (spi_query_rxfifo(base_addr) > 0) {
		SPI_ERR("[spi%d] DMA end, but RxFIFO isn't empty! FSR: %#x\n",
			sspi->master->bus_num, spi_query_rxfifo(base_addr));
		sspi->result = -1; /* failed */
	} else {
		sspi->result = 0;
	}

	complete(&sspi->done);
	spin_unlock_irqrestore(&sspi->lock, flags);
}

/* dma full done callback for spi tx */
static void sunxi_spi_dma_cb_tx(void *data)
{
	struct sunxi_spi *sspi = (struct sunxi_spi *)data;
	unsigned long flags = 0;

	spin_lock_irqsave(&sspi->lock, flags);
	dprintk(DEBUG_INFO, "[spi%d] dma write data end\n", sspi->master->bus_num);
	spin_unlock_irqrestore(&sspi->lock, flags);
}

static int sunxi_spi_dmg_sg_cnt(void *addr, int len)
{
	int npages = 0;
	char *bufp = (char *)addr;
	int mapbytes = 0;
	int bytesleft = len;

	while (bytesleft > 0) {
		if (bytesleft < (PAGE_SIZE - offset_in_page(bufp)))
			mapbytes = bytesleft;
		else
			mapbytes = PAGE_SIZE - offset_in_page(bufp);

		npages++;
		bufp += mapbytes;
		bytesleft -= mapbytes;
	}
	return npages;
}

static int sunxi_spi_dma_init_sg(spi_dma_info_t *info, void *addr,
				 int len)
{
	int i;
	int npages = 0;
	void *bufp = addr;
	int mapbytes = 0;
	int bytesleft = len;

	npages = sunxi_spi_dmg_sg_cnt(addr, len);
	WARN_ON(npages == 0);
	dprintk(DEBUG_INFO, "npages = %d, len = %d\n", npages, len);
	if (npages > SPI_MAX_PAGES)
		npages = SPI_MAX_PAGES;

	sg_init_table(info->sg, npages);
	for (i = 0; i < npages; i++) {
		/* If there are less bytes left than what fits
		 * in the current page (plus page alignment offset)
		 * we just feed in this, else we stuff in as much
		 * as we can.
		 */
		if (bytesleft < (PAGE_SIZE - offset_in_page(bufp)))
			mapbytes = bytesleft;
		else
			mapbytes = PAGE_SIZE - offset_in_page(bufp);

		dprintk(DEBUG_INFO, "%d: len %d, offset %ld, addr %p(%d)\n", i, mapbytes,
			offset_in_page(bufp), bufp, virt_addr_valid(bufp));
		if (virt_addr_valid(bufp))
			sg_set_page(&info->sg[i], virt_to_page(bufp),
				    mapbytes, offset_in_page(bufp));
		else
			sg_set_page(&info->sg[i], vmalloc_to_page(bufp),
				    mapbytes, offset_in_page(bufp));

		bufp += mapbytes;
		bytesleft -= mapbytes;
	}

	WARN_ON(bytesleft);
	info->nents = npages;
	return 0;
}

/* request dma channel and set callback function */
static int sunxi_spi_prepare_dma(struct device *dev, spi_dma_info_t *_info,
				enum spi_dma_dir _dir, const char *name)
{
	dprintk(DEBUG_INFO, "Init DMA, dir %d\n", _dir);

	if (_info->chan == NULL) {
		_info->chan = dma_request_chan(dev, name);
		if (IS_ERR(_info->chan)) {
			SPI_ERR("Request DMA(dir %d) failed!\n", _dir);
			return -EINVAL;
		}
	}

	_info->dir = _dir;
	return 0;
}

static int sunxi_spi_config_dma_rx(struct sunxi_spi *sspi, struct spi_transfer *t)
{
	int ret = 0;
	int nents = 0;
	struct dma_slave_config dma_conf = {0};
	struct dma_async_tx_descriptor *dma_desc = NULL;
	unsigned int i, j;
	u8 buf[64], cnt = 0;

	if (debug_mask & DEBUG_INFO3) {
		dprintk(DEBUG_INIT, "t->len = %d\n", t->len);
		if (debug_mask & DEBUG_DATA) {
			for (i = 0; i < t->len; i += 16) {
				cnt = 0;
				cnt += sprintf(buf + cnt, "%03x: ", i);
				for (j = 0; ((i + j) < t->len) && (j < 16); j++)
					cnt += sprintf(buf + cnt, "%02x ",
							((unsigned char *)(t->rx_buf))[i+j]);
				pr_warn("%s\n", buf);
			}
		}
	}

	ret = sunxi_spi_dma_init_sg(&sspi->dma_rx, t->rx_buf, t->len);
	if (ret != 0)
		return ret;

	dma_conf.direction = DMA_DEV_TO_MEM;
	dma_conf.src_addr = sspi->base_addr_phy + SPI_RXDATA_REG;
	if (t->len%DMA_SLAVE_BUSWIDTH_4_BYTES) {
		dma_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
		dma_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
	} else {
		dma_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
		dma_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
	}
	dma_conf.src_maxburst = 4;
	dma_conf.dst_maxburst = 4;
	dmaengine_slave_config(sspi->dma_rx.chan, &dma_conf);

	nents = dma_map_sg(&sspi->pdev->dev, sspi->dma_rx.sg,
			   sspi->dma_rx.nents, DMA_FROM_DEVICE);
	if (!nents) {
		SPI_ERR("[spi%d] dma_map_sg(%d) failed! return %d\n",
				sspi->master->bus_num, sspi->dma_rx.nents, nents);
		return -ENOMEM;
	}
	dprintk(DEBUG_INFO, "[spi%d] npages = %d, nents = %d\n",
			sspi->master->bus_num, sspi->dma_rx.nents, nents);

	dma_desc = dmaengine_prep_slave_sg(sspi->dma_rx.chan, sspi->dma_rx.sg,
					   nents, DMA_DEV_TO_MEM,
					   DMA_PREP_INTERRUPT|DMA_CTRL_ACK);
	if (!dma_desc) {
		SPI_ERR("[spi%d] dmaengine_prep_slave_sg() failed!\n",
				sspi->master->bus_num);
		dma_unmap_sg(&sspi->pdev->dev, sspi->dma_rx.sg,
			     sspi->dma_rx.nents, DMA_FROM_DEVICE);
		return -1;
	}

	dma_desc->callback = sunxi_spi_dma_cb_rx;
	dma_desc->callback_param = (void *)sspi;
	dmaengine_submit(dma_desc);

	return 0;
}

static int sunxi_spi_config_dma_tx(struct sunxi_spi *sspi, struct spi_transfer *t)
{
	int ret = 0;
	int nents = 0;
	struct dma_slave_config dma_conf = {0};
	struct dma_async_tx_descriptor *dma_desc = NULL;
	unsigned int i, j;
	u8 buf[64], cnt = 0;

	if (debug_mask & DEBUG_INFO4) {
		dprintk(DEBUG_INIT, "t->len = %d\n", t->len);
		if (debug_mask & DEBUG_DATA) {
			for (i = 0; i < t->len; i += 16) {
				cnt = 0;
				cnt += sprintf(buf + cnt, "%03x: ", i);
				for (j = 0; ((i + j) < t->len) && (j < 16); j++)
					cnt += sprintf(buf + cnt, "%02x ",
							((unsigned char *)(t->tx_buf))[i+j]);
				pr_warn("%s\n", buf);
			}
		}
	}

	ret = sunxi_spi_dma_init_sg(&sspi->dma_tx, (void *)t->tx_buf,
				    t->len);
	if (ret != 0)
		return ret;

	dma_conf.direction = DMA_MEM_TO_DEV;
	dma_conf.dst_addr = sspi->base_addr_phy + SPI_TXDATA_REG;
	if (t->len%DMA_SLAVE_BUSWIDTH_4_BYTES) {
		dma_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
		dma_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
	} else {
		dma_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
		dma_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
	}
	dma_conf.src_maxburst = 4;
	dma_conf.dst_maxburst = 4;
	dmaengine_slave_config(sspi->dma_tx.chan, &dma_conf);

	nents = dma_map_sg(&sspi->pdev->dev, sspi->dma_tx.sg, sspi->dma_tx.nents, DMA_TO_DEVICE);
	if (!nents) {
		SPI_ERR("[spi%d] dma_map_sg(%d) failed! return %d\n",
				sspi->master->bus_num, sspi->dma_tx.nents, nents);
		return -ENOMEM;
	}
	dprintk(DEBUG_INFO, "[spi%d] npages = %d, nents = %d\n",
			sspi->master->bus_num, sspi->dma_tx.nents, nents);

	dma_desc = dmaengine_prep_slave_sg(sspi->dma_tx.chan, sspi->dma_tx.sg,
					   nents, DMA_MEM_TO_DEV,
					   DMA_PREP_INTERRUPT|DMA_CTRL_ACK);
	if (!dma_desc) {
		SPI_ERR("[spi%d] dmaengine_prep_slave_sg() failed!\n",
				sspi->master->bus_num);
		dma_unmap_sg(&sspi->pdev->dev, sspi->dma_tx.sg,
			     sspi->dma_tx.nents, DMA_TO_DEVICE);
		return -1;
	}

	dma_desc->callback = sunxi_spi_dma_cb_tx;
	dma_desc->callback_param = (void *)sspi;
	dmaengine_submit(dma_desc);
	return 0;
}

/* config dma src and dst address,
 * io or linear address,
 * drq type,
 * then enqueue
 * but not trigger dma start
 */
static int sunxi_spi_config_dma(struct sunxi_spi *sspi, enum spi_dma_dir dma_dir, struct spi_transfer *t)
{
	if (dma_dir == SPI_DMA_RDEV)
		return sunxi_spi_config_dma_rx(sspi, t);
	else
		return sunxi_spi_config_dma_tx(sspi, t);
}

/* set dma start flag, if queue, it will auto restart to transfer next queue */
static int sunxi_spi_start_dma(spi_dma_info_t *_info)
{
	dma_async_issue_pending(_info->chan);
	return 0;
}

/* Unmap and free the SG tables */
static void sunxi_spi_dma_free_sg(struct sunxi_spi *sspi, spi_dma_info_t *info)
{
	if (info->dir == SPI_DMA_RWNULL)
		return;

	dma_unmap_sg(&sspi->pdev->dev, info->sg, info->nents, (enum dma_data_direction)info->dir);
	info->dir = SPI_DMA_RWNULL;

	/* Never release the DMA channel. Duanmintao
	 * dma_release_channel(info->chan);
	 * info->chan = NULL;
	 */
}

/* release dma channel, and set queue status to idle. */
static int sunxi_spi_release_dma(struct sunxi_spi *sspi, struct spi_transfer *t)
{
	unsigned long flags = 0;

	spin_lock_irqsave(&sspi->lock, flags);

	sunxi_spi_dma_free_sg(sspi, &sspi->dma_rx);
	sunxi_spi_dma_free_sg(sspi, &sspi->dma_tx);

	spin_unlock_irqrestore(&sspi->lock, flags);
	return 0;
}
#endif

/* sunxi_spi_set_cs : spi control set cs to connect device
 * enable : 1, working mode : set ss to connect device
 * enable : 0, default mode : set ss to do not connect device
 *
 * spi controller cs mode use this funtion to set cs
 * software cs mode use kernel code to set cs
 * */
static void sunxi_spi_set_cs(struct spi_device *spi, bool enable)
{
	u32 reg_val;
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);

	sunxi_spi_ss_select(spi->chip_select, sspi->base_addr);

	reg_val = readl(sspi->base_addr + SPI_TC_REG);
	enable &= 0x01;
	if (enable)	//set cs to connect device
		reg_val |= SPI_TC_SS_LEVEL;
	else		//set cs to default mode
		reg_val &= ~SPI_TC_SS_LEVEL;
	writel(reg_val, sspi->base_addr + SPI_TC_REG);
}

/* change the properties of spi device with spi transfer.
 * every spi transfer must call this interface to update
 * the master to the excute transfer set clock.
 * return:  >= 0 : succeed;    < 0: failed.
 */
static int sunxi_spi_xfer_setup(struct spi_device *spi, struct spi_transfer *t)
{
	/* get at the setup function, the properties of spi device */
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);
	u32 spi_speed_hz;
	void __iomem *base_addr = sspi->base_addr;

	spi_speed_hz  = (t && t->speed_hz) ? t->speed_hz : spi->max_speed_hz;

	if (sspi->sample_delay == SAMP_MODE_DL_DEFAULT) {
		if (spi_speed_hz >= SPI_HIGH_FREQUENCY)
			spi_sample_delay(0, 1, 0, base_addr);
		else if (spi_speed_hz <= SPI_LOW_FREQUENCY)
			spi_sample_delay(1, 0, 0, base_addr);
		else
			spi_sample_delay(0, 0, 0, base_addr);
	} else {
		spi_samp_mode_enable(1, base_addr);
		spi_samp_dl_sw_status(1, base_addr);
		spi_set_sample_mode(sspi->sample_mode, base_addr);
		spi_set_sample_delay(sspi->sample_delay, base_addr);
	}

#if IS_ENABLED(CONFIG_EVB_PLATFORM)
	spi_set_clk(spi_speed_hz, clk_get_rate(sspi->mclk), sspi);
#else
	spi_set_clk(spi_speed_hz, 24000000, sspi);
#endif

	spi_config_tc(1, spi->mode, sspi->base_addr);
	return 0;
}

static int sunxi_spi_mode_check(struct sunxi_spi *sspi, struct spi_device *spi, struct spi_transfer *t)
{
	unsigned long flags = 0;

	if (sspi->mode_type != MODE_TYPE_NULL)
		return -EINVAL;

	/* full duplex */
	spin_lock_irqsave(&sspi->lock, flags);
	if (t->tx_buf && t->rx_buf) {
		spi_set_all_burst_received(sspi->base_addr);
		spi_set_bc_tc_stc(t->len, 0, t->len, 0, sspi->base_addr);
		sspi->mode_type = SINGLE_FULL_DUPLEX_RX_TX;
		dprintk(DEBUG_INFO, "[spi%d] Single mode Full duplex tx & rx\n", sspi->master->bus_num);
	} /* half duplex transmit */
	else if (t->tx_buf) {
		if (t->tx_nbits == SPI_NBITS_QUAD) {
			spi_disable_dual(sspi->base_addr);
			spi_enable_quad(sspi->base_addr);
			spi_set_bc_tc_stc(t->len, 0, 0, 0, sspi->base_addr);
			sspi->mode_type = QUAD_HALF_DUPLEX_TX;
			dprintk(DEBUG_INFO, "[spi%d] Quad mode Half duplex tx\n", sspi->master->bus_num);
		} else if (t->tx_nbits == SPI_NBITS_DUAL) {
			spi_disable_quad(sspi->base_addr);
			spi_enable_dual(sspi->base_addr);
			spi_set_bc_tc_stc(t->len, 0, 0, 0, sspi->base_addr);
			sspi->mode_type = DUAL_HALF_DUPLEX_TX;
			dprintk(DEBUG_INFO, "[spi%d] Dual mode Half duplex tx\n", sspi->master->bus_num);
		} else {
			spi_disable_quad(sspi->base_addr);
			spi_disable_dual(sspi->base_addr);
			spi_set_bc_tc_stc(t->len, 0, t->len, 0, sspi->base_addr);
			sspi->mode_type = SINGLE_HALF_DUPLEX_TX;
			dprintk(DEBUG_INFO, "[spi%d] Single mode Half duplex tx\n", sspi->master->bus_num);
		}
	} /* half duplex receive */
	else if (t->rx_buf) {
		if (t->rx_nbits == SPI_NBITS_QUAD) {
			spi_disable_dual(sspi->base_addr);
			spi_enable_quad(sspi->base_addr);
			spi_set_bc_tc_stc(0, t->len, 0, 0, sspi->base_addr);
			sspi->mode_type = QUAD_HALF_DUPLEX_RX;
			dprintk(DEBUG_INFO, "[spi%d] Quad mode Half duplex rx\n", sspi->master->bus_num);
		} else if (t->rx_nbits == SPI_NBITS_DUAL) {
			spi_disable_quad(sspi->base_addr);
			spi_enable_dual(sspi->base_addr);
			spi_set_bc_tc_stc(0, t->len, 0, 0, sspi->base_addr);
			sspi->mode_type = DUAL_HALF_DUPLEX_RX;
			dprintk(DEBUG_INFO, "[spi%d] Dual mode Half duplex rx\n", sspi->master->bus_num);
		} else {
			spi_disable_quad(sspi->base_addr);
			spi_disable_dual(sspi->base_addr);
			spi_set_bc_tc_stc(0, t->len, 0, 0, sspi->base_addr);
			sspi->mode_type = SINGLE_HALF_DUPLEX_RX;
			dprintk(DEBUG_INFO, "[spi%d] Single mode Half duplex rx\n", sspi->master->bus_num);
		}
	}
	spin_unlock_irqrestore(&sspi->lock, flags);

	return 0;

}

static int sunxi_spi_cpu_readl(struct spi_device *spi, struct spi_transfer *t)
{
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);
	void __iomem *base_addr = sspi->base_addr;
	unsigned rx_len = t->len;	/* number of bytes sent */
	unsigned char *rx_buf = (unsigned char *)t->rx_buf;
	unsigned int poll_time = 0x7ffffff;
	unsigned int i, j;
	u8 buf[64], cnt = 0;

	while (rx_len) {
	/* rxFIFO counter */
		if (spi_query_rxfifo(base_addr) && (--poll_time > 0)) {
			*rx_buf++ =  readb(base_addr + SPI_RXDATA_REG);
			--rx_len;
		}
	}
	if (poll_time <= 0) {
		SPI_ERR("[spi%d] cpu receive data time out!\n", sspi->master->bus_num);
		return -1;
	}

	if (debug_mask & DEBUG_INFO1) {
		dprintk(DEBUG_INIT, "t->len = %d\n", t->len);
		if (debug_mask & DEBUG_DATA) {
			for (i = 0; i < t->len; i += 16) {
				cnt = 0;
				cnt += sprintf(buf + cnt, "%03x: ", i);
				for (j = 0; ((i + j) < t->len) && (j < 16); j++)
					cnt += sprintf(buf + cnt, "%02x ",
							((unsigned char *)(t->rx_buf))[i+j]);
				pr_warn("%s\n", buf);
			}
		}
	}

	return 0;
}

static int sunxi_spi_cpu_writel(struct spi_device *spi, struct spi_transfer *t)
{
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);
	void __iomem *base_addr = sspi->base_addr;
	unsigned long flags = 0;
#if IS_ENABLED(CONFIG_DMA_ENGINE)
	unsigned char time;
#endif
	unsigned tx_len = t->len;	/* number of bytes receieved */
	unsigned char *tx_buf = (unsigned char *)t->tx_buf;
	unsigned int poll_time = 0x7ffffff;
	unsigned int i, j;
	u8 buf[64], cnt = 0;

	if (debug_mask & DEBUG_INFO2) {
		dprintk(DEBUG_INIT, "t->len = %d\n", t->len);
		if (debug_mask & DEBUG_DATA) {
			for (i = 0; i < t->len; i += 16) {
				cnt = 0;
				cnt += sprintf(buf + cnt, "%03x: ", i);
				for (j = 0; ((i + j) < t->len) && (j < 16); j++)
					cnt += sprintf(buf + cnt, "%02x ",
							((unsigned char *)(t->tx_buf))[i+j]);
				pr_warn("%s\n", buf);
			}
		}
	}

	spin_lock_irqsave(&sspi->lock, flags);
	for (; tx_len > 0; --tx_len) {
		writeb(*tx_buf++, base_addr + SPI_TXDATA_REG);
#if IS_ENABLED(CONFIG_DMA_ENGINE)
		if (spi_query_txfifo(base_addr) >= MAX_FIFU)
			for (time = 2; 0 < time; --time)
				;
#endif
	}
	spin_unlock_irqrestore(&sspi->lock, flags);
	while (spi_query_txfifo(base_addr) && (--poll_time > 0))
		;
	if (poll_time <= 0) {
		SPI_ERR("[spi%d] cpu transfer data time out!\n", sspi->master->bus_num);
		return -1;
	}

	return 0;
}

#if IS_ENABLED(CONFIG_DMA_ENGINE)
static int sunxi_spi_dma_rx_config(struct spi_device *spi, struct spi_transfer *t)
{
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);
	void __iomem *base_addr = sspi->base_addr;
	int ret = 0;

	/* rxFIFO reday dma request enable */
	spi_enable_dma_irq(SPI_FIFO_CTL_RX_DRQEN, base_addr);
	ret = sunxi_spi_prepare_dma(&sspi->pdev->dev, &sspi->dma_rx,
				SPI_DMA_RDEV, "rx");
	if (ret < 0) {
		spi_disable_dma_irq(SPI_FIFO_CTL_RX_DRQEN, base_addr);
		spi_disable_irq(SPI_INTEN_TC|SPI_INTEN_ERR, base_addr);
		return -EINVAL;
	}
	sunxi_spi_config_dma(sspi, SPI_DMA_RDEV, t);
	sunxi_spi_start_dma(&sspi->dma_rx);

	return ret;
}

static int sunxi_spi_dma_tx_config(struct spi_device *spi, struct spi_transfer *t)
{
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);
	void __iomem *base_addr = sspi->base_addr;
	int ret = 0;

	spi_enable_dma_irq(SPI_FIFO_CTL_TX_DRQEN, base_addr);
	ret = sunxi_spi_prepare_dma(&sspi->pdev->dev, &sspi->dma_tx,
				SPI_DMA_WDEV, "tx");
	if (ret < 0) {
		spi_disable_dma_irq(SPI_FIFO_CTL_TX_DRQEN, base_addr);
		spi_disable_irq(SPI_INTEN_TC|SPI_INTEN_ERR, base_addr);
		return -EINVAL;
	}
	sunxi_spi_config_dma(sspi, SPI_DMA_WDEV, t);
	sunxi_spi_start_dma(&sspi->dma_tx);

	return ret;
}
static int sunxi_spi_dma_transfer(struct spi_device *spi, struct spi_transfer *t)
{
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);
	void __iomem *base_addr = sspi->base_addr;
	unsigned tx_len = t->len;	/* number of bytes receieved */
	unsigned rx_len = t->len;	/* number of bytes sent */

	switch (sspi->mode_type) {
	case SINGLE_HALF_DUPLEX_RX:
	case DUAL_HALF_DUPLEX_RX:
	case QUAD_HALF_DUPLEX_RX:
	{
		/* >64 use DMA transfer, or use cpu */
		if (t->len > BULK_DATA_BOUNDARY) {
			dprintk(DEBUG_INFO, "[spi%d] rx -> by dma\n", sspi->master->bus_num);
			/* For Rx mode, the DMA end(not TC flag) is real end. */
			spi_disable_irq(SPI_INTEN_TC, base_addr);
			sunxi_spi_dma_rx_config(spi, t);
			if (!sspi->dbi_enabled)
				spi_start_xfer(base_addr);
		} else {
			dprintk(DEBUG_INFO, "[spi%d] rx -> by ahb\n", sspi->master->bus_num);
			/* SMC=1,XCH trigger the transfer */
			if (!sspi->dbi_enabled)
				spi_start_xfer(base_addr);
			sunxi_spi_cpu_readl(spi, t);
		}
		break;
	}
	case SINGLE_HALF_DUPLEX_TX:
	case DUAL_HALF_DUPLEX_TX:
	case QUAD_HALF_DUPLEX_TX:
	{
		/* >64 use DMA transfer, or use cpu */
		if (t->len > BULK_DATA_BOUNDARY) {
			dprintk(DEBUG_INFO, "[spi%d] tx -> by dma\n", sspi->master->bus_num);
			if (!sspi->dbi_enabled)
				spi_start_xfer(base_addr);
			/* txFIFO empty dma request enable */
			sunxi_spi_dma_tx_config(spi, t);
		} else {
			dprintk(DEBUG_INFO, "[spi%d] tx -> by ahb\n", sspi->master->bus_num);
			if (!sspi->dbi_enabled)
				spi_start_xfer(base_addr);
			sunxi_spi_cpu_writel(spi, t);
		}
		break;
	}
	case SINGLE_FULL_DUPLEX_RX_TX:
	{
		/* >64 use DMA transfer, or use cpu */
		if (t->len > BULK_DATA_BOUNDARY) {
			dprintk(DEBUG_INFO, "[spi%d] rx and tx -> by dma\n", sspi->master->bus_num);
			/* For Rx mode, the DMA end(not TC flag) is real end. */
			spi_disable_irq(SPI_INTEN_TC, base_addr);
			sunxi_spi_dma_rx_config(spi, t);
			if (!sspi->dbi_enabled)
				spi_start_xfer(base_addr);
			sunxi_spi_dma_tx_config(spi, t);
		} else {
			dprintk(DEBUG_INFO, "[spi%d] rx and tx -> by ahb\n", sspi->master->bus_num);
			if ((rx_len == 0) || (tx_len == 0))
				return -EINVAL;

			if (!sspi->dbi_enabled)
				spi_start_xfer(base_addr);
			sunxi_spi_cpu_writel(spi, t);
			sunxi_spi_cpu_readl(spi, t);
		}
		break;
	}
	default:
		return -1;
	}

	return 0;
}
#else
static int sunxi_spi_cpu_transfer(struct spi_device *spi, struct spi_transfer *t)
{
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);
	void __iomem *base_addr = sspi->base_addr;
	unsigned tx_len = t->len;	/* number of bytes receieved */
	unsigned rx_len = t->len;	/* number of bytes sent */

	switch (sspi->mode_type) {
	case SINGLE_HALF_DUPLEX_RX:
	case DUAL_HALF_DUPLEX_RX:
	case QUAD_HALF_DUPLEX_RX:
	{
		dprintk(DEBUG_INFO, "[spi%d] rx -> by ahb\n", sspi->master->bus_num);
		/* SMC=1,XCH trigger the transfer */
		if (!sspi->dbi_enabled)
			spi_start_xfer(base_addr);
		sunxi_spi_cpu_readl(spi, t);
		break;
	}
	case SINGLE_HALF_DUPLEX_TX:
	case DUAL_HALF_DUPLEX_TX:
	case QUAD_HALF_DUPLEX_TX:
	{
		dprintk(DEBUG_INFO, "[spi%d] tx -> by ahb\n", sspi->master->bus_num);
		if (!sspi->dbi_enabled)
			spi_start_xfer(base_addr);
		sunxi_spi_cpu_writel(spi, t);
		break;
	}
	case SINGLE_FULL_DUPLEX_RX_TX:
	{
		dprintk(DEBUG_INFO, "[spi%d] rx and tx -> by ahb\n", sspi->master->bus_num);
		if ((rx_len == 0) || (tx_len == 0))
			return -EINVAL;

		if (!sspi->dbi_enabled)
			spi_start_xfer(base_addr);
		sunxi_spi_cpu_writel(spi, t);
		sunxi_spi_cpu_readl(spi, t);
		break;
	}
	default:
		return -1;
	}

	return 0;
}
#endif

/*
 * <= 64 : cpu mode transt
 * > 64  : dma mode transt
 * wait for done completion in this function, wakup in the irq hanlder
 * transt one message->transfer to slave devices
 */
static int sunxi_spi_transfer_one(struct spi_controller *master,
					struct spi_device *spi,
					struct spi_transfer *t)
{
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);
	void __iomem *base_addr = sspi->base_addr;
	unsigned char *tx_buf = (unsigned char *)t->tx_buf;
	unsigned char *rx_buf = (unsigned char *)t->rx_buf;
	unsigned long timeout = 0;
	int ret = 0;
	static int xfer_setup;

	dprintk(DEBUG_INFO, "[spi%d] begin transfer, txbuf %p, rxbuf %p, len %d\n",
		spi->master->bus_num, tx_buf, rx_buf, t->len);
	if ((!t->tx_buf && !t->rx_buf) || !t->len)
		return -EINVAL;

	if (!xfer_setup || spi->master->bus_num) {
		if (sunxi_spi_xfer_setup(spi, t) < 0)
			return -EINVAL;
		xfer_setup = 1;
	}

	/* write 1 to clear 0 */
	spi_clr_irq_pending(SPI_INT_STA_MASK, base_addr);
#if IS_ENABLED(CONFIG_DMA_ENGINE)
	/* disable all DRQ */
	spi_disable_dma_irq(SPI_FIFO_CTL_DRQEN_MASK, base_addr);
#endif
	/* reset tx/rx fifo */
	//spi_reset_fifo(base_addr);

	if (sunxi_spi_mode_check(sspi, spi, t))
		return -EINVAL;

	if (sspi->dbi_enabled) {
		spi_config_dbi(sspi, spi);
#if IS_ENABLED(CONFIG_DMA_ENGINE)
		spi_enable_dbi_dma(base_addr);
#endif
	} else {
		/* reset tx/rx fifo */
		spi_reset_fifo(base_addr);
		/*	1. Tx/Rx error irq,process in IRQ;
			2. Transfer Complete Interrupt Enable
		*/
		spi_enable_irq(SPI_INTEN_TC|SPI_INTEN_ERR, base_addr);
	}

	if ((debug_mask & DEBUG_INIT) && (debug_mask & DEBUG_DATA)) {
		dprintk(DEBUG_DATA, "[spi%d] dump reg:\n", sspi->master->bus_num);
		spi_dump_reg(sspi, 0, 0x40);
	}

#if IS_ENABLED(CONFIG_DMA_ENGINE)
	sunxi_spi_dma_transfer(spi, t);
#else
	sunxi_spi_cpu_transfer(spi, t);
#endif

	if ((debug_mask & DEBUG_INIT) && (debug_mask & DEBUG_DATA)) {
		dprintk(DEBUG_DATA, "[spi%d] dump reg:\n", sspi->master->bus_num);
		spi_dump_reg(sspi, 0, 0x40);
	}

	/* wait for xfer complete in the isr. */
	timeout = wait_for_completion_timeout(
				&sspi->done,
				msecs_to_jiffies(XFER_TIMEOUT));
	if (timeout == 0) {
		SPI_ERR("[spi%d] xfer timeout\n", spi->master->bus_num);
		ret = -1;
	} else if (sspi->result < 0) {
		SPI_ERR("[spi%d] xfer failed...\n", spi->master->bus_num);
		ret = -1;
	}

#if IS_ENABLED(CONFIG_DMA_ENGINE)
	/* release dma resource if necessary */
	sunxi_spi_release_dma(sspi, t);

	if (sspi->dbi_enabled)
		spi_disable_dbi_dma(base_addr);
#endif

	if (sspi->mode_type != MODE_TYPE_NULL)
		sspi->mode_type = MODE_TYPE_NULL;

	return ret;
}
#ifdef CONFIG_AW_MTD_SPINAND
/* tx_len : all data to transfer(single io tx data + quad io tx data)
 * stc_len: single io tx data*/
static void spi_set_bc_tc_stc2(u32 tx_len, u32 rx_len, u32 stc_len, u8 nbits, void __iomem *base_addr)
{
	u32 reg_val = readl(base_addr + SPI_BURST_CNT_REG);
	reg_val &= ~SPI_BC_CNT_MASK;
	reg_val |= (SPI_BC_CNT_MASK & (tx_len + rx_len));
	writel(reg_val, base_addr + SPI_BURST_CNT_REG);
	//SPI_DBG("\n-- BC = %d --\n", readl(base_addr + SPI_BURST_CNT_REG));

	reg_val = readl(base_addr + SPI_TRANSMIT_CNT_REG);
	reg_val &= ~SPI_TC_CNT_MASK;
	reg_val |= (SPI_TC_CNT_MASK & tx_len);
	writel(reg_val, base_addr + SPI_TRANSMIT_CNT_REG);
	//SPI_DBG("\n-- TC = %d --\n", readl(base_addr + SPI_TRANSMIT_CNT_REG));

	reg_val = readl(base_addr + SPI_BCC_REG);
	reg_val &= ~SPI_BCC_STC_MASK;
	reg_val |= (SPI_BCC_STC_MASK & stc_len);
	if (nbits == 2)
		reg_val |= SPI_BCC_DUAL_MODE;
	else
		reg_val &= ~SPI_BCC_DUAL_MODE;

	if (nbits == 4)
		reg_val |= SPI_BCC_QUAD_MODE;
	else
		reg_val &= ~SPI_BCC_QUAD_MODE;

	writel(reg_val, base_addr + SPI_BCC_REG);
	//SPI_DBG("\n-- STC = %d --\n", readl(base_addr + SPI_BCC_REG));
}


static int sunxi_spi_xfer_tx_rx(struct spi_device *spi, struct spi_transfer *tx, struct spi_transfer *rx)
{
#define SPI_FIFO_SIZE (64)
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);
	void __iomem *base_addr = sspi->base_addr;
	unsigned int xcnt = 0;
	unsigned int poll_time = 0;
	int ret = 0;

	unsigned tcnt = tx->len;
	unsigned rcnt = rx->len;

	char *txbuf = (char *)tx->tx_buf;
	char *rxbuf = (char *)rx->rx_buf;

	u8 nbits = 0;

	if (rx->rx_nbits == SPI_NBITS_DUAL)
		nbits = 2;
	else if (rx->rx_nbits == SPI_NBITS_QUAD)
		nbits = 4;
	else
		nbits = 1;


	spi_disable_irq(SPI_INTEN_MASK, base_addr);

	/* write 1 to clear 0 */
	spi_clr_irq_pending(SPI_INT_STA_MASK, base_addr);

	spi_set_bc_tc_stc2(tcnt, rcnt, tcnt, nbits, base_addr);

	/*
	* 1. Tx/Rx error irq,process in IRQ;
	* 2. Transfer Complete Interrupt Enable
	*/
	spi_enable_irq(SPI_INTEN_TC|SPI_INTEN_ERR, base_addr);

	spi_start_xfer(base_addr);

	if (tcnt) {

		/* >64 use DMA transfer, or use cpu */
		if (tcnt <= BULK_DATA_BOUNDARY) {
			xcnt = 0;
			poll_time = 0xfffff;
			dprintk(DEBUG_DATA, "[spi-%d]xfer2 tx --> by ahb\n", spi->master->bus_num);
			while (xcnt < tcnt) {
				while (((readl(base_addr + SPI_FIFO_STA_REG) >> 16) & 0x7f) >= SPI_FIFO_SIZE) {
					if (--poll_time < 0)
						return -ETIMEDOUT;
				}
				writeb(*(txbuf + xcnt), (base_addr + SPI_TXDATA_REG));
				xcnt++;
			}

		} else {
			dprintk(DEBUG_DATA, "[spi-%d]xfer2 tx -> by dma\n", spi->master->bus_num);
			/* txFIFO empty dma request enable */
			sunxi_spi_dma_tx_config(spi, tx);

		}
	}

	if (rcnt) {
		if (rcnt <= BULK_DATA_BOUNDARY) {
			xcnt = 0;
			poll_time = 0xfffff;
			dprintk(DEBUG_DATA, "[spi-%d]xfer2 rx --> by ahb\n", spi->master->bus_num);
			while (xcnt < rcnt) {
				if (((readl(base_addr + SPI_FIFO_STA_REG)) & 0x7f) && (--poll_time > 0)) {
					*(rxbuf + xcnt) = readb((base_addr + SPI_RXDATA_REG));
					xcnt++;
				}
			}
			if (poll_time <= 0) {
				SPI_ERR("cpu receive data timeout!\n");
				return -ETIMEDOUT;
			}
		} else {
			dprintk(DEBUG_INFO, "[spi-%d]xfer2 rx -> by dma\n", spi->master->bus_num);

			/* For Rx mode, the DMA end(not TC flag) is real end. */
			spi_disable_irq(SPI_INTEN_TC, base_addr);
			sunxi_spi_dma_rx_config(spi, rx);
		}
	}

	return ret;
}

/*
 * <= 64 : cpu ;  > 64 : dma
 * wait for done completion in this function, wakup in the irq hanlder
 */
static int sunxi_spi_transfer_two(struct spi_master *master, struct spi_device *spi,
			    struct spi_transfer *t, struct spi_transfer *t2)
{
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);
	unsigned long timeout = 0;
	int ret = 0;
	static int xfer_setup;

	if (!xfer_setup || spi->master->bus_num) {
		if (sunxi_spi_xfer_setup(spi, t) < 0)
			return -EINVAL;
		xfer_setup = 1;
	}

	if (t->tx_buf && t2->rx_buf)
		sunxi_spi_xfer_tx_rx(spi, t, t2);
	else {

		SPI_ERR("[spi%d] begin transfer, t1: txbuf %p, rxbuf %p, len %d t2:  txbuf %p, rxbuf %p, len %d t2:\n",
		spi->master->bus_num, t->tx_buf, t->rx_buf, t->len, t2->tx_buf, t2->rx_buf, t2->len);
		SPI_ERR("[spi%d] xfer mode not support\n", spi->master->bus_num);
		return -EINVAL;
	}


	if ((debug_mask & DEBUG_INIT) && (debug_mask & DEBUG_DATA)) {
		dprintk(DEBUG_DATA, "[spi%d] dump reg:\n", sspi->master->bus_num);
		spi_dump_reg(sspi, 0, 0x40);
	}

	/* wait for xfer complete in the isr. */
	timeout = wait_for_completion_timeout(
				&sspi->done,
				msecs_to_jiffies(XFER_TIMEOUT));
	if (timeout == 0) {
		SPI_ERR("[spi%d] xfer timeout\n", spi->master->bus_num);
		ret = -1;
	} else if (sspi->result < 0) {
		SPI_ERR("[spi%d] xfer failed...\n", spi->master->bus_num);
		ret = -1;
	}

	if (sspi->mode_type != MODE_TYPE_NULL)
		sspi->mode_type = MODE_TYPE_NULL;

	/*
	 *if (sspi->stx.state == TRANSFER_STATE) {
	 *        sunxi_spi_unmap_sg(spi->master, &sspi->stx.tx);
	 *        sspi->stx.state = INIT_STATE;
	 *}
	 */

	return ret;
}



/*
 * sunxi spi flash_transfer_one_message - Default implementation of transfer_one_message()
 *
 * This is a standard implementation of transfer_one_message() for
 * drivers which implement a transfer_one() operation.  It provides
 * standard handling of delays and chip select management.
 */
static int sunxi_spi_transfer_one_message(struct spi_master *master,
				    struct spi_message *msg)
{
	struct sunxi_spi *sspi = spi_master_get_devdata(master);
	void __iomem *base_addr = sspi->base_addr;
	struct spi_transfer *xfer;
	struct spi_transfer *cur_xfer = NULL;
	struct spi_transfer *prev_xfer = NULL;
	int xfer_cnt = 0;
	int xfer_n = 0;
	int ret = 0;
	struct spi_statistics *statm = &master->statistics;
	struct spi_statistics *stats = &msg->spi->statistics;


	SPI_STATISTICS_INCREMENT_FIELD(statm, messages);
	SPI_STATISTICS_INCREMENT_FIELD(stats, messages);


	list_for_each_entry(xfer, &msg->transfers, transfer_list) {

		spi_statistics_add_transfer_stats(statm, xfer, master);
		spi_statistics_add_transfer_stats(stats, xfer, master);

		xfer_cnt++;
		cur_xfer = xfer;

		if (prev_xfer && prev_xfer->tx_buf && !prev_xfer->rx_buf &&
				cur_xfer && cur_xfer->rx_buf && !cur_xfer->tx_buf) {
			/*tx->rx*/
			reinit_completion(&master->xfer_completion);

			ret = master->transfer_two(master, msg->spi, prev_xfer, cur_xfer);
			if (ret < 0) {
				SPI_STATISTICS_INCREMENT_FIELD(statm, errors);
				SPI_STATISTICS_INCREMENT_FIELD(stats, errors);
				SPI_ERR("[spi%d] SPI transfer failed: %d\n", sspi->master->bus_num, ret);
				goto out;
			}

			if (msg->status != -EINPROGRESS)
				goto out;

			msg->actual_length += prev_xfer->len;
			msg->actual_length += cur_xfer->len;
			prev_xfer = NULL;
			cur_xfer = NULL;
			xfer_cnt = 0;

		} else if (!prev_xfer) {
			prev_xfer = xfer;

		} else {
			/*single handle*/

			sunxi_spi_ss_ctrl(base_addr, true);
			master->set_cs(msg->spi, false);
			for (xfer_n = 0; xfer_n < xfer_cnt; xfer_n++) {
				if (xfer_n == 0)
					xfer = prev_xfer;
				else
					xfer = cur_xfer;

				reinit_completion(&master->xfer_completion);

				ret = master->transfer_one(master, msg->spi, xfer);
				if (ret < 0) {
					SPI_STATISTICS_INCREMENT_FIELD(statm,
							errors);
					SPI_STATISTICS_INCREMENT_FIELD(stats,
							errors);
					SPI_ERR("[spi%d] SPI transfer failed: %d\n", sspi->master->bus_num, ret);
					goto out;
				}

				if (msg->status != -EINPROGRESS)
					goto out;

				msg->actual_length += xfer->len;

			}

			master->set_cs(msg->spi, true);
			sunxi_spi_ss_ctrl(base_addr, false);
		}
	}

	/*do last xfer*/
	{
		if (prev_xfer && prev_xfer == cur_xfer) {
			reinit_completion(&master->xfer_completion);

			ret = master->transfer_one(master, msg->spi, cur_xfer);
			if (ret < 0) {
				SPI_STATISTICS_INCREMENT_FIELD(statm,
						errors);
				SPI_STATISTICS_INCREMENT_FIELD(stats,
						errors);
				SPI_ERR("[spi%d] SPI transfer failed: %d\n", sspi->master->bus_num, ret);
				goto out;
			}

			if (msg->status != -EINPROGRESS)
				goto out;

			msg->actual_length += cur_xfer->len;
			prev_xfer = NULL;
			cur_xfer = NULL;
			xfer_cnt = 0;
		}
	}

out:

	if (msg->status == -EINPROGRESS)
		msg->status = ret;

	if (msg->status && master->handle_err)
		master->handle_err(master, msg);

	spi_res_release(master, msg);

	spi_finalize_current_message(master);

	return ret;
}
#endif

/* wake up the sleep thread, and give the result code */
static irqreturn_t sunxi_spi_handler(int irq, void *dev_id)
{
	struct sunxi_spi *sspi = (struct sunxi_spi *)dev_id;
	void __iomem *base_addr = sspi->base_addr;
	unsigned int status = 0, enable = 0;
	unsigned long flags = 0;

	spin_lock_irqsave(&sspi->lock, flags);

	enable = spi_qry_irq_enable(base_addr);
	status = spi_qry_irq_pending(base_addr);
	spi_clr_irq_pending(status, base_addr);
	dprintk(DEBUG_INFO, "[spi%d] irq status = %x\n", sspi->master->bus_num, status);

	sspi->result = 0; /* assume succeed */

	if (sspi->mode) {
		if ((enable & SPI_INTEN_RX_RDY) && (status & SPI_INT_STA_RX_RDY)) {
			dprintk(DEBUG_INFO, "[spi%d] spi data is ready\n", sspi->master->bus_num);
			spi_disable_irq(SPI_INT_STA_RX_RDY, base_addr);
			wake_up_process(sspi->task);
			spin_unlock_irqrestore(&sspi->lock, flags);
			return IRQ_HANDLED;
		}
	}

	/* master mode, Transfer Complete Interrupt */
	if (status & SPI_INT_STA_TC) {
		dprintk(DEBUG_INFO, "[spi%d] SPI TC comes\n", sspi->master->bus_num);
		spi_disable_irq(SPI_INT_STA_TC | SPI_INT_STA_ERR, base_addr);

		/*wakup uplayer, by the sem */
		complete(&sspi->done);
		spin_unlock_irqrestore(&sspi->lock, flags);
		return IRQ_HANDLED;
	} else if (status & SPI_INT_STA_ERR) { /* master mode:err */
		SPI_ERR("[spi%d]  SPI ERR %#x comes\n", sspi->master->bus_num, status);
		/* error process, release dma in the workqueue,should not be here */
		spi_disable_irq(SPI_INT_STA_TC | SPI_INT_STA_ERR, base_addr);
		spi_soft_reset(base_addr);
		sspi->result = -1;
		complete(&sspi->done);
		spin_unlock_irqrestore(&sspi->lock, flags);
		return IRQ_HANDLED;
	}
	if (sspi->dbi_enabled) {
		status = dbi_qry_irq_pending(base_addr);
		dbi_clr_irq_pending(status, base_addr);
		dprintk(DEBUG_INFO, "[dbi%d] irq status = %x\n",
				sspi->master->bus_num, status);
		if ((status & DBI_INT_FIFO_EMPTY) && !(sspi->dbi_config->dbi_mode
					& SPI_DBI_TRANSMIT_VIDEO_)) {
			dprintk(DEBUG_INFO, "[spi%d] DBI Fram TC comes\n",
					sspi->master->bus_num);
			dbi_disable_irq(DBI_FIFO_EMPTY_INT_EN, base_addr);
			/*wakup uplayer, by the sem */
			complete(&sspi->done);
			spin_unlock_irqrestore(&sspi->lock, flags);
			return IRQ_HANDLED;
		} else if (((status & DBI_INT_TE_INT) ||
			    (status & DBI_INT_STA_FRAME)) &&
			   (sspi->dbi_config->dbi_mode & SPI_DBI_TRANSMIT_VIDEO_)) {
			if (sspi->dbi_config->dbi_vsync_handle &&
			    (status & DBI_INT_TE_INT))
				sspi->dbi_config->dbi_vsync_handle(
				    (unsigned long)sspi->spi);
			else
				dbi_disable_irq(DBI_FRAM_DONE_INT_EN, base_addr);
			complete(&sspi->done);
			spin_unlock_irqrestore(&sspi->lock, flags);
			return IRQ_HANDLED;
		} else {
			//TODO: Adapt to other states
			spin_unlock_irqrestore(&sspi->lock, flags);
			return IRQ_HANDLED;
		}
	}
	dprintk(DEBUG_INFO, "[spi%d] SPI NONE comes\n", sspi->master->bus_num);
	spin_unlock_irqrestore(&sspi->lock, flags);
	return IRQ_NONE;
}

static int sunxi_spi_setup(struct spi_device *spi)
{
	struct sunxi_spi *sspi = spi_master_get_devdata(spi->master);

	sspi->spi = spi;

	if (sunxi_spi_xfer_setup(spi, NULL) < 0)
		SPI_ERR("failed to xfer setup\n");

	return 0;
}

static bool sunxi_spi_can_dma(struct spi_master *master, struct spi_device *spi,
				 struct spi_transfer *xfer)
{
	return (xfer->len > BULK_DATA_BOUNDARY);
}

static int sunxi_spi_slave_cpu_tx_config(struct sunxi_spi *sspi)
{
	int ret = 0, i;
	u32 poll_time = 0x7ffffff;
	unsigned long timeout = 0;
	unsigned long flags = 0;
	int len = sspi->slave->head->len;
	int offset = sspi->slave->head->addr;

	if (offset > STORAGE_SIZE) {
		SPI_ERR("The data offset is greater than the storage size\n");
		return -1;
	}

	dprintk(DEBUG_INFO, "[spi%d] receive pkt head ok\n",
			sspi->master->bus_num);

	sspi->slave->data.len = (STORAGE_SIZE - offset) < len ?
				(STORAGE_SIZE - offset) : len;

	sspi->done.done = 0;
	spi_clr_irq_pending(SPI_INT_STA_MASK, sspi->base_addr);
	spi_disable_irq(SPI_INTEN_RX_RDY, sspi->base_addr);
	spi_reset_fifo(sspi->base_addr);
	spi_set_bc_tc_stc(0, 0, 0, 0, sspi->base_addr);
	spi_enable_irq(SPI_INTEN_TC|SPI_INTEN_ERR, sspi->base_addr);

	spin_lock_irqsave(&sspi->lock, flags);
	for (i = 0; i < sspi->slave->head->len; i++) {
		while ((spi_query_txfifo(sspi->base_addr) >= MAX_FIFU) && (--poll_time))
			;
		if (poll_time == 0) {
			dprintk(DEBUG_INFO, "[spi%d]cpu send data timeout\n",
						sspi->master->bus_num);
			goto err;
		}

		writeb(sspi->slave->data.storage[i + offset],
					sspi->base_addr + SPI_TXDATA_REG);
	}
	spin_unlock_irqrestore(&sspi->lock, flags);

	dprintk(DEBUG_DATA, "[debugging only] send data:\n");
	if (debug_mask & DEBUG_DATA)
		spi_dump_data(sspi->slave->data.storage + offset,
				sspi->slave->data.len);

	/* wait for xfer complete in the isr. */
	timeout = wait_for_completion_timeout(
				&sspi->done,
				msecs_to_jiffies(XFER_TIMEOUT));
	if (timeout == 0) {
		SPI_ERR("[spi%d] xfer timeout\n", sspi->master->bus_num);
		ret = -1;
		goto err;
	} else if (sspi->result < 0) {
		SPI_ERR("[spi%d] xfer failed...\n", sspi->master->bus_num);
		ret = -1;
		goto err;
	}

err:
	spi_clr_irq_pending(SPI_INT_STA_MASK, sspi->base_addr);
	spi_disable_irq(SPI_INTEN_TC|SPI_INTEN_ERR, sspi->base_addr);
#ifdef CONFIG_DMA_ENGINE
	spi_disable_dma_irq(SPI_FIFO_CTL_DRQEN_MASK, sspi->base_addr);
#endif
	spi_reset_fifo(sspi->base_addr);

	return ret;
}

static int sunxi_spi_slave_cpu_rx_config(struct sunxi_spi *sspi)
{
	int ret = 0, i;
	u32 poll_time = 0x7ffffff;
	int len = sspi->slave->head->len;
	int offset = sspi->slave->head->addr;

	if (offset > STORAGE_SIZE) {
		SPI_ERR("The data offset is greater than the storage size\n");
		return -1;
	}

	dprintk(DEBUG_INFO, "[spi%d] receive pkt head ok\n",
			sspi->master->bus_num);

	sspi->slave->data.len = (STORAGE_SIZE - offset) < len ?
				(STORAGE_SIZE - offset) : len;

	sspi->done.done = 0;

	spi_set_rx_trig(sspi->slave->data.len/2, sspi->base_addr);
	spi_enable_irq(SPI_INTEN_ERR|SPI_INTEN_RX_RDY, sspi->base_addr);
	spi_set_bc_tc_stc(0, 0, 0, 0, sspi->base_addr);

	for (i = 0; i < sspi->slave->data.len; i++) {
		while (!spi_query_rxfifo(sspi->base_addr) && (--poll_time > 0))
			;
		sspi->slave->data.storage[offset + i] =
			readb(sspi->base_addr + SPI_RXDATA_REG);
	}

	if (poll_time <= 0) {
		SPI_ERR("[spi%d] cpu receive pkt head time out!\n",
				sspi->master->bus_num);
		spi_reset_fifo(sspi->base_addr);
		ret = -1;
		goto err0;
	} else if (sspi->result < 0) {
		SPI_ERR("[spi%d] xfer failed...\n", sspi->master->bus_num);
		spi_reset_fifo(sspi->base_addr);
		ret = -1;
		goto err0;
	}

	dprintk(DEBUG_DATA, "[debugging only] receive data:\n");
	if (debug_mask & DEBUG_DATA)
		spi_dump_data(sspi->slave->data.storage + offset,
				sspi->slave->data.len);

err0:
	spi_clr_irq_pending(SPI_INT_STA_MASK, sspi->base_addr);
	spi_disable_irq(SPI_INTEN_TC|SPI_INTEN_ERR, sspi->base_addr);
#ifdef CONFIG_DMA_ENGINE
	spi_disable_dma_irq(SPI_FIFO_CTL_DRQEN_MASK, sspi->base_addr);
#endif
	spi_reset_fifo(sspi->base_addr);
	return ret;
}
static int sunxi_spi_slave_handle_head(struct sunxi_spi *sspi, u8 *buf)
{
	struct sunxi_spi_slave_head *head;
	int ret = 0;

	head = kzalloc(sizeof(*head), GFP_KERNEL);
	if (IS_ERR_OR_NULL(head)) {
		SPI_ERR("failed to alloc mem\n");
		ret = -ENOMEM;
		goto err0;
	}

	head->op_code = buf[OP_MASK];
	head->addr = (buf[ADDR_MASK_0] << 16) | (buf[ADDR_MASK_1] << 8) | buf[ADDR_MASK_2];
	head->len = buf[LENGTH_MASK];

	dprintk(DEBUG_INFO, "[spi%d] op=0x%x addr=0x%x len=0x%x\n",
			sspi->master->bus_num, head->op_code, head->addr, head->len);

	sspi->slave->head = head;

	if (head->len > 64) {
		dprintk(DEBUG_INFO, "[spi%d] length must less than 64 bytes\n", sspi->master->bus_num);
		ret = -1;
		goto err1;
	}

	if (head->op_code == SUNXI_OP_WRITE) {
		sunxi_spi_slave_cpu_rx_config(sspi);
	} else if (head->op_code == SUNXI_OP_READ) {
		sunxi_spi_slave_cpu_tx_config(sspi);
	} else {
		dprintk(DEBUG_INFO, "[spi%d] pkt head opcode err\n", sspi->master->bus_num);
		ret = -1;
		goto err1;
	}
err1:
	kfree(head);
err0:
	spi_clr_irq_pending(SPI_INT_STA_MASK, sspi->base_addr);
	spi_disable_irq(SPI_INTEN_RX_RDY, sspi->base_addr);
	spi_disable_irq(SPI_INTEN_TC|SPI_INTEN_ERR, sspi->base_addr);
	spi_reset_fifo(sspi->base_addr);

	return ret;
}

static int sunxi_spi_slave_task(void *data)
{
	u8 *pkt_head, i;
	u32 poll_time = 0x7ffffff;
	unsigned long flags = 0;
	struct sunxi_spi *sspi = (struct sunxi_spi *)data;

	pkt_head = kzalloc(HEAD_LEN, GFP_KERNEL);
	if (IS_ERR_OR_NULL(pkt_head)) {
		SPI_ERR("[spi%d] failed to alloc mem\n", sspi->master->bus_num);
		return -ENOMEM;
	}

	allow_signal(SIGKILL);

	while (!kthread_should_stop()) {
		spi_reset_fifo(sspi->base_addr);
		spi_clr_irq_pending(SPI_INT_STA_MASK, sspi->base_addr);
#if IS_ENABLED(CONFIG_DMA_ENGINE)
		spi_disable_dma_irq(SPI_FIFO_CTL_DRQEN_MASK, sspi->base_addr);
#endif
		spi_enable_irq(SPI_INTEN_ERR|SPI_INTEN_RX_RDY, sspi->base_addr);
		spi_set_rx_trig(HEAD_LEN, sspi->base_addr);
		spi_set_bc_tc_stc(0, 0, 0, 0, sspi->base_addr);

		dprintk(DEBUG_INFO, "[spi%d] receive pkt head init ok, sleep and wait for data\n", sspi->master->bus_num);
		set_current_state(TASK_INTERRUPTIBLE);
		schedule();

		dprintk(DEBUG_INFO, "[spi%d] data is come, wake up and receive pkt head\n", sspi->master->bus_num);

		for (i = 0; i < HEAD_LEN ; i++) {
			while (!spi_query_rxfifo(sspi->base_addr) && (--poll_time > 0))
				;
			pkt_head[i] =  readb(sspi->base_addr + SPI_RXDATA_REG);
		}

		if (poll_time <= 0) {
			SPI_ERR("[spi%d] cpu receive pkt head time out!\n", sspi->master->bus_num);
			spi_reset_fifo(sspi->base_addr);
			continue;
		} else if (sspi->result < 0) {
			SPI_ERR("[spi%d] xfer failed...\n", sspi->master->bus_num);
			spi_reset_fifo(sspi->base_addr);
			continue;
		}

		sunxi_spi_slave_handle_head(sspi, pkt_head);
	}

	spin_lock_irqsave(&sspi->lock, flags);
	sspi->task_flag = 1;
	spin_unlock_irqrestore(&sspi->lock, flags);

	kfree(pkt_head);

	return 0;
}

static int sunxi_spi_select_gpio_state(struct pinctrl *pctrl, char *name, u32 no)
{
	int ret = 0;
	struct pinctrl_state *pctrl_state = NULL;

	pctrl_state = pinctrl_lookup_state(pctrl, name);
	if (IS_ERR(pctrl_state)) {
		SPI_ERR("[spi%d] pinctrl_lookup_state(%s) failed! return %p\n", no, name, pctrl_state);
		return -1;
	}

	ret = pinctrl_select_state(pctrl, pctrl_state);
	if (ret < 0)
		SPI_ERR("[spi%d] pinctrl_select_state(%s) failed! return %d\n", no, name, ret);

	return ret;
}

static int sunxi_spi_request_gpio(struct sunxi_spi *sspi)
{
	int bus_no = sspi->pdev->id;

	sspi->pctrl = devm_pinctrl_get(&sspi->pdev->dev);
	if (IS_ERR(sspi->pctrl)) {
		SPI_ERR("[spi%d] devm_pinctrl_get() failed! return %ld\n",
				sspi->master->bus_num, PTR_ERR(sspi->pctrl));
		return -1;
	}

	return sunxi_spi_select_gpio_state(sspi->pctrl, PINCTRL_STATE_DEFAULT, bus_no);
}

/*
static void sunxi_spi_release_gpio(struct sunxi_spi *sspi)
{
	devm_pinctrl_put(sspi->pctrl);
	sspi->pctrl = NULL;
}
*/

static int sunxi_spi_resource_get(struct sunxi_spi *sspi)
{
	int ret;
	struct device_node *np = sspi->pdev->dev.of_node;
	struct sunxi_spi_platform_data *pdata = sspi->pdev->dev.platform_data;
	struct device *dev = &(sspi->pdev->dev);

	ret = spi_regulator_request(pdata, dev);
	if (ret < 0) {
		SPI_ERR("[spi%d] request regulator failed!\n", sspi->master->bus_num);
		return ret;
	}

	ret = of_property_read_u32(sspi->pdev->dev.of_node, "clock-frequency",
			&pdata->sclk_freq_def);
	if (ret) {
		SPI_ERR("[spi%d] Get clock-frequency property failed\n", sspi->master->bus_num);
		return -1;
	}

	ret = of_property_read_u32(np, "spi_slave_mode", &sspi->mode);
	if (sspi->mode)
		dprintk(DEBUG_INIT, "[spi%d] SPI SLAVE MODE\n", sspi->master->bus_num);
	else
		dprintk(DEBUG_INIT, "[spi%d] SPI MASTER MODE\n", sspi->master->bus_num);

	if (sunxi_spi_request_gpio(sspi) < 0) {
		SPI_ERR("[spi%d] Request GPIO failed!\n", sspi->master->bus_num);
		return -1;
	}
	sspi->pclk = devm_clk_get(&sspi->pdev->dev, "pll");
	if (IS_ERR_OR_NULL(sspi->pclk)) {
		SPI_ERR("[spi%d] Unable to acquire module clock '%s', return %x\n",
			sspi->master->bus_num, sspi->dev_name, PTR_RET(sspi->pclk));
		return -ENXIO;
	}

	sspi->mclk = devm_clk_get(&sspi->pdev->dev, "mod");
	if (IS_ERR_OR_NULL(sspi->mclk)) {
		SPI_ERR("[spi%d] Unable to acquire module clock '%s', return %x\n",
			sspi->master->bus_num, sspi->dev_name, PTR_RET(sspi->mclk));
		return -ENXIO;
	}

	sspi->bus_clk = devm_clk_get(&sspi->pdev->dev, "bus");
	if (IS_ERR_OR_NULL(sspi->bus_clk)) {
		SPI_ERR("[spi%d] Unable to acquire bus clock '%s', return %x\n",
			sspi->master->bus_num, sspi->dev_name, PTR_RET(sspi->bus_clk));
		return -ENXIO;
	}

	if (!sspi->reset) {
		sspi->reset = devm_reset_control_get(&sspi->pdev->dev, NULL);
		if (IS_ERR_OR_NULL(sspi->reset)) {
			SPI_ERR("[spi%d] Unable to acquire reset clock '%s', return %x\n",
				sspi->master->bus_num, sspi->dev_name, PTR_RET(sspi->reset));
			return -ENXIO;
		}
	}

	ret = of_property_read_u32(np, "sample_mode", &sspi->sample_mode);
	if (ret) {
		SPI_ERR("Failed to get sample mode\n");
		sspi->sample_mode = SAMP_MODE_DL_DEFAULT;
	}
	ret = of_property_read_u32(np, "sample_delay", &sspi->sample_delay);
	if (ret) {
		SPI_ERR("Failed to get sample delay\n");
		sspi->sample_delay = SAMP_MODE_DL_DEFAULT;
	}
	dprintk(DEBUG_INIT, "sample_mode:%d sample_delay:%d\n",
				sspi->sample_mode, sspi->sample_delay);

	return 0;
}

static int sunxi_spi_clk_init(struct sunxi_spi *sspi, u32 mod_clk)
{
	int ret = 0;
	long rate = 0;

	/*assert and deassert constitute a complete hardware reset operation*/
	ret = reset_control_assert(sspi->reset);
	if (ret != 0) {
		SPI_ERR("[spi%d] Unable to assert reset clock '%s', return %x\n",
			sspi->master->bus_num, sspi->dev_name, PTR_RET(sspi->mclk));
		return -ENXIO;
	}
	ret = reset_control_deassert(sspi->reset);
	if (ret != 0) {
		SPI_ERR("[spi%d] Unable to deassert reset clock '%s', return %x\n",
			sspi->master->bus_num, sspi->dev_name, PTR_RET(sspi->mclk));
		return -ENXIO;
	}

	if (clk_prepare_enable(sspi->pclk)) {
		SPI_ERR("[spi%d] Couldn't enable pll clock 'spi'\n", sspi->master->bus_num);
		goto err1;
	}

	ret = clk_set_parent(sspi->mclk, sspi->pclk);
	if (ret != 0) {
		SPI_ERR("[spi%d] clk_set_parent() failed! return %d\n",
			sspi->master->bus_num, ret);
		goto err2;
	}

	rate = clk_round_rate(sspi->mclk, mod_clk);
	if (clk_set_rate(sspi->mclk, rate)) {
		SPI_ERR("[spi%d] spi clk_set_rate failed\n", sspi->master->bus_num);
		goto err2;
	}

	dprintk(DEBUG_INIT, "[spi%d] mclk %u\n", sspi->master->bus_num, (unsigned)clk_get_rate(sspi->mclk));

	if (clk_prepare_enable(sspi->mclk)) {
		SPI_ERR("[spi%d] Couldn't enable module clock 'spi'\n", sspi->master->bus_num);
		goto err2;
	}

	if (clk_prepare_enable(sspi->bus_clk)) {
		SPI_ERR("[spi%d] Couldn't enable bus clock 'spi'\n", sspi->master->bus_num);
		goto err3;
	}

	return clk_get_rate(sspi->mclk);

err3:
	clk_disable_unprepare(sspi->bus_clk);
err2:
	clk_disable_unprepare(sspi->mclk);
err1:
	clk_disable_unprepare(sspi->pclk);

	return -1;
}

static int sunxi_spi_clk_exit(struct sunxi_spi *sspi)
{
	if (IS_ERR_OR_NULL(sspi->mclk)) {
		SPI_ERR("[spi%d] SPI mclk handle is invalid!\n", sspi->master->bus_num);
		return -1;
	}

	clk_disable_unprepare(sspi->bus_clk);
	clk_disable_unprepare(sspi->mclk);
	return 0;
}

static int sunxi_spi_hw_init(struct sunxi_spi *sspi,
		struct sunxi_spi_platform_data *pdata, struct device *dev)
{
	void __iomem *base_addr = sspi->base_addr;
	u32 sclk_freq_def = 0;
	int sclk_freq = 0;
	int bus_no = sspi->pdev->id;
#ifdef CONFIG_AW_MTD_SPINAND
	struct device_node *child = NULL;
	const char *st = NULL;
#endif

	spi_regulator_enable(pdata);

	sclk_freq = sunxi_spi_clk_init(sspi, pdata->sclk_freq_def);
	if (sclk_freq < 0) {
		SPI_ERR("[spi%d] sunxi_spi_clk_init(%s) failed!\n", sspi->master->bus_num, sspi->dev_name);
		return -1;
	}

	if (!sspi->dbi_enabled) {
		/* enable the spi module */
		spi_enable_bus(base_addr);
	}

	sunxi_spi_select_gpio_state(sspi->pctrl, PINCTRL_STATE_DEFAULT, bus_no);

	if (sspi->dbi_enabled) {
		spi_set_slave(base_addr);
		spi_set_dbi(base_addr);
		spi_enable_dbi(base_addr);
		spi_set_clk(10000000, sclk_freq, sspi);
		spi_enable_tp(base_addr);
	}
	if (!sspi->mode) {
		/* master: set spi module clock;
		 * set the default frequency	10MHz
		 */
		spi_set_master(base_addr);
		spi_set_clk(10000000, sclk_freq, sspi);
		/* master : set POL,PHA,SSOPL,LMTF,DDB,DHB; default: SSCTL=0,SMC=1,TBW=0. */
		spi_config_tc(1, SPI_MODE_0, base_addr);
		spi_enable_tp(base_addr);
		/* manual control the chip select */

#ifndef CONFIG_AW_MTD_SPINAND
		sunxi_spi_ss_ctrl(base_addr, true);
#else
		child = of_find_node_by_name(dev->of_node, "spi-nand");
		if (child)
			of_property_read_string(child, "status", &st);

		if (st && (!strcmp(st, "okay") || !strcmp(st, "ok"))) {
			sunxi_spi_ss_ctrl(base_addr, false);
		}
#endif
	} else {
		//slave
		spi_set_slave(base_addr);
		/* master : set POL,PHA,SSOPL,LMTF,DDB,DHB; default: SSCTL=0,SMC=1,TBW=0. */
		spi_config_tc(1, SPI_MODE_0, base_addr);
		spi_set_clk(sclk_freq_def, sclk_freq, sspi);

		if (sspi->sample_delay == SAMP_MODE_DL_DEFAULT) {
			if (sclk_freq_def >= SPI_HIGH_FREQUENCY)
				spi_sample_delay(0, 1, 0, base_addr);
			else if (sclk_freq_def <= SPI_LOW_FREQUENCY)
				spi_sample_delay(1, 0, 0, base_addr);
			else
				spi_sample_delay(0, 0, 0, base_addr);
		} else {
			spi_samp_mode_enable(1, base_addr);
			spi_samp_dl_sw_status(1, base_addr);
			spi_set_sample_mode(sspi->sample_mode, base_addr);
			spi_set_sample_delay(sspi->sample_delay, base_addr);
		}
	}

	/* reset fifo */
	spi_reset_fifo(base_addr);

	return 0;
}

static int sunxi_spi_hw_exit(struct sunxi_spi *sspi, struct sunxi_spi_platform_data *pdata)
{
	struct spi_master *master = sspi->master;

	/* release the  gpio */
	//sunxi_spi_release_gpio(sspi);
	sunxi_spi_select_gpio_state(sspi->pctrl, PINCTRL_STATE_SLEEP, master->bus_num);

	/* disable the spi controller */
	spi_disable_bus(sspi->base_addr);

	/* disable module clock */
	sunxi_spi_clk_exit(sspi);

	/* disable regulator */
	spi_regulator_disable(pdata);

	return 0;
}

static ssize_t sunxi_spi_info_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct platform_device *pdev = container_of(dev, struct platform_device, dev);
	struct sunxi_spi_platform_data *pdata = dev->platform_data;

	return snprintf(buf, PAGE_SIZE,
		"pdev->id   = %d\n"
		"pdev->name = %s\n"
		"pdev->num_resources = %u\n"
		"pdev->resource.mem = [%pa, %pa]\n"
		"pdev->resource.irq = %pa\n"
		"pdev->dev.platform_data.cs_num    = %d\n"
		"pdev->dev.platform_data.regulator = 0x%p\n"
		"pdev->dev.platform_data.regulator_id = %s\n",
		pdev->id, pdev->name, pdev->num_resources,
		&pdev->resource[0].start, &pdev->resource[0].end,
		&pdev->resource[1].start, pdata->cs_num, pdata->regulator,
		pdata->regulator_id);
}
static struct device_attribute sunxi_spi_info_attr =
	__ATTR(info, S_IRUGO, sunxi_spi_info_show, NULL);

static ssize_t sunxi_spi_status_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct spi_master *master = dev_get_drvdata(dev);
	struct sunxi_spi *sspi = (struct sunxi_spi *)&master[1];
	char const *spi_mode[] = {"Single mode, half duplex read",
				  "Single mode, half duplex write",
				  "Single mode, full duplex read and write",
				  "Dual mode, half duplex read",
				  "Dual mode, half duplex write",
				  "Null"};
	char const *busy_state[] = {"Unknown", "Free", "Suspend", "Busy"};
	char const *result_str[] = {"Success", "Fail"};
#if IS_ENABLED(CONFIG_DMA_ENGINE)
	char const *dma_dir[] = {"DMA NULL", "DMA read", "DMA write"};
#endif

	if (master == NULL)
		return snprintf(buf, PAGE_SIZE, "%s\n", "spi_master is NULL!");

	return snprintf(buf, PAGE_SIZE,
			"master->bus_num = %d\n"
			"master->num_chipselect = %d\n"
			"master->dma_alignment  = %d\n"
			"master->mode_bits = %d\n"
			"master->flags = 0x%x, ->bus_lock_flag = 0x%x\n"
			"master->busy = %d, ->running = %d, ->rt = %d\n"
			"sspi->mode_type = %d [%s]\n"
			"sspi->irq = %d [%s]\n"
#if IS_ENABLED(CONFIG_DMA_ENGINE)
			"sspi->dma_tx.dir = %d [%s]\n"
			"sspi->dma_rx.dir = %d [%s]\n"
#endif
			"sspi->busy = %d [%s]\n"
			"sspi->result = %d [%s]\n"
			"sspi->base_addr = 0x%p, the SPI control register:\n"
			"[VER] 0x%02x = 0x%08x, [GCR] 0x%02x = 0x%08x, [TCR] 0x%02x = 0x%08x\n"
			"[ICR] 0x%02x = 0x%08x, [ISR] 0x%02x = 0x%08x, [FCR] 0x%02x = 0x%08x\n"
			"[FSR] 0x%02x = 0x%08x, [WCR] 0x%02x = 0x%08x, [CCR] 0x%02x = 0x%08x\n"
			"[BCR] 0x%02x = 0x%08x, [TCR] 0x%02x = 0x%08x, [BCC] 0x%02x = 0x%08x\n"
			"[DMA] 0x%02x = 0x%08x, [TXR] 0x%02x = 0x%08x, [RXD] 0x%02x = 0x%08x\n",
			master->bus_num, master->num_chipselect, master->dma_alignment,
			master->mode_bits, master->flags, master->bus_lock_flag,
			master->busy, master->running, master->rt,
			sspi->mode_type, spi_mode[sspi->mode_type],
			sspi->irq, sspi->dev_name,
#if IS_ENABLED(CONFIG_DMA_ENGINE)
			sspi->dma_tx.dir, dma_dir[sspi->dma_tx.dir],
			sspi->dma_rx.dir, dma_dir[sspi->dma_rx.dir],
#endif
			sspi->busy, busy_state[sspi->busy],
			sspi->result, result_str[sspi->result],
			sspi->base_addr,
			SPI_VER_REG, readl(sspi->base_addr + SPI_VER_REG),
			SPI_GC_REG, readl(sspi->base_addr + SPI_GC_REG),
			SPI_TC_REG, readl(sspi->base_addr + SPI_TC_REG),
			SPI_INT_CTL_REG, readl(sspi->base_addr + SPI_INT_CTL_REG),
			SPI_INT_STA_REG, readl(sspi->base_addr + SPI_INT_STA_REG),

			SPI_FIFO_CTL_REG, readl(sspi->base_addr + SPI_FIFO_CTL_REG),
			SPI_FIFO_STA_REG, readl(sspi->base_addr + SPI_FIFO_STA_REG),
			SPI_WAIT_CNT_REG, readl(sspi->base_addr + SPI_WAIT_CNT_REG),
			SPI_CLK_CTL_REG, readl(sspi->base_addr + SPI_CLK_CTL_REG),
			SPI_BURST_CNT_REG, readl(sspi->base_addr + SPI_BURST_CNT_REG),

			SPI_TRANSMIT_CNT_REG, readl(sspi->base_addr + SPI_TRANSMIT_CNT_REG),
			SPI_BCC_REG, readl(sspi->base_addr + SPI_BCC_REG),
			SPI_DMA_CTL_REG, readl(sspi->base_addr + SPI_DMA_CTL_REG),
			SPI_TXDATA_REG, readl(sspi->base_addr + SPI_TXDATA_REG),
			SPI_RXDATA_REG, readl(sspi->base_addr + SPI_RXDATA_REG));
}
static struct device_attribute sunxi_spi_status_attr =
	__ATTR(status, S_IRUGO, sunxi_spi_status_show, NULL);

static void sunxi_spi_create_sysfs(struct platform_device *_pdev)
{
	device_create_file(&_pdev->dev, &sunxi_spi_info_attr);
	device_create_file(&_pdev->dev, &sunxi_spi_status_attr);
}

static void sunxi_spi_remove_sysfs(struct platform_device *_pdev)
{
	device_remove_file(&_pdev->dev, &sunxi_spi_info_attr);
	device_remove_file(&_pdev->dev, &sunxi_spi_status_attr);
}

static int sunxi_spi_probe(struct platform_device *pdev)
{
	struct device_node *np = pdev->dev.of_node;
	struct resource	*mem_res;
	struct sunxi_spi *sspi;
	struct sunxi_spi_platform_data *pdata;
	struct spi_master *master;
	struct sunxi_slave *slave = NULL;
	char spi_para[16] = {0};
	int ret = 0, err = 0, irq;
#ifdef CONFIG_AW_MTD_SPINAND
	struct device_node *child = NULL;
	const char *st = NULL;
#endif

	if (np == NULL) {
		SPI_ERR("SPI failed to get of_node\n");
		return -ENODEV;
	}

	pdev->id = of_alias_get_id(np, "spi");
	if (pdev->id < 0) {
		SPI_ERR("SPI failed to get alias id\n");
		return -EINVAL;
	}

#if IS_ENABLED(CONFIG_DMA_ENGINE)
	pdev->dev.dma_mask = &sunxi_spi_dma_mask;
	pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
#endif

	pdata = kzalloc(sizeof(struct sunxi_spi_platform_data), GFP_KERNEL);
	if (pdata == NULL) {
		SPI_ERR("SPI failed to alloc mem\n");
		return -ENOMEM;
	}
	pdev->dev.platform_data = pdata;

	mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (mem_res == NULL) {
		SPI_ERR("Unable to get spi MEM resource\n");
		ret = -ENXIO;
		goto err0;
	}

	irq = platform_get_irq(pdev, 0);
	if (irq < 0) {
		SPI_ERR("No spi IRQ specified\n");
		ret = -ENXIO;
		goto err0;
	}

	snprintf(spi_para, sizeof(spi_para), "spi%d_cs_number", pdev->id);
	ret = of_property_read_u32(np, spi_para, &pdata->cs_num);
	if (ret) {
		SPI_ERR("Failed to get cs_number property\n");
		ret = -EINVAL;
		goto err0;
	}


	/* create spi master */
	master = spi_alloc_master(&pdev->dev, sizeof(struct sunxi_spi));
	if (master == NULL) {
		SPI_ERR("Unable to allocate SPI Master\n");
		ret = -ENOMEM;
		goto err0;
	}


	platform_set_drvdata(pdev, master);
	sspi = spi_master_get_devdata(master);
	memset(sspi, 0, sizeof(struct sunxi_spi));

	sspi->master        = master;
#if IS_ENABLED(CONFIG_DMA_ENGINE)
	sspi->dma_rx.dir		= SPI_DMA_RWNULL;
	sspi->dma_tx.dir		= SPI_DMA_RWNULL;
#endif
	sspi->busy			= SPI_FREE;
	sspi->mode_type			= MODE_TYPE_NULL;
	sspi->irq			= irq;

	master->max_speed_hz		= SPI_MAX_FREQUENCY;
	master->dev.of_node		= pdev->dev.of_node;
	master->bus_num			= pdev->id;
	master->setup			= sunxi_spi_setup;
	master->can_dma			= sunxi_spi_can_dma;
	master->transfer_one		= sunxi_spi_transfer_one;
	master->use_gpio_descriptors	= true;
	master->set_cs			= sunxi_spi_set_cs;
	master->num_chipselect		= pdata->cs_num;
	master->bits_per_word_mask	= SPI_BPW_MASK(8);
	/* the spi->mode bits understood by this driver: */
	master->mode_bits	= SPI_CPOL | SPI_CPHA | SPI_CS_HIGH
				| SPI_LSB_FIRST | SPI_TX_DUAL | SPI_TX_QUAD
				| SPI_RX_DUAL | SPI_RX_QUAD;

#ifdef CONFIG_AW_MTD_SPINAND
	child = of_find_node_by_name(np, "spi-nand");
	if (child)
		of_property_read_string(child, "status", &st);

	if (st && (!strcmp(st, "okay") || !strcmp(st, "ok"))) {
		master->transfer_one_message = sunxi_spi_transfer_one_message;
		master->transfer_two = sunxi_spi_transfer_two;

	}
#endif
    
	ret = of_property_read_u32(np, "spi_dbi_enable", &sspi->dbi_enabled);
	if (ret)
		sspi->dbi_enabled = 0;
	else
		dprintk(DEBUG_INIT, "[spi%d] SPI DBI INTERFACE\n", sspi->master->bus_num);

	if (sspi->dbi_enabled)
		sspi->dbi_config = kzalloc(sizeof(struct spi_dbi_config), GFP_KERNEL);

	snprintf(sspi->dev_name, sizeof(sspi->dev_name), SUNXI_SPI_DEV_NAME"%d", pdev->id);

	err = devm_request_irq(&pdev->dev, irq, sunxi_spi_handler, 0,
			sspi->dev_name, sspi);
	if (err) {
		SPI_ERR("[spi%d] Cannot request IRQ\n", sspi->master->bus_num);
		ret = -EINVAL;
		goto err1;
	}

	if (request_mem_region(mem_res->start,
			resource_size(mem_res), pdev->name) == NULL) {
		SPI_ERR("[spi%d] Req mem region failed\n", sspi->master->bus_num);
		ret = -ENXIO;
		goto err2;
	}

	sspi->base_addr = ioremap(mem_res->start, resource_size(mem_res));
	if (sspi->base_addr == NULL) {
		SPI_ERR("[spi%d] Unable to remap IO\n", sspi->master->bus_num);
		ret = -ENXIO;
		goto err3;
	}

	sspi->base_addr_phy = mem_res->start;
	sspi->pdev = pdev;
	pdev->dev.init_name = sspi->dev_name;

	err = sunxi_spi_resource_get(sspi);
	if (err) {
		SPI_ERR("[spi%d] resource get error\n", sspi->master->bus_num);
		ret = -EINVAL;
		goto err1;
	}

	/* Setup Deufult Mode */
	ret = sunxi_spi_hw_init(sspi, pdata, &pdev->dev);
	if (ret != 0) {
		SPI_ERR("[spi%d] spi hw init failed!\n", sspi->master->bus_num);
		ret = -EINVAL;
		goto err4;
	}

	spin_lock_init(&sspi->lock);
	init_completion(&sspi->done);

	if (sspi->mode) {
		slave = kzalloc(sizeof(*slave), GFP_KERNEL);
		if (IS_ERR_OR_NULL(slave)) {
			SPI_ERR("[spi%d] failed to alloc mem\n", sspi->master->bus_num);
			ret = -ENOMEM;
			goto err5;
		}
		slave->data.storage = kzalloc(STORAGE_SIZE, GFP_KERNEL);
		if (IS_ERR_OR_NULL(slave->data.storage)) {
			SPI_ERR("failed to alloc mem\n");
			ret = -ENOMEM;
			goto err0;
		}
		sspi->slave = slave;
		sspi->task = kthread_create(sunxi_spi_slave_task, sspi, "spi_slave");
		if (IS_ERR(sspi->task)) {
			SPI_ERR("[spi%d] unable to start kernel thread.\n", sspi->master->bus_num);
			ret = PTR_ERR(sspi->task);
			sspi->task = NULL;
			ret = -EINVAL;
			goto err6;
		}

		wake_up_process(sspi->task);
	} else {
		if (spi_register_master(master)) {
			SPI_ERR("[spi%d] cannot register SPI master\n", sspi->master->bus_num);
			ret = -EBUSY;
			goto err6;
		}
	}

	sunxi_spi_create_sysfs(pdev);

	dprintk(DEBUG_INFO, "[spi%d] loaded for Bus with %d Slaves at most\n",
		master->bus_num, master->num_chipselect);
	dprintk(DEBUG_INIT, "[spi%d]: driver probe succeed, base %px, irq %d\n",
		master->bus_num, sspi->base_addr, sspi->irq);
	return 0;

err6:
	if (sspi->mode)
		if (!IS_ERR_OR_NULL(slave))
			kfree(slave);
err5:
	sunxi_spi_hw_exit(sspi, pdev->dev.platform_data);

err4:
	iounmap(sspi->base_addr);
err3:
	release_mem_region(mem_res->start, resource_size(mem_res));
err2:
	free_irq(sspi->irq, sspi);
err1:
	if (sspi->dbi_enabled)
		kfree(sspi->dbi_config);
	platform_set_drvdata(pdev, NULL);
	spi_master_put(master);
err0:
	kfree(pdev->dev.platform_data);

	return ret;
}

static int sunxi_spi_remove(struct platform_device *pdev)
{
	struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
	struct sunxi_spi *sspi = spi_master_get_devdata(master);
	struct resource	*mem_res;
	unsigned long flags;

	spin_lock_irqsave(&sspi->lock, flags);
	sspi->busy |= SPI_FREE;
	spin_unlock_irqrestore(&sspi->lock, flags);

	while (sspi->busy & SPI_BUSY)
		msleep(10);

	sunxi_spi_remove_sysfs(pdev);
	spi_unregister_master(master);

	if (sspi->mode)
		if (!sspi->task_flag)
			if (!IS_ERR(sspi->task))
				kthread_stop(sspi->task);

	sunxi_spi_hw_exit(sspi, pdev->dev.platform_data);
	iounmap(sspi->base_addr);

	mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (mem_res != NULL)
		release_mem_region(mem_res->start, resource_size(mem_res));
	free_irq(sspi->irq, sspi);

	if (sspi->dbi_enabled)
		kfree(sspi->dbi_config);

	platform_set_drvdata(pdev, NULL);
	spi_master_put(master);
	kfree(pdev->dev.platform_data);

	return 0;
}

#if IS_ENABLED(CONFIG_PM)
static int sunxi_spi_suspend(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
	struct sunxi_spi *sspi = spi_master_get_devdata(master);
	unsigned long flags;

	spin_lock_irqsave(&sspi->lock, flags);
	sspi->busy |= SPI_SUSPND;
	spin_unlock_irqrestore(&sspi->lock, flags);

	while (sspi->busy & SPI_BUSY)
		msleep(10);

	sunxi_spi_hw_exit(sspi, pdev->dev.platform_data);

	dprintk(DEBUG_SUSPEND, "[spi%d] suspend finish\n", master->bus_num);

	return 0;
}

static int sunxi_spi_resume(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
	struct sunxi_spi  *sspi = spi_master_get_devdata(master);
	unsigned long flags;

	sunxi_spi_hw_init(sspi, pdev->dev.platform_data, dev);

	spin_lock_irqsave(&sspi->lock, flags);
	sspi->busy = SPI_FREE;
	spin_unlock_irqrestore(&sspi->lock, flags);
	dprintk(DEBUG_SUSPEND, "[spi%d] resume finish\n", master->bus_num);

	return 0;
}

static const struct dev_pm_ops sunxi_spi_dev_pm_ops = {
	.suspend = sunxi_spi_suspend,
	.resume  = sunxi_spi_resume,
};

#define SUNXI_SPI_DEV_PM_OPS (&sunxi_spi_dev_pm_ops)
#else
#define SUNXI_SPI_DEV_PM_OPS NULL
#endif /* CONFIG_PM */

static const struct of_device_id sunxi_spi_match[] = {
	{ .compatible = "allwinner,sun8i-spi", },
	{ .compatible = "allwinner,sun20i-spi", },
	{ .compatible = "allwinner,sun50i-spi", },
	{},
};
MODULE_DEVICE_TABLE(of, sunxi_spi_match);


static struct platform_driver sunxi_spi_driver = {
	.probe   = sunxi_spi_probe,
	.remove  = sunxi_spi_remove,
	.driver = {
		.name	= SUNXI_SPI_DEV_NAME,
		.owner	= THIS_MODULE,
		.pm		= SUNXI_SPI_DEV_PM_OPS,
		.of_match_table = sunxi_spi_match,
	},
};

static int __init sunxi_spi_init(void)
{
	return platform_driver_register(&sunxi_spi_driver);
}

static void __exit sunxi_spi_exit(void)
{
	platform_driver_unregister(&sunxi_spi_driver);
}

fs_initcall_sync(sunxi_spi_init);
module_exit(sunxi_spi_exit);
module_param_named(debug, debug_mask, int, 0664);

MODULE_AUTHOR("pannan");
MODULE_DESCRIPTION("SUNXI SPI BUS Driver");
MODULE_ALIAS("platform:"SUNXI_SPI_DEV_NAME);
MODULE_LICENSE("GPL");

-------------------------------------------------------------------

https://www.cnblogs.com/cxd2014/p/uboot.html
问题4:

  当Uboot启动后出现无限重启状态并打印出一下信息:

  data abort
  pc : [<57e141a8>]          lr : [<57e09964>]
  sp : 57ffff9c  ip : 00000015     fp : fe8f73ac
  r10: 7f4af2dd  r9 : 075afcd2     r8 : 25ff46db
  r7 : 63a7bb97  r6 : dbcb1ef5     r5 : 57e33e80  r4 : 00001298
  r3 : 57e34158  r2 : 57e30230     r1 : 00000064  r0 : ffffffff
  Flags: NzCv  IRQs off  FIQs off  Mode SVC_32
  Resetting CPU ...

这是因为程序调用到了一个没有程序的内存位置:pc的值是cpu当前执行指令的内存地址(也就是程序出错的地方)

  lr的值是调用程序的内存地址

通过这两个值我们可以地位到当前程序执行的位置以及是哪个调用程序使pc值为当前值。

找到这个,但是不知道如何定位。

#21 Re: 全志 SOC » t113s3在uboot里选中了disp2_sunxi,设备树选了个tft08006,我在驱动里加了个死循环,结果没停下来... » 2025-01-04 17:19:36

查了下spi_xfer这个函数,第二个参数是位数,我发送一个字节,应该是8。第三个参数也修改为SPI_XFER_ONCE。

tatic void st7789v_spi_write_cmd(u8 value)
{
    spi_dc_0;
    uint8_t tx_buf[1] = {value};
    uint8_t rx_buf[1];
    // spi_xfer(spi, 8, tx_buf, rx_buf, 0);
    spi_xfer(spi, 8, tx_buf, rx_buf, SPI_XFER_ONCE);
    spi_dc_1;
}

这次注意屏幕,感觉屏其实是被初始化了,能出现雪花屏。只是uboot卡到这里就不动了。

============                                                                                                
st7789 lcd open flowr                                                                                       
============                                                                                                
FDT ERROR:fdt_get_all_pin:get property handle pinctrl-0 error:FDT_ERR_INTERNAL                              
disp_sys_pin_set_state, fdt_set_all_pin, ret=-1                                                             
[00.603]set disp.fb0_rot_used fail. using defval=0                                                          
[00.608]set disp.fb0_rot_degree fail. using defval=0                                                        
[00.612]boot_gui_init:finish                                                                                
partno erro : can't find partition bootloader                                                               
[00.620]bmp_name=bootlogo.bmp size 84870                                                                    
data abort                                                                                                  
pc : [<47f0bb22>]          lr : [<47f0baeb>]                                                                
reloc pc : [<43042b22>]    lr : [<43042aeb>]                                                                
sp : 43e66ce0  ip : 00000000     fp : 00000000                                                              
r10: 47fb4924  r9 : 43ea8e70     r8 : 00000000                                                              
r7 : 43e66d0c  r6 : 43e66d08     r5 : 00000000  r4 : eb00007d                                               
r3 : 0000002a  r2 : 80000000     r1 : 43e66d09  r0 : 47fb4914                                               
Flags: nZcv  IRQs on  FIQs off  Mode SVC_32                                                                 
Code: 2e00d057 46a8bf14 0800f04f bf082f00 (69232500)                                                        
partno erro : can't find partition bootloader                                                               
[01.480]bmp_name=bootlogo.bmp size 84870                                                                    
fb_lock: fb_id(0), lock=2                                                                                   
cv=00000000, base= 00000000                                                                                 
[01.491]show bmp on fb failed !-1                                                                           
[01.844]LCD open finish                              

#22 Re: 全志 SOC » t113s3在uboot里选中了disp2_sunxi,设备树选了个tft08006,我在驱动里加了个死循环,结果没停下来... » 2025-01-04 16:37:37

尝试改为硬件spi发送数据。
uboot里照抄spi0部分增加了spi1。

&spi1_pins_a {
	allwinner,pins = "PD11", "PD12", "PD13";
	allwinner,pname = "spi1_sclk", "spi1_mosi",
			"spi1_miso";
	allwinner,function = "spi1";
	allwinner,muxsel = <4>;
	allwinner,drive = <1>;
	allwinner,pull = <0>;
};

&spi1_pins_b {
	allwinner,pins = "PD10";
	allwinner,pname = "spi1_cs0";
	allwinner,function = "spi1";
	allwinner,muxsel = <4>;
	allwinner,drive = <1>;
	allwinner,pull = <1>;   // only CS should be pulled up
};

&spi1_pins_c {
	allwinner,pins = "PD10", "PD11", "PD12", "PD13";
	allwinner,function = "gpio_in";
	allwinner,muxsel = <0>;
	allwinner,drive = <1>;
	allwinner,pull = <0>;
};

&spi1 {
	clock-frequency = <100000000>;
	pinctrl-0 = <&spi1_pins_a &spi1_pins_b>;
	pinctrl-1 = <&spi1_pins_c>;
	pinctrl-names = "default", "sleep";
	spi_slave_mode = <0>;
    spi_dbi_enable = <0>;
	status = "okay";
};

在st7789v.c里,增加了spi初始化部分:

static void lcd_panel_st7789v_init(void)
{
    int ret;
    spi = spi_setup_slave(1, 0, 12000000, SPI_MODE_0);
    if (!spi)
    {
        printf("SPI setup failed\n");
        // return -1;
    }
    // ret = spi_get_bus_and_cs(1, 0, 12000000, SPI_MODE_0, "spi_generic", "spi_generic", &dev, &spi);
    ret = spi_claim_bus(spi);
    if (ret)
    {
        printf("SPI claim failed\n");
    }
...

向屏幕发送数据这里调用了spi发送函数:

static void st7789v_spi_write_cmd(u8 value)
{
    spi_dc_0;
    uint8_t tx_buf[1] = {value};
    uint8_t rx_buf[1];
    spi_xfer(spi, 1, tx_buf, rx_buf, 0);
    // spi_write(spi, tx_buf, 1);
    spi_dc_1;
}

结果uboot启动过程中就报错:

[00.446]drv_disp_init                                                                                       
[00.456]get fdt s_pwm.pwm-base fail                                                                         
fdt get node offset faill: hdmi                                                                             
[00.462]drv_disp_init finish                                                                                
[00.467]Loading Environment from SUNXI_FLASH... OK                                                          
[00.480]boot_gui_init:start                                                                                 
[00.483]set disp.dev2_output_type fail. using defval=0                                                      
============                                                                                                
st7789 lcd open flowr                                                                                       
============                                                                                                
FDT ERROR:fdt_get_all_pin:get property handle pinctrl-0 error:FDT_ERR_INTERNAL                              
disp_sys_pin_set_state, fdt_set_all_pin, ret=-1                                                             
[00.504]set disp.fb0_rot_used fail. using defval=0                                                          
[00.509]set disp.fb0_rot_degree fail. using defval=0                                                        
[00.513]boot_gui_init:finish                                                                                
partno erro : can't find partition bootloader                                                               
[00.521]bmp_name=bootlogo.bmp size 84870                                                                    
data abort                                                                                                  
pc : [<47f0bb22>]          lr : [<47ef1041>]                                                                
reloc pc : [<43042b22>]    lr : [<43028041>]                                                                
sp : 43e66ce0  ip : 00000000     fp : 00000000                                                              
r10: 47fb4924  r9 : 43ea8e70     r8 : 00000000                                                              
r7 : 43e66d0c  r6 : 43e66d08     r5 : 00000000  r4 : eb00007d                                               
r3 : 00000000  r2 : 00000000     r1 : 00000000  r0 : 00000000                                               
Flags: nZcv  IRQs on  FIQs off  Mode SVC_32                                                                 
Code: 2e00d057 46a8bf14 0800f04f bf082f00 (69232500)                                                        
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
SPI_ISR time_out                                                                                            
partno erro : can't find partition bootloader                                                               
[06.679]bmp_name=bootlogo.bmp size 84870                                                                    
fb_lock: fb_id(0), lock=2                                                                                   
cv=00000000, base= 00000000                                                                                 
[06.690]show bmp on fb failed !-1                                                                           
[07.043]LCD open finish    

然后就卡到这里了。

#23 Re: 全志 SOC » 自制T113-I 核心板一次成功开机 » 2025-01-04 08:57:47

as86455011 说:
vigour1000 说:

使用几层板

盘中孔,6层以上了。

好奇如何看出这个板子用了盘中孔工艺?

---------------------------------------------

https://www.jlc.com/portal/q7i38630.html
搜了下,看到嘉立创的盘中孔、过孔盖油、过孔塞油这三者的图片,能感觉出区别了。
不过0.2mm的过孔,估计过孔塞油和盘中孔看不出区别吧?猜测。

#24 Re: 全志 SOC » T113-i应用工业控制的一些设计优化 » 2025-01-04 08:36:07

请教个问题,我看官方原理图是接了两片ddr3的,第一片ddr3接了cs0和cs1管脚,第二片只接了cs1管脚。
为什么不是第一片接cs0,第二片接cs1呢?
还有,我搜了几个ddr3的手册,都是只有一个cs管脚。
望解惑。

另,t113i的焊盘间距是0.65mm的,我看官方板是用0.2/0.4的过孔。嘉立创0.3以下的过孔都要额外收费,0.2mm/0.25mm的过孔都是加100。不止这个,0.3以下过孔的板,会强制勾选过孔塞油,四线低阻过孔测试。这两项各需100元。那打个板就300起步了,个人做板玩一下的话门槛有点高了。要是能不勾选过孔塞油和四线低阻过孔测试就好了。

#25 Re: 全志 SOC » t113s3在uboot里选中了disp2_sunxi,设备树选了个tft08006,我在驱动里加了个死循环,结果没停下来... » 2025-01-03 13:33:13

折腾的目的,是为了在上电时能刷出来个开机画面来。
发现uboot命令行里有个命令:logo,修改了里面调用的函数,显示数据时,调用spi lcd的数据发送函数,虽然是软件模拟spi发送的:

int show_bmp_on_fb(char *bmp_head_addr, unsigned int fb_id)
{
#if defined(CONFIG_BOOT_GUI)
	struct bmp_image *bmp = (struct bmp_image *)bmp_head_addr;
	struct canvas *cv = NULL;
	char *src_addr;
	int src_width, src_height, src_stride, src_cp_bytes;
	char *dst_addr_b, *dst_addr_e;
	rect_t dst_crop;
	int need_set_bg = 0;

	cv = fb_lock(fb_id);
	if ((!cv) || (!cv->base)) {
		printf("cv=%p, base= %p\n", cv, (cv) ? cv->base : 0x0);
		goto err_out;
	}
	if ((bmp->header.signature[0] != 'B') ||
	    (bmp->header.signature[1] != 'M')) {
		printf("this is not a bmp picture\n");
		goto err_out;
	}
	if ((bmp->header.bit_count != 16) && (bmp->header.bit_count != 24)
			&& (bmp->header.bit_count != 32)) {
		printf("no support %d bit bmp\n", bmp->header.bit_count);
		goto err_out;
	}

	src_width = bmp->header.width;
	if (bmp->header.height & 0x80000000)
		src_height = -bmp->header.height;
	else
		src_height = bmp->header.height;
	if ((src_width > cv->width) || (src_height > cv->height)) {
		printf("no support big size bmp[%dx%d] on fb[%dx%d]\n",
		       src_width, src_height, cv->width, cv->height);
		goto err_out;
	}

	src_cp_bytes = src_width * bmp->header.bit_count >> 3;
	src_stride = ((src_width * bmp->header.bit_count + 31) >> 5) << 2;
	src_addr = (char *)(bmp_head_addr + bmp->header.data_offset);
	if (!(bmp->header.height & 0x80000000)) {
		src_addr += (src_stride * (src_height - 1));
		src_stride = -src_stride;
	}

	dst_crop.left = (cv->width - src_width) >> 1;
	dst_crop.right = dst_crop.left + src_width;
	dst_crop.top = (cv->height - src_height) >> 1;
	dst_crop.bottom = dst_crop.top + src_height;
    LCD_Address_Set(dst_crop.left, dst_crop.top, dst_crop.right, dst_crop.bottom);

	dst_addr_b = (char *)cv->base + cv->stride * dst_crop.top +
		     (dst_crop.left * cv->bpp >> 3);
	dst_addr_e = dst_addr_b + cv->stride * src_height;

	need_set_bg = cv->set_interest_region(cv, &dst_crop, 1, NULL);
	if (need_set_bg != 0) {
		if (src_width != cv->width) {
			debug("memset full fb\n");
			memset((void *)(cv->base), 0, cv->stride * cv->height);
		} else if (dst_crop.top != 0) {
			debug("memset top fb\n");
			memset((void *)(cv->base), 0,
			       cv->stride * dst_crop.top);
		}
	}

	if (cv->bpp == bmp->header.bit_count) {
		for (; dst_addr_b != dst_addr_e; dst_addr_b += cv->stride) {
            char *c_b = src_addr;
            char *c_end = c_b + src_cp_bytes;
            uint16_t rgb;
			memcpy((void *)dst_addr_b, (void *)src_addr,
			       src_cp_bytes);
			src_addr += src_stride;
            for (; c_b < c_end;)
            {
                rgb = ((*(c_b+2) & 0xF8) << 8) | ((*(c_b+1) & 0xFc) << 3) | ((*c_b & 0xF8) >> 3);
                st7789v_spi_write_data(rgb >> 8);
                st7789v_spi_write_data(rgb);
                c_b += 4;
            }
		}
	} else {
		if ((bmp->header.bit_count == 24) && (cv->bpp == 32)) {
			for (; dst_addr_b != dst_addr_e;
			     dst_addr_b += cv->stride) {
				int *d = (int *)dst_addr_b;
				char *c_b = src_addr;
				char *c_end = c_b + src_cp_bytes;
                uint16_t rgb;

				for (; c_b < c_end;) {
					*d++ = 0xFF000000 |
					       ((*(c_b + 2)) << 16) |
					       ((*(c_b + 1)) << 8) | (*c_b);
                    rgb = ((*(c_b+2) & 0xF8) << 8) | ((*(c_b+1) & 0xFc) << 3) | ((*c_b & 0xF8) >> 3);
                    st7789v_spi_write_data(rgb >> 8);
                    st7789v_spi_write_data(rgb);
					c_b += 3;
				}
				src_addr += src_stride;
			}
		} else if ((bmp->header.bit_count == 16) && (cv->bpp == 32)) {
			uint16_t rgb565;
			for (; dst_addr_b != dst_addr_e;
			     dst_addr_b += cv->stride) {
				int *d = (int *)dst_addr_b;
				char *c_b = src_addr;
				char *c_end = c_b + src_cp_bytes;

				for (; c_b < c_end;) {
					rgb565 = *(c_b + 1) << 8 | *c_b;
					*d++ = 0xFF000000 |
					       (((rgb565 & 0xf800) >> 8) << 16) |
					       (((rgb565 & 0x07e0) >> 3) << 8) |
					       ((rgb565 & 0x001f) << 3);
                    st7789v_spi_write_data(*(c_b+1));
                    st7789v_spi_write_data(*c_b);
					c_b += 2;
				}
				src_addr += src_stride;
			}
		} else {
			printf("no support %dbit bmp picture on %dbit fb\n",
			       bmp->header.bit_count, cv->bpp);
		}
	}
	if (need_set_bg != 0) {
		if ((cv->height != dst_crop.bottom) &&
		    (src_width == cv->width)) {
			debug("memset bottom fb\n");
			memset(
			    (void *)(cv->base + cv->stride * dst_crop.bottom),
			    0, cv->stride * (cv->height - dst_crop.bottom));
		}
	}

	if (cv->bpp == 32)
		fb_set_alpha_mode(fb_id, FB_GLOBAL_ALPHA_MODE, 0xFF);

	fb_unlock(fb_id, NULL, 1);
	save_disp_cmd();

	return 0;

err_out:
	if (cv)
		fb_unlock(fb_id, NULL, 0);
	return -1;
#else
	printf("Fail to show bmp! You need to enable CONFIG_BOOT_GUI\n");
	return -1;
#endif
}

这样,uboot命令行里,执行logo命令时,spi lcd屏上就刷出来bootlogo.bmp画面了。
尝试在st7789v的初始化函数后边,调用

sunxi_bmp_display("bootlogo.bmp");

结果却没效果。
网上搜其他方法,在uboot的main_loop()之前,调用run_command()命令:

static int run_main_loop(void)
     1 {
     2 #ifdef CONFIG_SANDBOX
     3     sandbox_main_loop_init();
     4 #endif
     5     run_command("logo", 0);
     6     /* main_loop() can return to retry autoboot, if so just run it again */
     7     for (;;)
     8         main_loop();
     9     return 0;
    10 }

目前可以在uboot启动后刷出开机画面了,只不过感觉有点晚。上电后大概2秒时完成了屏的初始化,出现了雪花屏,然后再过了大约1秒,开机画面才刷出来。
还有,目前用的st7789v.c,里边时软件模拟spi,刷画面有点慢。

#26 Re: 全志 SOC » t113s3在uboot里选中了disp2_sunxi,设备树选了个tft08006,我在驱动里加了个死循环,结果没停下来... » 2025-01-02 13:14:45

设置打印更详细的信息,如下:

U-Boot 2018.07-ge987def5-dirty (Jan 02 2025 - 13:05:01 +0800) Allwinner Technology                          
                                                                                                            
[00.319]CPU:   Allwinner Family                                                                             
[00.322]Model: sun8iw20                                                                                     
I2C:   FDT ERROR:fdt_set_all_pin:[twi0]-->FDT_ERR_BADPATH                                                   
FDT ERROR:fdt_set_all_pin:[twi1]-->FDT_ERR_BADPATH                                                          
ready                                                                                                       
[00.343]DRAM:  128 MiB                                                                                      
[00.346]Relocation Offset is: 04eca000                                                                      
[00.371]secure enable bit: 0                                                                                
[00.373]smc_tee_inform_fdt failed with: ffff000a                                                            
[00.379]CPU=1008 MHz,PLL6=600 Mhz,AHB=200 Mhz, APB1=100Mhz  MBus=300Mhz                                     
[00.385]gic: sec monitor mode                                                                               
sunxi flash map init                                                                                        
[00.390]flash init start                                                                                    
[00.392]workmode = 0,storage type = 2                                                                       
[00.396][mmc]: mmc driver ver uboot2018:2021-12-20 13:35:00                                                 
[00.402][mmc]: SUNXI SDMMC Controller Version:0x50310                                                       
[00.429][mmc]: Best spd md: 2-HSDDR52/DDR50, freq: 2-50000000, Bus width: 4                                 
[00.435]sunxi flash init ok                                                                                 
[00.438]line:703 init_clocks                                                                                
[00.441]drv_disp_init                                                                                       
[00.451]get fdt s_pwm.pwm-base fail                                                                         
fdt get node offset faill: hdmi                                                                             
[00.457]drv_disp_init finish                                                                                
[00.462]Loading Environment from SUNXI_FLASH... OK                                                          
[00.476]boot_gui_init:start                                                                                 
[00.478]set disp.dev2_output_type fail. using defval=0                                                      
[00.483]LCD open finish                                                                                     
[00.485]set disp.fb0_rot_used fail. using defval=0                                                          
[00.490]set disp.fb0_rot_degree fail. using defval=0                                                        
[00.495]boot_gui_init:finish                                                                                
partno erro : can't find partition bootloader                                                               
[00.502]bmp_name=bootlogo.bmp size 38454                                                                    
[00.508]Item0 (Map) magic is bad                                                                            
[00.511]the secure storage item0 copy0 magic is bad                                                         
[00.516]Item0 (Map) magic is bad                                                                            
[00.518]the secure storage item0 copy1 magic is bad                                                         
[00.523]Item0 (Map) magic is bad                                                                            
secure storage read widevine fail                                                                           
[00.529]secure storage read widevine fail with:-1                                                           
secure storage read ec_key fail                                                                             
[00.536]secure storage read ec_key fail with:-1                                                             
secure storage read ec_cert1 fail                                                                           
[00.544]secure storage read ec_cert1 fail with:-1                                                           
secure storage read ec_cert2 fail                                                                           
[00.551]secure storage read ec_cert2 fail with:-1                                                           
secure storage read ec_cert3 fail                                                                           
[00.558]secure storage read ec_cert3 fail with:-1                                                           
secure storage read rsa_key fail                                                                            
[00.566]secure storage read rsa_key fail with:-1                                                            
secure storage read rsa_cert1 fail                                                                          
[00.573]secure storage read rsa_cert1 fail with:-1                                                          
secure storage read rsa_cert2 fail                                                                          
[00.581]secure storage read rsa_cert2 fail with:-1                                                          
secure storage read rsa_cert3 fail                                                                          
[00.588]secure storage read rsa_cert3 fail with:-1                                                          
[00.593]out of usb burn from boot: not need burn key                                                        
root_partition is rootfs                                                                                    
set root to /dev/mmcblk0p5                                                                                  
[00.603]update part info                                                                                    
[00.605]update bootcmd                                                                                      
[00.608]change working_fdt 0x43e89e70 to 0x43e69e70                                                         
[00.613][mmc]: no mmc-hs400-1_8v!                                                                           
[00.616][mmc]: delete mmc-hs200-1_8v from dtb                                                               
[00.620][mmc]: get max-frequency ok 50000000 Hz                                                             
disable nand error: FDT_ERR_BADPATH                                                                         
[00.639]update dts                                                                                          
Hit any key to stop autoboot:  0                                                                            
[01.729]no vendor_boot partition is found                                                                   
Android's image name: t113-nezha                                                                            
ERROR: reserving fdt memory region failed (addr=43f14000 size=1fa40)                                        
[01.747]Starting kernel ...                               

可以看到有:
set disp.dev2_output_type fail. using defval=0
报错。看样子屏幕设置错误。
下面还有读取分区错误:
partno erro : can't find partition bootloader                                                               
[00.502]bmp_name=bootlogo.bmp size 38454
找不到bootloader分区,不过紧接着就读取到了bootlogo.bmp的大小。

-----------------------------------------------------------

[00.444]drv_disp_init                                                                                       
[00.454]get fdt s_pwm.pwm-base fail                                                                         
fdt get node offset faill: hdmi                                                                             
[00.460]drv_disp_init finish                                                                                
[00.466]Loading Environment from SUNXI_FLASH... OK                                                          
[00.479]boot_gui_init:start                                                                                 
[00.482]set disp.dev2_output_type fail. using defval=0                                                      
FDT ERROR:fdt_get_all_pin:get property handle pinctrl-0 error:FDT_ERR_INTERNAL                              
disp_sys_pin_set_state, fdt_set_all_pin, ret=-1                                                             
[00.498]set disp.fb0_rot_used fail. using defval=0                                                          
[00.503]set disp.fb0_rot_degree fail. using defval=0                                                        
[00.507]boot_gui_init:finish                                                                                
partno erro : can't find partition bootloader                                                               
[00.515]bmp_name=bootlogo.bmp size 38454  

感觉问题集中在这里。
在uboot下执行disp命令:

disp
screen 0:
de_rate 300000000 hz, ref_fps:59
mgr0: 240x135 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[1] force_sync[0] unblank direct_show[false] iommu[0]
        lcd output      backlight(197)  fps:76.4         240x 135
        err:0   skip:0  irq:25296       vsync:0 vsync_skip:0

   BUF    enable ch[1] lyr[0] z[0] prem[N] a[globl 255] fmt[  0] fb[ 240, 135;   0,   0;   0,   0] crop[   0,   0, 240, 135] frame[   0,   0, 240, 135] addr[43f13000,       0,       0] flags[0x       0] trd[0,0]

执行colorbar 0-8,屏幕也没反应,始终保持初始化后的雪花屏。

#27 Re: 全志 SOC » t113s3在uboot里选中了disp2_sunxi,设备树选了个tft08006,我在驱动里加了个死循环,结果没停下来... » 2025-01-02 08:40:24

感谢回复。
通过文件对比,将uboot的deconfig文件恢复,将设备树也恢复后,这个tft08006驱动可以调用了。

不过我实际接的是一个1.14寸的中景园的spi lcd彩屏,用的是st7789v芯片。
uboot和内核里的sunxi-disp2里都有个st7789v.c这个驱动,是用软件io模拟spi的。之前在内核里用这个驱动,按中景园提供的单片机工程,修改初始化部分,可以看到雪花屏,也出现了/dev/fb0设备,但是运行qt程序屏幕并没有变化。
后来不得以改用staging/fbtft这个驱动,qt界面可以正常出现了。

现在想要实现个开机画面。又得用到uboot的显示驱动了,又尝试了这个st7789v.c,可以初始化屏幕,但是按教程走,却没有出现开机画面。也不知道是什么原因。对这个sunxi-disp驱动太不了解了。

#28 Re: 工业芯 匠芯创 » Luban-lite支持通过USB接4G模块吗? » 2025-01-02 08:33:32

同好奇。
不过根觉通过usb方式连接4g模组,需要usb host模式吧。d133就一个usb口,连接4g模组就没办法通过usb口给d133下载程序了吧?

#29 Re: 全志 SOC » 请问有没有支持T113-S3 的TINA 5.0SDK » 2024-12-30 11:22:28

百问的tina sdk前阵子刚更新了,貌似加入t113s3支持了。

#30 全志 SOC » t113s3在uboot里选中了disp2_sunxi,设备树选了个tft08006,我在驱动里加了个死循环,结果没停下来... » 2024-12-27 17:00:07

Gentlepig
回复: 8

感觉没有进驱动程序,为了验证,在驱动程序里加了死循环。
tft08006.c

static s32 lcd_open_flow(u32 sel)
  1 {
  2     LCD_OPEN_FUNC(sel, lcd_power_on, 10);
  3     LCD_OPEN_FUNC(sel, lcd_panel_init, 10);
  4     LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 50);
  5     LCD_OPEN_FUNC(sel, lcd_bl_open, 0);
  6     while(1)
  7     {
  8         printf("hello.\r\n");
  9     }
 10 
 11     return 0;
 12 }

panel.c

int lcd_init(void)
  1 {   
  2     sunxi_disp_get_source_ops(&g_lcd_drv.src_ops);
  3     lcd_set_panel_funs();
  4     while(1)
  5     {
  6         printf("hehehe.\r\n");
  7     }
  8 
  9     return 0;
 10 }

结果还是能进到内核。这是为什么呢?

#31 Re: 全志 SOC » 求芒果派t113-s3 sdk » 2024-12-25 08:24:43

百问好像放出支持t113s3的tina5.0的sdk了,可以考虑试试。

#32 全志 SOC » t113s3突然无法进入uboot。 » 2024-12-21 17:01:13

Gentlepig
回复: 2

板子突然变得起不来了,示波器测量0.9V, 1.5V, 1.8V, 3.3V均在范围内,24M晶振波形也有。
上电时序方面,只对0.9V做了控制,3.3V使能0.9V输出。

板子上电后,调试串口只输出这四行就没了。

[348]HELLO! BOOT0 is starting!                       
[352]BOOT0 commit : 88480af-dirty                    
[356]set pll start                                   
[358]fix vccio detect value:0xc0  

如果按复位键,则只输出前三行。

也无法重新烧录程序。
烧录时,串口信息如下:

[348]HELLO! BOOT0 is starting!                       
[352]BOOT0 commit : 88480af-dirty                    
[356]set pll start                                   
[358]fix vccio detect value:0xc0                     
[9191]fes begin commit:88480af-dirty                 
[9195]set pll start

#33 Re: 全志 SOC » T113管脚输出电压偏低 » 2024-12-20 15:06:40

我前阵子也遇到过个类似问题,想将PE13管脚设置为i2c引脚,结果总是提示已经被占用。我就在设备树里搜PE13,相关的都注释了,结果现象依旧。后来网友提醒,发现还需要搜PE 13相关的。

/* bt_rst_n      = <&pio PE 13 GPIO_ACTIVE_LOW>; */

#34 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » Air780上电后,调试口输出乱码。 » 2024-12-13 14:23:02

以为搞定了,吃饭回来,发现调试口卡死了。

root@TinaLinux:/# [    6.879707] sunxi_usb_udc 4100000.udc-controller: 4100000.udc-controller supply udc not f   

重启后,进到系统,此时可以输入命令,但很快出现这行后就卡住了。等很久后,可以再输入几句命令行,然后就又卡死了。
重启进uboot,结果进到uboot后,就自动出现乱码:

secure storage read rsa_cert1 fail                                                                          
[00.615]secure storage read rsa_cert1 fail with:-1                                                          
secure storage read rsa_cert2 fail                                                                          
[00.623]secure storage read rsa_cert2 fail with:-1                                                          
secure storage read rsa_cert3 fail                                                                          
[00.630]secure storage read rsa_cert3 fail with:-1                                                          
[00.635]out of usb burn from boot: not need burn key                                                        
root_partition is rootfs                                                                                    
set root to /dev/mmcblk0p5                                                                                  
[00.644]update part info                                                                                    
[00.647]update bootcmd                                                                                      
[00.649]change working_fdt 0x43ebee70 to 0x43e9ee70                                                         
[00.655][mmc]: no mmc-hs400-1_8v!                                                                           
[00.657][mmc]: delete mmc-hs200-1_8v from dtb                                                               
[00.662][mmc]: get max-frequency ok 50000000 Hz                                                             
disable nand error: FDT_ERR_BADPATH                                                                         
[00.678]update dts                                                                                          
Hit any key to stop autoboot:  0                                                                            
=>                                                                                                          
=>                                                                                                          
=> @@ @ @A@ @@@B$ @
  @@)@@$@ I           d &
                              FQ0",Hds0#2v, !!$`",b63 !                     ɲ

尝试重新烧写吧,ubuntu下竟然烧写不成功,切到win下用phonex那个软件,一样的结果。
烧录时,调试串口信息:

[4379][AUTO DEBUG] rank 0 row = 13 
[4382][AUTO DEBUG] rank 0 bank = 8 
[4385][AUTO DEBUG] rank 0 page size = 2 KB 
[4389]DRAM BOOT DRIVE INFO: V0.33
[4392]DRAM CLK = 936 MHz
[4395]DRAM Type = 3 (2:DDR2,3:DDR3)
[4398]DRAMC read ODT  off.                                                                                  
[4401]DRAM ODT value: 0x42.                                                                                 
[4403]ddr_efuse_type: 0xa                                                                                   
[4407]DRAM SIZE =128 M                                                                                      
[4409]dram_tpr4:0x0                                                                                         
[4411]PLL_DDR_CTRL_REG:0xf8004d00                                                                           
[4414]DRAM_CLK_REG:0xc0000000                                                                               
[4416][TIMING DEBUG] MR2= 0x20                                                                              
[4421]DRAM simple test OK.                                                                                  
[4423]rtc standby flag is 0x0, super standby flag is 0x0                                                    
[4428]init dram ok    

LiveSuit后台输出:

--------------Init Called------------------
workDir	/home/any/mpu/t113s3/sunxi-livesuite-master/x86-64/LiveSuit
ImgLenHigh	0
ImgLenLow	141215744
Mode	8
hWnd	0
imgFilePath	/home/any/mpu/t113s3/sdk_2_1/tina-d1-2.1/out/t113-nezha/tina_t113-nezha_uart0.img
[TL_MSG]:Mode = 8, ImgLenHigh=0, ImgLenLow = 86ac800, imgFilePath = /home/any/mpu/t113s3/sdk_2_1/tina-d1-2.1/out/t113-nezha/tina_t113-nezha_uart0.img

IMAGEWTY
ItemTableSize = 1048576
[TL_MSG]:Tools Open Img

---fun end---
--------------entry-fel2fes Called-----------
felDevName	/dev/aw_efex0
[TL_MSG]:Hi, I'm fel, dev=/dev/aw_efex0

[TL_MSG]:To down and Run fes1-1

[TL_MSG]:fes1 down addr = 0x28000, retAddr =0x28340

[TL_MSG]:tlFelDev.FelRun finish

[TL_MSG]:hasRetLog finish

[TL_MSG]:Tools_Buffer finish

[TL_FEX]:fel UP addr=0x28340, len=136

Fex_Send error: 没有那个设备
Fex_transmit_receive Error: ./eFexCore.cpp, 318
Fex_command Error ./eFexCore.cpp 409
[TL_FEX]:fexCdmRet = 200

<TL_ERR>:usbtool.lua_1951>:FAil to UP fes aide log area, times=1

<TL_ERR>:usbtool.lua_3471>:fes1-1 failed

L225, Exception, returned value of Tools.entry_fel2fes is error.
FelThreadEntry g_Tools_if->Fel2Fes 227

LiveSuit界面提示:烧写固件失败:Wait for Fes Device Timeout...

------------------------------------------------------------------

找到之前以为坏了的另一块板子,烧录进取,能正常启动,启动完也不会卡住。
目前这个板子t113s3坏了?uboot命令行里,调试串口乱码很奇怪。

-------------------------------------------------------------------

将下午出问题的这个板子上的air780,吹下来了。问题依旧...
热风枪吹了下t113s3和usb口,正常了...

#35 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » Air780上电后,调试口输出乱码。 » 2024-12-13 11:20:21

memory 说:

有四五个虚拟串口,换个试一试

板子上t113直接usb连到air780的usb口了。ifconfig看没多出网口设备,所以怀疑air780的工作状态。
air780的调试串口倒是引出来了,看到乱码我以为780没正常工作。找了air780开发板发现也是这样,那就放心了。我板上的air780大概率正常工作了。

接下来找tina linux的问题吧。

root@TinaLinux:/# lsusb                                                                                     
Bus 001 Device 001: ID 1d6b:0002                                                                            
Bus 001 Device 002: ID 19d1:0001                                                                            
Bus 002 Device 001: ID 1d6b:0001                                                                            
root@TinaLinux:/# [   33.799534] usb1-vbus: disabling                                                       
[   69.968810] g_ether gadget: high-speed config #1: CDC Ethernet (ECM)                                     
                                                                                                            
root@TinaLinux:/#                                                                                           
root@TinaLinux:/# ifconfig                                                                                  
lo        Link encap:Local Loopback                                                                         
          inet addr:127.0.0.1  Mask:255.0.0.0                                                               
          inet6 addr: ::1/128 Scope:Host                                                                    
          UP LOOPBACK RUNNING  MTU:65536  Metric:1                                                          
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                                                
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                                              
          collisions:0 txqueuelen:1000                                                                      
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)                                                            
                                                                                                            
root@TinaLinux:/#

19d1这个usb设备就是air780,但是ifconfig没看到新的网卡设备。

-----------------------------------------------------------------

root@TinaLinux:/# ifconfig usb0 up
root@TinaLinux:/# ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

usb0      Link encap:Ethernet  HWaddr 32:B4:5D:AB:60:DD  
          inet6 addr: fe80::30b4:5dff:feab:60dd/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2907 (2.8 KiB)  TX bytes:656 (656.0 B)

这算正常了吗?

------------------------------------------

root@TinaLinux:/# ifconfig                                                                                  
lo        Link encap:Local Loopback                                                                         
          inet addr:127.0.0.1  Mask:255.0.0.0                                                               
          inet6 addr: ::1/128 Scope:Host                                                                    
          UP LOOPBACK RUNNING  MTU:65536  Metric:1                                                          
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                                                
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                                              
          collisions:0 txqueuelen:1000                                                                      
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)                                                            
                                                                                                            
root@TinaLinux:/# udhcpc                                                                                    
udhcpc: started, v1.27.2                                                                                    
udhcpc: sending discover                                                                                    
udhcpc: sending select for 192.168.10.2                                                                     
udhcpc: lease of 192.168.10.2 obtained, lease time 86400                                                    
udhcpc: ifconfig eth0 192.168.10.2 netmask 255.255.255.0 broadcast +                                        
udhcpc: setting default routers: 192.168.10.1                                                               
root@TinaLinux:/# ifconfig                                                                                  
eth0      Link encap:Ethernet  HWaddr 20:89:84:6A:96:AB                                                     
          inet addr:192.168.10.2  Bcast:192.168.10.255  Mask:255.255.255.0                                  
          inet6 addr: fe80::2289:84ff:fe6a:96ab/64 Scope:Link                                               
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1                                                
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0                                                
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0                                              
          collisions:0 txqueuelen:1000                                                                      
          RX bytes:684 (684.0 B)  TX bytes:1552 (1.5 KiB)                                                   
                                                                                                            
lo        Link encap:Local Loopback                                                                         
          inet addr:127.0.0.1  Mask:255.0.0.0                                                               
          inet6 addr: ::1/128 Scope:Host                                                                    
          UP LOOPBACK RUNNING  MTU:65536  Metric:1                                                          
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                                                
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                                              
          collisions:0 txqueuelen:1000                                                                      
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)  

需要手动执行udhcpc才行吗?

#36 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » Air780上电后,调试口输出乱码。 » 2024-12-13 09:48:19

找了个air780e开发板,上电后过了d-fota信息后,其他的也都是乱码。看样子我板子上的air780算是正常工作了。
乱码信息不一样,可能是因为固件不同吧。

[01:45:45.257]收←◆->
\0
[01:45:45.380]收←◆
boot rom try normal boot start!
\0
[01:45:45.464]收←◆Start power on debounce. Delay=500

[01:45:45.964]收←◆

(E) Welcome to EiGENCOM D-Fota Time!
 ___      _____ ___
[01:45:46.011]收←◆ _____  _        
| _ \    |  ___/ _ \_   _|/ \      
|| \| -- | |_  || || | | / _ \      
||_/| -- |  _| ||_|| | |/ ___ \     
|___/    |_|   \___/ |_/_/   \_\  

(C) Copyright 2020, All Rights Reserved.
(V) Version(2.5), Built @Dec 18 2023 10:21:59

uart(1) urc baud: 115200
total length(40): 
[1/1] ffffff3feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
no par(0xffff) found!
exit...
bootloader flashXIPLimit(0x809a90), try normal boot system start!
[01:45:46.080]收←◆?郔恇*゛ (傴:0 :!  ? !*0* @!`p!€
B
[01:45:46.164]收←◆郻0?郻聵1#?1t?`"?0娿酭?€0i?8?($鴕` (\0?悁# ?狲 溤?? <!肎豇0??!r鼝20`d?`j儼" ?!俰4!!?""倻"醼*??    ??ⅳ€?*??(2#c ?`(\0? ?!?\0h翇??(?8)"皃炔1?2"?\"(+箙)C0!3? ??俼€)0'饍"瞏€( !?"?
嗲\0`b"0h NY惱★?€3鸁娱郳0\?!!0片1oJ莚?傽6?h﹐>錃 ?唓牺r~?0??0$悭BU)

----------------------------

尝试了多次重启,开机上电信息,有时候多,有时候少。

(E) Welcome to EiGENCOM D-Fota Time!
 ___      _____ ___ _____  _        
| _ \    |  ___/ _ \_   _|/ \      
|| \| -- | |_  || || | | / _ \      
||_/| -- |  _| ||_|| | |/ ___ \     
|___/    |_|   \___/ |_/_/   \_\  

(C) Copyright 2020, All Rights Reserved.
(V) Version(2.5), Built @Dec 18 2023 10:21:59

uart(1) urc baud: 115200
total length(40): 
[1/1] ffffff3feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
no par(0xffff) found!
exit...
bootloader flashXIPLimit(0x809a90), try normal boot system start!
[01:49:41.136]收←◆@鳬?#(1竝`h"?€" $$r(1!`q??(1殹
[01:49:41.225]收←◆+!驅3?(扊() `瘼?鎎? 罍\ 仩1?瀉!*?琛
[01:49:41.302]收←◆`ch小?0狆狔狺??(?C亪0  !? 0罍2Q 	D??€8?&.渜8??"\0 !  狏P+f D灠1t? ?3 :I$	8#`奬0敖0?230癭02q  ?33"$ 癮═驙 c()@i  !xp駩`嬧侐``0?1忄鲷帑瘀z篌??齄牝??郳0
[01:49:41.378]收←◆ 篌蝥?怿
[01:49:41.410]收←◆筱螓??篁篼簋簋?赈!桠?颃!聩鵼 t?嗖惛冢\0?0?" 鋋?€?!xia爳)$\0"%a*!? 2 t凙癓@\0
[01:49:41.525]收←◆h(稩cKRH?@銀h垾▲瘌?瘊0溹??(帏帏@槈!!??瘊豉??1?瘊瘃篌???D椟
[01:49:41.641]收←◆ 瘘x)狳狴1???狴豉?騬
[01:49:41.679]收←◆#膱?!'1)q"??H皠? ` hJ1t( E乣 ?!
 0 逍唷s      ? 7 R\0!(?亨 b!b 0	!x#D\0") 幝 d"Z凫q鴵癭&1xY0 p\0
[01:49:41.710]收←◆峥?@  0  (€俐3 0睠 鄲0 (  "4   " ?\0$9恓 4 0 琥b= r! 0L("€9?08\0\0 ??*M#Dx !?  ?埰膊, )A佽Z{ba"a "uM犼?0pjk?覃?
[01:49:41.757]收←◆??a←臌+$k9)?9╇筴`k4 @  \0?? ! : "p  餚閈0? h?V冭扮鼉????戹
[01:49:41.795]收←◆?酏顸鲻蝥餫 1腚jkxk莐{?0\0€) `┌cu%??\0 (???禿蝮駮蝥#轼辇
[01:49:41.826]收←◆??鎖鲴z0 鹝zk歿k;{k~k狷o?皜P" 偝1?a鲨p$!8 $ ╆q0p0?y&?鵞???
[01:49:41.857]收←◆?"猘鄨0灏隿Dr豫隨{ 0)妶剙??詡牥啖!?
[01:49:41.895]收←◆(p~攞{v鷎纊鷎{k?{ 榒 A`?#1`€8?羂0 ≦? 
[01:49:41.926]收←◆?9k‰x発{媋﹌9? 0!j睒(?拋 !l"燖 \0?
[01:49:41.973]收←◆ 臌瑃k侜雥k喙鹹{j?喐5睮p?(?? `?!?\0?偟爛塨 蔴0€
[01:49:42.011]收←◆\0H嫮vk{胞{@半 $a`毑*  0 (\0€2?\0€\0
[01:49:42.042]收←◆馉狉k{尔腚 霐k竗{襨\0*"\0?\0`皜奝,?8\0a ?€? 
[01:49:42.080]收←◆?k雓=毹6{{q  锣 ?€盃!a 8F ?? `0
[01:49:42.111]收←◆( kkる雓)?牖[{k{)€€?0`x04\0?\0|     疣惃!?
[01:49:42.143]收←◆"p!腚?陵9u醳y鹝\0€刯00? p€ ?(0"( ǘ1!`
[01:49:42.174]收←◆? è霠駕?z?固良?帯?j黑d`a !? p?u  龤? \0 h閎0玴0  (?k~k?凓鹺鸓雬z9 ! ?x┌#?p?\0
[01:49:42.227]收←◆{?1?( 
[01:49:42.258]收←◆爌蒩鬨Rk{磌?鹝i ` ` p?&  ) ?(]砵08`( 
[01:49:42.296]收←◆?氳kk{鶦?{P{ ?k跭k{p{I 帘1?   "?y冟\0)?0p0`"`A,
[01:49:42.327]收←◆
[01:49:42.359]收←◆( k鹝)+ 9kk{珄k{?&? x3鑱?`
€! (郹    ?
[01:49:42.381]收←◆ 1雓滕{€{{雓+("???#q 皃 )€?(hqh? €
[01:49:42.412]收←◆ z~k#鷞k:?kz{鷞€ ?"?(?@?1? ?? `
[01:49:42.443]收←◆ !k{臌鴎k{雙k{趝?)唊6(?8?猏0 摹牪8p   ! 5  " `\0`( 
[01:49:42.481]收←◆?耣腚鑬偣	k{╇i?\0 €(D?" ?  \0 y?2`a 
[01:49:42.512]收←◆鼱)橕k萾{?腴敫?kU@l(C  繾 q?
t \0??祦床$?0` 
[01:49:42.544]收←◆鋩)爞霅k鹝爗您?)(ㄑ?? (p *`牂TA@0
[01:49:42.581]收←◆?)爇)k|p)腚yA{a鹥?"1 k共(?蓟  B  ∴ea酄
[01:49:42.613]收←◆?Sk{痣{?kk{閷纊:”?餼7`俙" ! `(?? 狘
[01:49:42.644]收←◆\0?雥腚 kk鸧雓半鹝▔勑?J?2??F牋閈0(10 
[01:49:42.682]收←◆?鹝k"k)雥恵?{k雭€0"`?4?2!?€耟怐\0 爛2? !*u<0燖0+\0
[01:49:42.713]收←◆?愞k発脍?k9???聙"驃0#鷫B  !`餪2` p
[01:49:42.744]收←◆(?kkb氡雥  1?牰?,建?0`! i??! 
[01:49:42.782]收←◆?€	bkk橕臌?k{`|k{0\0
[01:49:42.813]收←◆€D—i€c 1? 2m?! 0 鼱(2臌?{+k搿雥{(
Pb??j  ╕1)9"?
8€ "?q?   
[01:49:42.860]收←◆﨧 !kE涣牍{? ?\0F€ah@`\0圽0Q\0
[01:49:42.882]收←◆`S惵圽0宼隤雥 k{鹝←{{鹻){ ? 0 `?犫 ? 祦a溟1蘚0
[01:49:42.929]收←◆ B"亱7000?!€ €$?0d镫 k@kk`坽€4h - \0
[01:49:42.960]收←◆d€> ????F€€ ?渀肷6pokk?峁雥+v鹻k?(3?(皺盃! !犇1p`q  窧? 
[01:49:42.994]收←◆b?€氱0?c筴臌(?詹( 0`?
潬?? 燾?悹? g+?`\0v`
[01:49:43.034]收←◆P?笭"噌?珥9  B"泞#ⅲF鐮苨a 蜝UF???犫惞0?0?弃#!??a辩2DQ?

#37 NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » Air780上电后,调试口输出乱码。 » 2024-12-12 17:05:54

Gentlepig
回复: 5

t113s3通过usb口连接air780模组,air780模组的调试串口引出,且power_key引脚接地设为上电开机,sel_io管脚接地设vdd_ext为3.3v.
电池供电,电压在4.1v左右。结果供电后,调试口显示输出几行信息,然后就变为乱码了...

(E) Welcome to EiGENCOM D-Fota Time!
 ___      _____ ___ _____  _        
| _ \    |  ___/ _ \_   _|/ \      
|| \| -- | |_  || || | | / _ \      
||_/| -- |  _| ||_|| | |/ ___ \     
|___/    |_|   \___/ |_/_/   \_\  

(C) Copyright 2020, All Rights Reserved.
(V) Version(2.5), Built @Jan 22 2024 16:52:51

uart(1) urc baud: 115200
total length(40): 
[1/1] ffffff3feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
no par(0xffff) found!
exit...
bootloader flashXIPLimit(0x809978), try normal boot system start!
[16:59:43.581]收←◆s
[16:59:43.612]收←◆鴪`$`0爟:?:  < #")!    ! 3r0`?? 阷憘:j?
睊 b嵃d皹憻
[16:59:43.643]收←◆?` 
[16:59:43.696]收←◆j簉??*0鴇y堮 $09??`""b# 鸓8癭+餈!?P\ :0硼?麪牪h€
[16:59:43.759]收←◆&! ?!8!釋?0 0P( ?("H?(悂? 牎 !  牋?"膫0岈1 :瀶€!\0??"b0?~? 0* ?`?8倽:{!?
€2?哷
酁傝hH?h\0"`"?iIA\0?丠0?*癶9+ ㄐ
[16:59:43.928]收←◆h8
[16:59:43.997]收←◆! ?b e ???98q`?
?% ( ? \0!獪?&牸姪"!悽8?  筡0C2悇??楡"書 鹱餻
[16:59:44.028]收←◆€#)("?鄠!"
[16:59:44.060]收←◆徵;臓@?2b i`? p 鹪领夻+r*釧	 9
[16:59:44.082]收←◆嘀"*)屺鰄?0	?9?C鵫?+?瘌)悦`?Ai`?i`)" 3`+#?"(?\0偍\0峔0??H侤d y掤???峇!"??⒕? #}0r? w`"A鑊堾!J2# (j?L0?? :U⒓俓05rd `?! ($桛(↙`仮x@ i卩? #I#+? $!) \0
[16:59:44.144]收←◆⑩省 =(#u9 !a`Q??D酄蝤簒纀焱椴凐?撞;:?鋌⒔磡燶2*)**):9!(p蓇?3#膠「?1\? ?(癨0竬1!E	椤犫 ??) a統1狲f鈈栤c8?" 拆盃'!??犪唨    ? @@\0"\0繮?|F尅苧 `pGp?!L买?j?髍a?y 棰!\0
[16:59:44.182]收←◆?"鄲K晫?
?"?]*+i應?vs徭?€?*#醳€F狆#?#?炳瘕犙?膣饆2?#亵h)??襦?3A痧3h6黫`忐?惔
[16:59:44.229]收←◆10#T鹺;?騗?e?襦"rC1?rPb馶0
[16:59:44.260]收←◆?豉\0?`)?ya?+?2
[16:59:44.282]收←◆2?鰛郟黚騣1枚驙黚1
[16:59:44.314]收←◆舛?b?9+2鼘(	?瘕9023C?忤??
[16:59:44.345]收←◆鹌蛸aj?驂2;b+i?3C麵聳瘌怛猏0
[16:59:44.383]收←◆i?;?Z?b釿9?齀 4夲乞r\0
[16:59:44.414]收←◆???H?I?赳銧?b(?2b\09
[16:59:44.445]收←◆亵0?9鈮21b!棹2?m+9??21
[16:59:44.483]收←◆???2a)鸢痧?I;夻鸢??﨎+?酏鱘03?)?\0
[16:59:44.514]收←◆2?23b痧噜f%
[16:59:45.931]收←◆鬬
[16:59:46.000]收←◆`0?1!仭
[16:59:47.335]收←◆00ET#4黒0
[16:59:47.404]收←◆ ?鼈?帏?a
[16:59:47.435]收←◆h堻桴(睜
[16:59:47.504]收←◆
[16:59:47.535]收←◆?a?" ` 罓N?(0p鳼!)	
[16:59:47.589]收←◆!t
[16:59:47.620]收←◆惔
[16:59:47.673]收←◆*
[16:59:47.705]收←◆酅銗AH
[16:59:47.736]收←◆"
[16:59:47.774]收←◆ ?)垚# !F~愸?
[16:59:47.805]收←◆?`?ㄠ?浴嘅1?狛?赴T!0?wccK,""*!雮
[16:59:47.836]收←◆?@(勸矤x ? 
[16:59:47.874]收←◆?Х
攭`D
[16:59:47.905]收←◆兏a7 鷃

#38 全志 SOC » t113s3连接spi lcd,报错:of_find_compatible_node allwinner,sunxi-lcd_fb1 fai » 2024-12-12 10:41:36

Gentlepig
回复: 0

为啥是lcd_fb1呢?
设备树里用的是lcd_fb0节点啊。

t113s3接了中景园的1.14寸Lcd,接口是spi的,芯片是st7789v。
选用tina2.x sdk里的kld2844b这个驱动,烧录后,屏竟然也能初始化成功,屏幕有雪花点。
但是想运行qt程序,结果没反映。开机信息里有报错:

/# dmesg | grep fail
[    0.538656] of_find_compatible_node allwinner,sunxi-lcd_fb1 fail
[    0.560739] Fb_map_kernel_logo failed!
[    0.661988] sunxi-rfkill soc@3000000:rfkill@0: get gpio chip_en failed
[    0.669318] sunxi-rfkill soc@3000000:rfkill@0: get gpio power_en failed
[    0.735950] sunxi-rfkill soc@3000000:rfkill@0: get gpio bt_rst failed
[    1.096246] get ehci1-controller wakeup-source is fail.
[    1.387829] get ohci1-controller wakeup-source is fail.
[    2.375189] sunxi-mmc 4020000.sdmmc: set cd-gpios as 24M fail
[    2.862382] sunxi_get_str_of_property()1595 - failed to get the string of propname led_regulator!
[    3.195701] get ehci0-controller wakeup-source is fail.
[    3.224771] get ohci0-controller wakeup-source is fail.
[    3.270322] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[    3.280032] cfg80211: failed to load regulatory.db
[    5.895299] configfs-gadget 4100000.udc-controller: failed to start g1: -19

设备树:

  18 &lcd_fb0 {
  17     lcd_used = <1>;
  16 
  15     lcd_driver_name = "kld2844b";
  14     lcd_if = <0>;
  13     lcd_data_speed = <60>;
  12     lcd_spi_bus_num = <1>;
  11     lcd_x = <320>;
  10     lcd_y = <240>;
   9     lcd_pwm_used = <0>;
   8     lcd_pixel_fmt = <10>;
   7     lcd_rgb_order = <0>;
   6     fb_bffer_num = <2>;
   5     lcd_backlight = <200>;
   4     lcd_fps = <60>;
   3     lcd_dbi_te = <0>;
   2     lcd_bl_en = <&pio PD 16 1 1 2 1>;
   1     lcd_gpio_0 = <&pio PE 8 1 1 2 1>;
1608     lcd_spi_dc_pin = <&pio PD 14 1 1 2 1>;

完整开机记录:

[210]HELLO! BOOT0 is starting!
[213]BOOT0 commit : 88480af-dirty
[217]set pll start
[218]fix vccio detect value:0xc0
[226]periph0 has been enabled
[229]set pll end
[230][pmu]: bus read error
[233]board init ok
[235]ZQ value = 0x2f
[237]get_pmu_exist() = -1
[239]DRAM BOOT DRIVE INFO: V0.33
[242]DRAM CLK = 936 MHz
[245]DRAM Type = 3 (2:DDR2,3:DDR3)
[248]DRAMC read ODT  off.
[250]DRAM ODT value: 0x42.
[253]ddr_efuse_type: 0xa
[256]DRAM SIZE =128 M
[258]dram_tpr4:0x0
[260]PLL_DDR_CTRL_REG:0xf8004d00
[263]DRAM_CLK_REG:0xc0000000
[266][TIMING DEBUG] MR2= 0x20
[273]DRAM simple test OK.
[276]rtc standby flag is 0x0, super standby flag is 0x0
[281]dram size =128
[284]card no is 2
[285]sdcard 2 line count 4
[288][mmc]: mmc driver ver 2021-05-21 14:47
[297][mmc]: Wrong media type 0x0, but host sdc2, try mmc first
[303][mmc]: ***Try MMC card 2***
[326][mmc]: RMCA OK!
[328][mmc]: mmc 2 bias 0
[337][mmc]: MMC 5.1
[339][mmc]: HSSDR52/SDR25 4 bit
[342][mmc]: 50000000 Hz
[344][mmc]: 3700 MB
[346][mmc]: ***SD/MMC 2 init OK!!!***
[417]Loading boot-pkg Succeed(index=0).
[420]Entry_name        = u-boot
[426]Entry_name        = optee
[430]Entry_name        = dtb
[433]tunning data addr:0x430003e8
[436]Jump to second Boot.
M/TC: OP-TEE version: 6aef7bb2-dirty (gcc version 5.3.1 20160412 (Linaro GCC 5.3-2016.05)) #1 Fri Jul 23 09:25:                                                                                                        m


U-Boot 2018.07-ge987def5-dirty (Dec 07 2024 - 08:25:07 +0800) Allwinner Technology

[00.489]CPU:   Allwinner Family
[00.492]Model: sun8iw20
I2C:   FDT ERROR:fdt_set_all_pin:[twi0]-->FDT_ERR_BADPATH
FDT ERROR:fdt_set_all_pin:[twi1]-->FDT_ERR_BADPATH
ready
[00.513]DRAM:  128 MiB
[00.516]Relocation Offset is: 04eff000
[00.536]secure enable bit: 0
[00.538]smc_tee_inform_fdt failed with: ffff000a
[00.544]CPU=1008 MHz,PLL6=600 Mhz,AHB=200 Mhz, APB1=100Mhz  MBus=300Mhz
[00.550]gic: sec monitor mode
sunxi flash map init
[00.555]flash init start
[00.557]workmode = 0,storage type = 2
[00.561][mmc]: mmc driver ver uboot2018:2021-12-20 13:35:00
[00.567][mmc]: SUNXI SDMMC Controller Version:0x50310
[00.594][mmc]: Best spd md: 2-HSDDR52/DDR50, freq: 2-50000000, Bus width: 4
[00.601]sunxi flash init ok
[00.606]Loading Environment from SUNXI_FLASH... OK
[00.630]Item0 (Map) magic is bad
[00.633]the secure storage item0 copy0 magic is bad
[00.649]Item0 (Map) magic is bad
[00.652]the secure storage item0 copy1 magic is bad
[00.656]Item0 (Map) magic is bad
secure storage read widevine fail
[00.662]secure storage read widevine fail with:-1
secure storage read ec_key fail
[00.670]secure storage read ec_key fail with:-1
secure storage read ec_cert1 fail
[00.677]secure storage read ec_cert1 fail with:-1
secure storage read ec_cert2 fail
[00.684]secure storage read ec_cert2 fail with:-1
secure storage read ec_cert3 fail
[00.692]secure storage read ec_cert3 fail with:-1
secure storage read rsa_key fail
[00.699]secure storage read rsa_key fail with:-1
secure storage read rsa_cert1 fail
[00.707]secure storage read rsa_cert1 fail with:-1
secure storage read rsa_cert2 fail
[00.714]secure storage read rsa_cert2 fail with:-1
secure storage read rsa_cert3 fail
[00.722]secure storage read rsa_cert3 fail with:-1
[00.726]out of usb burn from boot: not need burn key
root_partition is rootfs
set root to /dev/mmcblk0p5
[00.736]update part info
[00.739]update bootcmd
[00.741]change working_fdt 0x43ebee70 to 0x43e9ee70
[00.746][mmc]: no mmc-hs400-1_8v!
[00.749][mmc]: delete mmc-hs200-1_8v from dtb
[00.753][mmc]: get max-frequency ok 50000000 Hz
disable nand error: FDT_ERR_BADPATH
[00.770]update dts
Hit any key to stop autoboot:  0 
[01.859]no vendor_boot partition is found
Android's image name: t113-nezha
[01.870]Starting kernel ...

[01.873][mmc]: mmc exit start
[01.890][mmc]: mmc 2 exit ok
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 5.4.61 (any@Any-PC) (arm-openwrt-linux-muslgnueabi-gcc.bin (OpenWrt/Linaro GCC 6.4                                                                                                        4
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: sun8iw20
[    0.000000] printk: bootconsole [earlycon0] enabled
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] cma: Reserved 8 MiB at 0x47800000
[    0.000000] On node 0 totalpages: 32768
[    0.000000]   Normal zone: 256 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 32768 pages, LIFO batch:7
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.0 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.0
[    0.000000] percpu: Embedded 15 pages/cpu s30348 r8192 d22900 u61440
[    0.000000] pcpu-alloc: s30348 r8192 d22900 u61440 alloc=15*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 32512
[    0.000000] Kernel command line: earlyprintk=sunxi-uart,0x02500000 clk_ignore_unused initcall_debug=0 consol                                                                                                         
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes, linear)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 109708K/131072K available (6144K kernel code, 237K rwdata, 1456K rodata, 1024K init, 112                                                                                                        )
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
[    0.000000] rcu: Preemptible hierarchical RCU implementation.
[    0.000000]  Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[    0.000000] random: get_random_bytes called from start_kernel+0x264/0x3e8 with crng_init=0
[    0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 4407                                                                                                        s
[    0.000005] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[    0.008024] Switching to timer-based delay loop, resolution 41ns
[    0.014203] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[    0.023903] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=2                                                                                                        )
[    0.034267] pid_max: default: 32768 minimum: 301
[    0.039017] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.046339] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.054652] CPU: Testing write buffer coherency: ok
[    0.059871] /cpus/cpu@0 missing clock-frequency property
[    0.065188] /cpus/cpu@1 missing clock-frequency property
[    0.070526] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[    0.076674] Setting up static identity map for 0x40100000 - 0x40100060
[    0.083336] rcu: Hierarchical SRCU implementation.
[    0.088543] smp: Bringing up secondary CPUs ...
[    0.094165] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
[    0.094282] smp: Brought up 1 node, 2 CPUs
[    0.104102] SMP: Total of 2 processors activated (96.00 BogoMIPS).
[    0.110280] CPU: All CPU(s) started in SVC mode.
[    0.115348] devtmpfs: initialized
[    0.129670] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
[    0.137802] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.147674] futex hash table entries: 512 (order: 3, 32768 bytes, linear)
[    0.154896] pinctrl core: initialized pinctrl subsystem
[    0.161057] NET: Registered protocol family 16
[    0.166915] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.203130] rtc_ccu: sunxi ccu init OK
[    0.209112] ccu: sunxi ccu init OK
[    0.212922] r_ccu: sunxi ccu init OK
[    0.234050] sun6i-dma 3002000.dma-controller: sunxi dma probed
[    0.241650] iommu: Default domain type: Translated 
[    0.246689] sunxi iommu: irq = 24
[    0.250912] SCSI subsystem initialized
[    0.254888] usbcore: registered new interface driver usbfs
[    0.260452] usbcore: registered new interface driver hub
[    0.265850] usbcore: registered new device driver usb
[    0.271965] Advanced Linux Sound Architecture Driver Initialized.
[    0.278797] Bluetooth: Core ver 2.22
[    0.282422] NET: Registered protocol family 31
[    0.286859] Bluetooth: HCI device and connection manager initialized
[    0.293277] Bluetooth: HCI socket layer initialized
[    0.298168] Bluetooth: L2CAP socket layer initialized
[    0.303244] Bluetooth: SCO socket layer initialized
[    0.308817] g2d 5410000.g2d: Adding to iommu group 0
[    0.314170] G2D: rcq version initialized.major:251
[    0.319701] clocksource: Switched to clocksource arch_sys_counter
[    0.334176] sun8iw20-pinctrl 2000000.pinctrl: initialized sunXi PIO driver
[    0.343528] NET: Registered protocol family 2
[    0.348437] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 6144 bytes, linear)
[    0.356841] TCP established hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.364523] TCP bind hash table entries: 1024 (order: 1, 8192 bytes, linear)
[    0.371593] TCP: Hash tables configured (established 1024 bind 1024)
[    0.378032] UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
[    0.384605] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
[    0.391794] NET: Registered protocol family 1
[    0.397123] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pd not found, using dummy regulator
[    0.407351] sunxi_spi_probe()2890 - [spi1] SPI DBI INTERFACE
[    0.413153] spi spi1: spi1 supply spi not found, using dummy regulator
[    0.419852] sunxi_spi_resource_get()2438 - [spi1] SPI MASTER MODE
[    0.425983] sunxi_spi_resource_get()2476 - Failed to get sample mode
[    0.432359] sunxi_spi_resource_get()2481 - Failed to get sample delay
[    0.438789] sunxi_spi_resource_get()2485 - sample_mode:-1431633921 sample_delay:-1431633921
[    0.447216] sunxi_spi_clk_init()2527 - [spi1] mclk 100000000
[    0.453485] sunxi_spi_probe()2978 - [spi1]: driver probe succeed, base c881d000, irq 40
[    0.463097] workingset: timestamp_bits=30 max_order=15 bucket_order=0
[    0.474575] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.480612] ntfs: driver 2.1.32 [Flags: R/W].
[    0.514359] io scheduler mq-deadline registered
[    0.518902] io scheduler kyber registered
[    0.523979] [LCD_FB] lcd_fb_init,line:158:
[    0.523982] 
[    0.529774] [LCD_FB] lcd_fb_probe,line:65:
[    0.529776] 
[    0.538791] [LCD_FB] lcd_fb_script_get_item,line:139:
[    0.538796] of_find_compatible_node allwinner,sunxi-lcd_fb1 fail
[    0.550002] [LCD_FB] disp_lcd_set_panel_funs,line:1096:
[    0.550006] lcd_panel_fun[0].cfg_panel_info is NULL
[    0.560870] [LCD_FB] Fb_map_kernel_logo,line:201:
[    0.560873] Fb_map_kernel_logo failed!
[    0.565689] [LCD_FB] disp_lcd_spi_init,line:845:
[    0.569433] Init spi1:bits_per_word:8 max_speed_hz:60000000 mode:0
[    0.570925] sunxi_sid_init()783 - insmod ok
[    0.585601] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pe not found, using dummy regulator
[    0.595782] uart uart0: uart0 supply uart not found, using dummy regulator
[    0.602942] uart0: ttyS0 at MMIO 0x2500000 (irq = 34, base_baud = 1500000) is a SUNXI
[    0.610827] sw_console_setup()1807 - console setup baud 115200 parity n bits 8, flow n
[    0.618808] printk: console [ttyS0] enabled
[    0.618808] printk: console [ttyS0] enabled
[    0.627687] printk: bootconsole [earlycon0] disabled
[    0.627687] printk: bootconsole [earlycon0] disabled
[    0.639030] misc dump reg init
[    0.643611] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pg not found, using dummy regulator
[    0.654846] sunxi-rfkill soc@3000000:rfkill@0: module version: v1.0.9
[    0.662110] sunxi-rfkill soc@3000000:rfkill@0: get gpio chip_en failed
[    0.669439] sunxi-rfkill soc@3000000:rfkill@0: get gpio power_en failed
[    0.676879] sunxi-rfkill soc@3000000:rfkill@0: wlan_busnum (1)
[    0.683432] sunxi-rfkill soc@3000000:rfkill@0: Missing wlan_power.
[    0.690389] sunxi-rfkill soc@3000000:rfkill@0: wlan clock[0] (32k-fanout1)
[    0.698119] sunxi-rfkill soc@3000000:rfkill@0: wlan_regon gpio=204 assert=1
[    0.705981] sunxi-rfkill soc@3000000:rfkill@0: wlan_hostwake gpio=202 assert=1
[    0.714112] sunxi-rfkill soc@3000000:rfkill@0: wakeup source is enabled
[    0.721763] sunxi-rfkill soc@3000000:rfkill@0: Missing bt_power.
[    0.728513] sunxi-rfkill soc@3000000:rfkill@0: bt clock[0] (32k-fanout1)
[    0.736068] sunxi-rfkill soc@3000000:rfkill@0: get gpio bt_rst failed
[    0.743874] [ADDR_MGT] addr_mgt_probe: module version: v1.0.11
[    0.751058] [ADDR_MGT] addr_mgt_probe: success.
[    0.756433] dma-buf: Running sanitycheck
[    0.760897] dma-buf: Running dma_fence
[    0.765098] sizeof(dma_fence)=48
[    0.768810] dma-buf: Running dma_fence/sanitycheck
[    0.774213] dma-buf: Running dma_fence/test_signaling
[    0.779918] dma-buf: Running dma_fence/test_add_callback
[    0.785877] dma-buf: Running dma_fence/test_late_add_callback
[    0.792331] dma-buf: Running dma_fence/test_rm_callback
[    0.798191] dma-buf: Running dma_fence/test_late_rm_callback
[    0.804549] dma-buf: Running dma_fence/test_status
[    0.809931] dma-buf: Running dma_fence/test_error
[    0.815205] dma-buf: Running dma_fence/test_wait
[    0.820394] dma-buf: Running dma_fence/test_wait_timeout
[    0.849712] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    0.849715] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    0.859708] dma-buf: Running dma_fence/test_stub
[    0.866342] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    0.866346] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    0.866353] dma-buf: Running dma_fence/race_signal_callback
[    0.871929] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    0.871932] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    0.909742] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    0.909746] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    0.929740] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    0.929743] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    0.949740] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    0.949744] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    0.969709] thread_signal_callback[0] completed 39414 passes, 17554 misses
[    0.977439] thread_signal_callback[1] completed 21892 passes, 29 misses
[    0.984910] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    0.984913] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.009698] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.009701] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.029715] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.029718] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.049705] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.049709] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.069716] thread_signal_callback[0] completed 41379 passes, 41379 misses
[    1.069745] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.069748] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.077498] thread_signal_callback[1] completed 23961 passes, 23961 misses
[    1.088902] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.088905] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.102726] libphy: Fixed MDIO Bus: probed
[    1.108041] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.108044] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.113225] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.124126] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.124129] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.131465] sunxi-ehci: EHCI SUNXI driver
[    1.142907] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.142911] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.147833] get ehci1-controller wakeup-source is fail.
[    1.152987] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.152993] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.158962] sunxi ehci1-controller don't init wakeup source
[    1.170342] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.170345] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.176316] [sunxi-ehci1]: probe, pdev->name: 4200000.ehci1-controller, sunxi_ehci: 0xc0b4d9d0, 0x:c8827000,                                                                                                        d
[    1.188064] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.188068] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.194025] sunxi-ehci 4200000.ehci1-controller: 4200000.ehci1-controller supply drvvbus not found, using du                                                                                                        r
[    1.211532] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.211536] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.217598] sunxi-ehci 4200000.ehci1-controller: 4200000.ehci1-controller supply hci not found, using dummy                                                                                                         r
[    1.229723] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.229726] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.235555] sunxi-ehci 4200000.ehci1-controller: EHCI Host Controller
[    1.253099] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.253102] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.258691] sunxi-ehci 4200000.ehci1-controller: new USB bus registered, assigned bus number 1
[    1.271774] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.271777] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.304281] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.304284] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.315786] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.315789] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.315980] sunxi-ehci 4200000.ehci1-controller: irq 61, io mem 0x04200000
[    1.327274] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.327277] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.346395] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.346398] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.357880] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.357883] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.359712] sunxi-ehci 4200000.ehci1-controller: USB 2.0 started, EHCI 1.00
[    1.369326] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.369329] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.377946] hub 1-0:1.0: USB hub found
[    1.382703] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.382705] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.388620] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.388623] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.392855] hub 1-0:1.0: 1 port detected
[    1.404280] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.404283] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.410407] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    1.415692] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.415695] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.420159] sunxi-ohci: OHCI SUNXI driver
[    1.431557] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.431560] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.438956] get ohci1-controller wakeup-source is fail.
[    1.449958] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.449962] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.454536] sunxi ohci1-controller don't init wakeup source
[    1.460014] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.460017] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.465871] [sunxi-ohci1]: probe, pdev->name: 4200400.ohci1-controller, sunxi_ohci: 0xc0b4dc60
[    1.477322] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.477325] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.483200] sunxi-ohci 4200400.ohci1-controller: 4200400.ohci1-controller supply drvvbus not found, using du                                                                                                        r
[    1.495013] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.495016] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.501068] sunxi-ohci 4200400.ohci1-controller: 4200400.ohci1-controller supply hci not found, using dummy                                                                                                         r
[    1.510528] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.510530] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.516129] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.516131] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.522284] sunxi-ohci 4200400.ohci1-controller: OHCI Host Controller
[    1.539898] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.539902] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.545776] sunxi-ohci 4200400.ohci1-controller: new USB bus registered, assigned bus number 2
[    1.557644] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.557647] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.563456] sunxi-ohci 4200400.ohci1-controller: irq 62, io mem 0x04200400
[    1.574691] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.574694] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.639472] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.639476] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.650919] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.650922] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.654496] hub 2-0:1.0: USB hub found
[    1.662403] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.662406] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.666655] hub 2-0:1.0: 1 port detected
[    1.678055] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.678058] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.683142] i2c /dev entries driver
[    1.693925] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.693928] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.697914] sunxi cedar version 1.1
[    1.703400] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.703406] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.709453] sunxi-cedar 1c0e000.ve: Adding to iommu group 0
[    1.718777] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.718780] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.724714] VE: sunxi_cedar_probe power-domain init!!!
[    1.736475] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.736478] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.742337] VE: install start!!!
[    1.742337] 
[    1.753687] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.753690] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.759790] VE: cedar-ve the get irq is 41
[    1.759790] 
[    1.770408] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.770411] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.776427] VE: ve_debug_proc_info:(ptrval), data:(ptrval), lock:(ptrval)
[    1.776427] 
[    1.788098] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.788101] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.793963] VE: install end!!!
[    1.793963] 
[    1.808810] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.808813] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.814661] VE: sunxi_cedar_probe
[    1.814945] Bluetooth: HCI UART driver ver 2.3
[    1.825358] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.825361] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.831213] Bluetooth: HCI UART protocol H4 registered
[    1.839927] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.839930] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.845483] Bluetooth: HCI UART protocol BCSP registered
[    1.857123] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.857126] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.862981] Bluetooth: XRadio Bluetooth LPM Mode Driver Ver 1.0.10
[    1.874542] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.874545] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.881231] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pc not found, using dummy regulator
[    1.892962] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.892966] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.898710] sunxi-mmc 4022000.sdmmc: SD/MMC/SDIO Host Controller Driver(v4.25 2022-6-21 13:40)
[    1.915438] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.915441] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.921186] sunxi-mmc 4022000.sdmmc: ***ctl-spec-caps*** 308
[    1.936542] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.936545] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.942150] sunxi-mmc 4022000.sdmmc: No vmmc regulator found
[    1.954333] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.954336] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.959902] sunxi-mmc 4022000.sdmmc: No vqmmc regulator found
[    1.972127] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.972130] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.977688] sunxi-mmc 4022000.sdmmc: No vdmmc regulator found
[    1.983544] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    1.983546] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    1.989991] sunxi-mmc 4022000.sdmmc: No vd33sw regulator found
[    2.001434] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.001438] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.007871] sunxi-mmc 4022000.sdmmc: No vd18sw regulator found
[    2.019308] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.019311] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.025858] sunxi-mmc 4022000.sdmmc: No vq33sw regulator found
[    2.037290] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.037293] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.043831] sunxi-mmc 4022000.sdmmc: No vq18sw regulator found
[    2.055273] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.055276] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.061834] sunxi-mmc 4022000.sdmmc: Cann't get pin bias hs pinstate,check if needed
[    2.073255] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.073258] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.080526] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 0Hz bm PP pm UP vdd 21 width 1 timing LEGACY(SDR12) dt                                                                                                         B
[    2.091273] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.091277] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.112532] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.128119] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.128123] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.146595] sunxi-mmc 4022000.sdmmc: detmode:alway in(non removable)
[    2.157035] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.157039] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.164174] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.170854] sunxi-mmc 4020000.sdmmc: SD/MMC/SDIO Host Controller Driver(v4.25 2022-6-21 13:40)
[    2.178623] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.187234] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.187238] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.197167] sunxi-mmc 4020000.sdmmc: ***ctl-spec-caps*** 8
[    2.214129] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.214132] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.219983] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 400000Hz bm OD pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.226204] sunxi-mmc 4020000.sdmmc: No vmmc regulator found
[    2.255535] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.255539] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.255554] sunxi-mmc 4020000.sdmmc: No vqmmc regulator found
[    2.267009] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.267012] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.273452] sunxi-mmc 4020000.sdmmc: No vdmmc regulator found
[    2.284907] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.284910] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.291345] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 400000Hz bm OD pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.296933] sunxi-mmc 4020000.sdmmc: No vd33sw regulator found
[    2.302835] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 400000Hz bm OD pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.314385] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.314388] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.321002] sunxi-mmc 4020000.sdmmc: No vd18sw regulator found
[    2.338132] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.338135] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.343991] sunxi-mmc 4020000.sdmmc: No vq33sw regulator found
[    2.350527] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.350529] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.356123] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.356125] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.361978] sunxi-mmc 4020000.sdmmc: No vq18sw regulator found
[    2.374114] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.374116] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.379964] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 400000Hz bm OD pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.385962] sunxi-mmc 4020000.sdmmc: Got CD GPIO
[    2.406848] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.409393] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.409396] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.439026] sunxi-mmc 4022000.sdmmc: avoid to switch power_off_notification to POWERED_ON(0x01)
[    2.443476] sunxi-mmc 4020000.sdmmc: set cd-gpios as 24M fail
[    2.449211] sunxi-mmc 4022000.sdmmc: avoid to switch power_off_notification to POWERED_ON(0x01)
[    2.458988] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.458991] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.465409] sunxi-mmc 4022000.sdmmc: avoid to switch power_off_notification to POWERED_ON(0x01)
[    2.475415] sunxi-mmc 4020000.sdmmc: sdc set ios:clk 0Hz bm PP pm UP vdd 21 width 1 timing LEGACY(SDR12) dt                                                                                                         B
[    2.480770] sunxi-mmc 4022000.sdmmc: avoid to switch power_off_notification to POWERED_ON(0x01)
[    2.486648] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.486651] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.496433] sunxi-mmc 4020000.sdmmc: no vqmmc,Check if there is regulator
[    2.507513] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.507516] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.517333] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.517336] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.522888] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing MMC-HS(SDR20                                                                                                        B
[    2.536372] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.536376] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.541960] sunxi-mmc 4020000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.553397] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.553400] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.559658] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 50000000Hz bm PP pm ON vdd 21 width 1 timing MMC-HS(SDR                                                                                                        B
[    2.571090] sunxi-mmc 4020000.sdmmc: detmode:gpio irq
[    2.577336] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 50000000Hz bm PP pm ON vdd 21 width 4 timing MMC-HS(SDR                                                                                                        B
[    2.582320] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.582323] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.594455] sunxi-mmc 4021000.sdmmc: SD/MMC/SDIO Host Controller Driver(v4.25 2022-6-21 13:40)
[    2.599545] sunxi-mmc 4020000.sdmmc: sdc set ios:clk 0Hz bm PP pm OFF vdd 0 width 1 timing LEGACY(SDR12) dt                                                                                                         B
[    2.606182] sunxi-mmc 4022000.sdmmc: sdc set ios:clk 50000000Hz bm PP pm ON vdd 21 width 4 timing MMC-DDR52                                                                                                         B
[    2.617199] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.617203] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.623054] sunxi-mmc 4021000.sdmmc: ***ctl-spec-caps*** 8
[    2.695973] sunxi-mmc 4021000.sdmmc: No vmmc regulator found
[    2.697632] mmc0: new DDR MMC card at address 0001
[    2.702341] sunxi-mmc 4021000.sdmmc: No vqmmc regulator found
[    2.702348] sunxi-mmc 4021000.sdmmc: No vdmmc regulator found
[    2.708680] mmcblk0: mmc0:0001 MK004A 3.61 GiB 
[    2.714198] sunxi-mmc 4021000.sdmmc: No vd33sw regulator found
[    2.720899] mmcblk0rpmb: mmc0:0001 MK004A partition 3 4.00 MiB, chardev (248:0)
[    2.725717] sunxi-mmc 4021000.sdmmc: No vd18sw regulator found
[    2.742024]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8
[    2.747023] sunxi-mmc 4021000.sdmmc: No vq33sw regulator found
[    2.758453] sunxi-mmc 4021000.sdmmc: No vq18sw regulator found
[    2.765031] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.765034] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.769741] sunxi-mmc 4021000.sdmmc: Cann't get pin bias hs pinstate,check if needed
[    2.776501] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.776504] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.785933] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 0Hz bm PP pm UP vdd 21 width 1 timing LEGACY(SDR12) dt                                                                                                         B
[    2.790785] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.790788] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.796651] sunxi-mmc 4021000.sdmmc: no vqmmc,Check if there is regulator
[    2.813371] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    2.813374] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    2.831726] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.862476] sunxi-mmc 4021000.sdmmc: detmode:manually by software
[    2.870147] sunxi-mmc 4021000.sdmmc: smc 2 p1 err, cmd 52, RTO !!
[    2.877288] sunxi_led_probe()1749 - start
[    2.881837] sunxi-mmc 4021000.sdmmc: smc 2 p1 err, cmd 52, RTO !!
[    2.888707] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.900384] sunxi_get_str_of_property()1595 - failed to get the string of propname led_regulator!
[    2.903384] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12                                                                                                        B
[    2.910362] sunxi_register_led_classdev()1483 - led_classdev start
[    2.924111] sunxi-mmc 4021000.sdmmc: smc 2 p1 err, cmd 5, RTO !!
[    2.929894] sunxi_led_probe()1845 - finish
[    2.936465] sunxi-mmc 4021000.sdmmc: smc 2 p1 err, cmd 5, RTO !!
[    2.940250] [LCD_FB] disp_lcd_pwm_enable,line:401:
[    2.940253] pwm device hdl is NULL
[    2.947211] exFAT: Version 1.3.0
[    2.952337] sunxi-mmc 4021000.sdmmc: smc 2 p1 err, cmd 5, RTO !!
[    2.967354] sunxi-mmc 4021000.sdmmc: smc 2 p1 err, cmd 5, RTO !!
[    2.974150] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 0Hz bm PP pm OFF vdd 0 width 1 timing LEGACY(SDR12) dt                                                                                                         B
[    2.981048] [AUDIOCODEC][sunxi_codec_parse_params][2437]:digital_vol:0, lineout_vol:26, mic1gain:31, mic2gai                                                                                                        1
[    2.981048] 
[    3.002469] [AUDIOCODEC][sunxi_codec_parse_params][2473]:adcdrc_cfg:0, adchpf_cfg:1, dacdrc_cfg:0, dachpf:0
[    3.013852] [AUDIOCODEC][sunxi_internal_codec_probe][2634]:codec probe finished
[    3.022951] debugfs: Directory '203034c.dummy_cpudai' with parent 'audiocodec' already present!
[    3.032793] [SNDCODEC][sunxi_card_init][583]:card init finished
[    3.040019] sunxi-codec-machine 2030340.sound: 2030000.codec <-> 203034c.dummy_cpudai mapping ok
[    3.050902] input: audiocodec sunxi Audio Jack as /devices/platform/soc@3000000/2030340.sound/sound/card0/in                                                                                                        0
[    3.062847] [SNDCODEC][sunxi_card_dev_probe][836]:register card finished
[    3.071244] NET: Registered protocol family 10
[    3.077142] Segment Routing with IPv6
[    3.081304] [SNDCODEC][sunxi_hs_init_work][259]:resume-->report switch
[    3.088721] NET: Registered protocol family 17
[    3.093875] Bluetooth: RFCOMM TTY layer initialized
[    3.099358] Bluetooth: RFCOMM socket layer initialized
[    3.105168] Bluetooth: RFCOMM ver 1.11
[    3.109937] Registering SWP/SWPB emulation handler
[    3.129413] sunxi-i2c sunxi-i2c2: sunxi-i2c2 supply twi not found, using dummy regulator
[    3.139284] sunxi-i2c sunxi-i2c2: probe success
[    3.145963] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pb not found, using dummy regulator
[    3.158333] ======cw2015_probe===
[    3.175463] [drivers/power/supply/cw2015_battery.c: 513]trace : -------> cw2015_hw_init mode=00
[    3.188742] [drivers/power/supply/cw2015_battery.c: 594]trace : -------> cw2015_probe
[    3.197639] i2c-gpio i2c4_gpio: using lines 128 (SDA) and 129 (SCL)
[    3.205387] get ehci0-controller wakeup-source is fail.
[    3.211363] sunxi ehci0-controller don't init wakeup source
[    3.217619] [sunxi-ehci0]: probe, pdev->name: 4101000.ehci0-controller, sunxi_ehci: 0xc0b4d4b0, 0x:c8896000,                                                                                                        b
[    3.229635] [sunxi-ehci0]: Not init ehci0
[    3.234454] get ohci0-controller wakeup-source is fail.
[    3.240422] sunxi ohci0-controller don't init wakeup source
[    3.246675] [sunxi-ohci0]: probe, pdev->name: 4101400.ohci0-controller, sunxi_ohci: 0xc0b4d740
[    3.256351] [sunxi-ohci0]: Not init ohci0
[    3.261525] otg manager soc@3000000:usbc0@0: soc@3000000:usbc0@0 supply usbc not found, using dummy regulato                                                                                                        r
[    3.274990] clk: Not disabling unused clocks
[    3.279957] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[    3.289622] cfg80211: failed to load regulatory.db
[    3.295056] ALSA device list:
[    3.298384]   #0: audiocodec
[    3.307968] EXT4-fs (mmcblk0p5): mounted filesystem without journal. Opts: (null)
[    3.316461] VFS: Mounted root (ext4 filesystem) readonly on device 179:5.
[    3.324655] devtmpfs: mounted
[    3.329905] Freeing unused kernel memory: 1024K
[    3.359852] Run /pseudo_init as init process
mount: mounting none on /dev failed: Resource busy
[    3.509310] EXT4-fs: Warning: mounting with data=journal disables delayed allocation and O_DIRECT support!
[    3.522173] EXT4-fs (mmcblk0p7): mounted filesystem with journalled data mode. Opts: data=journal
Didn't found ubi volume "env"
Cannot open /dev/ubi0: No such file or directory
Didn't found ubi volume "env-redund"
Cannot open /dev/ubi0: No such file or directory
[    3.558609] random: fast init done
can't run '/etc/preinit': No such file or directory
mount: mounting proc on /proc failed: Resource busy
mount: mounting tmpfs on /run failed: No such file or directory
hostname: can't open '/etc/hostname': No such file or directory
------run rc.preboot file-----
[    3.690478] EXT4-fs (mmcblk0p8): mounted filesystem with ordered data mode. Opts: (null)
------run rc.modules file-----
------run rc.final file-----
numid=30,iface=MIXER,name='Headphone Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
------light up RGB LED-----
[    3.813165] file system registered
[    3.830737] configfs-gadget 4100000.udc-controller: failed to start g1: -19
sh: write error: No such device
[    3.855946] read descriptors
[    3.859193] read strings
------light up LED-----


BusyBox v1.27.2 () built-in shell (ash)

------run profile file-----
 _____  _              __     _
|_   _||_| ___  _ _   |  |   |_| ___  _ _  _ _
  | |   _ |   ||   |  |  |__ | ||   || | ||_'_|
  | |  | || | || _ |  |_____||_||_|_||___||_,_|
  |_|  |_||_|_||_|_|  Tina is Based on OpenWrt!
 ----------------------------------------------
 Tina Linux (Neptune, 61CC0487)
 ----------------------------------------------
Fri Nov 22 00:00:00 GMT 2024
nodev   debugfs
[    5.086413] random: app: uninitialized urandom read (4 bytes read)
QStandardPaths: wrong permissions on runtime directory /usr/lib/, 0755 instead of 0700
[    5.234450] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    5.234456] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    5.234576] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    5.234578] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    5.234582] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    5.234584] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
[    5.234628] [LCD_FB] lcd_fb_gpio_set_value,line:304:
[    5.234631] OSAL_GPIO_DevWRITE_ONEPIN_DATA, hdl is NULL
No such plugin for spec "tslib:/dev/input/event1"
hello.
[    6.879973] sunxi_usb_udc 4100000.udc-controller: 4100000.udc-controller supply udc not found, using dummy r                                                                                                        r
[    7.166708] android_work: sent uevent USB_STATE=CONNECTED
[    7.295067] configfs-gadget gadget: high-speed config #1: c
[    7.301392] android_work: sent uevent USB_STATE=CONFIGURED
[   33.799737] usb1-vbus: disabling

#39 Re: 全志 SOC » t113s3 tina2.1,想设置PE13位i2c2引脚,总是提示被占用,但设备树里没看到占用。 » 2024-12-04 12:39:10

想照着tina spi lcd文档建个驱动,结果硬件spi没输出。此过程修改了设备树和内核配置。
又想着改回去吧,仍选择fb pannel里的st7789v驱动,设备树也改回选这个,结果编译烧录后,屏上连雪花点都没了。示波器测量软件spi的管脚,sclk, sda, dc, cs,都有信号。
执行cat /dev/fb0,结果输出一堆信息然后就不走了。我记得之前是没信息的。

root@TinaLinux:/# cat /dev/fb0                                                                              
[   24.384531] disp_al_manager_apply ouput_type:1                                                           
[   24.389632] genirq: Flags mismatch irq 51. 00000004 (dispaly) vs. 00000004 (dispaly)                     
[   24.398393] [DISP] lcd_clk_config,line:774:                                                              
[   24.398404] disp 0, clk: pll(114000000),clk(114000000),dclk(19000000) dsi_rate(114000000)                
[   24.398404]      clk real:pll(288000000),clk(288000000),dclk(24000000) dsi_rate(0)                       
[   24.420776] [DISP] disp_sys_pwm_config,line:509:                                                         
[   24.420778] disp_sys_pwm_Config, handle is NULL!                                                         
[   24.431137] [DISP] disp_sys_pwm_set_polarity,line:528:                                                   
[   24.431140] disp_sys_pwm_Set_Polarity, handle is NULL!                                                   
[   32.532512] usb1-vbus: disabling          

我看信息里又disp_sys_pwm_request,然后就把设备树里lcd_pwm_used = <1>这句给注释了,结果没效果,改为<0>后,才消失一行信息。

---------------------------------------------

索性把内核驱动里的pwm关掉,变成这样了:

oot@TinaLinux:/# cat /dev/fb0                                                                                  
[   15.285819] disp_al_manager_apply ouput_type:1                                                               
[   15.291006] genirq: Flags mismatch irq 51. 00000004 (dispaly) vs. 00000004 (dispaly)                         
[   15.299774] [DISP] lcd_clk_config,line:774:                                                                  
[   15.299785] disp 0, clk: pll(114000000),clk(114000000),dclk(19000000) dsi_rate(114000000)                    
[   15.299785]      clk real:pll(288000000),clk(288000000),dclk(24000000) dsi_rate(0) 

Flags mismatch irq 51. 00000004 (dispaly) vs. 00000004 (dispaly) 
这咋还有中断了呢?

#40 Re: 工业芯 匠芯创 » 大佬求指点,100Pin的D133ECS,SDK里该选哪个? » 2024-12-03 12:51:41

要不,选88pin的试试?

据说,100pin的脚特别密。

#41 Re: 全志 SOC » t113s3 tina2.1,想设置PE13位i2c2引脚,总是提示被占用,但设备树里没看到占用。 » 2024-12-02 16:47:10

想接个中景园的1.14寸lcd屏幕,使用的是st7789v芯片,内核驱动里有个st7789v驱动,是用的软件模拟spi控制屏幕的,默认是240*240的。
直接用,在设备树里修改了分辨率和用到的gpio,结果背光亮,屏幕无显示。

中景园例程给的是单片机工程,比对了下初始化时发送的命令,修改st7789v.c里的初始化部分,改成发一样的命令,结果屏幕还是黑的。

单片机工程里用到了dc引脚,spi发送数据是8bit.st7789v.c里没用到dc管脚,发送9bit数据,第一bit表示命令或数据。按单片机工程修改为使用dc引脚,发送8bit数据,屏幕终于出现雪花点了,但是仍不正常。

看网上教程,执行 cat /dev/fb0 > screensnap,然后将screensnap传到Pc上以二进制方式查看:

$ ls -al
-rw-r--r-- 1 any any 129600 12月  2 16:33 screensnap

$ hexdump screensnap
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
001fa40

看软件模拟Spi发送数据时,每bit之间没有延迟,手动加了个延时,结果还是雪花点。

---------------------------------------------------------------------------------------

去掉延时。按找单片机例程,在st7789.c屏幕初始化的末尾,加了段区域填充的语句,结果屏幕初始化后,可以看到填充的句型,虽然分成了两条...
这么说,屏幕初始化其实是成功了。但是为何colorbar运行无反映?qt程序运行也无反映?

------------------------------------------------------------------------------------------

我是按单片机例程里填充区域写了几句:
初始化后,填充一小块矩形;

    LCD_Address_Set(0, 0, 29, 29);
    1     for (i = 0; i < 30; i++)
    2     {
    3         for (j = 0; j < 30; j++)
    4         {
    5             st7789v_spi_write_data(0xFF);
    6             st7789v_spi_write_data(0xFF);
    7         }
    8     }

设置填充区域:

static void LCD_Address_Set(u16 x1, u16 y1, u16 x2, u16 y2)
    1 {
    2     st7789v_spi_write_cmd(0x2a);
    3     st7789v_spi_write_data(0x00);
    4     st7789v_spi_write_data(x1+52);
    5     st7789v_spi_write_data(0x00);
    6     st7789v_spi_write_data(x2+52);
    7     st7789v_spi_write_cmd(0x2b);
    8     st7789v_spi_write_data(0x00);
    9     st7789v_spi_write_data(y1+40);
   10     st7789v_spi_write_data(0x00);
   11     st7789v_spi_write_data(y2+40);
   12     st7789v_spi_write_cmd(0x2c);
   13 }

这样,初始化后,屏幕确实可以刷出个白色矩形区域来。

但有个疑问:

struct __lcd_panel st7789v_panel = {
    1     /* panel driver name, must mach the name of lcd_drv_name in sys_config.fex
    2        */
    3     .name = "st7789v",
    4     .func = {
    5         .cfg_panel_info = LCD_cfg_panel_info,
    6         .cfg_open_flow = LCD_open_flow,
    7         .cfg_close_flow = LCD_close_flow,
    8         .lcd_user_defined_func = LCD_user_defined_func,
    9         },
   10 };

该驱动函数为上层函数其实只提供了这4个函数,user这个函数直接返回0。open函数里执行了屏幕初始化操作。
按单片机例程,无论画线还是画块,都是要先设置起始坐标的,也即是要发送0x2a, 0x2b, 0x2c这三组命令,但是我没看到有这些操作。

#42 Re: 全志 SOC » t113s3 tina2.1,想设置PE13位i2c2引脚,总是提示被占用,但设备树里没看到占用。 » 2024-12-02 08:34:26

@bestikun
还真是,感谢。
把这个bt的引脚注释掉后,i2c2出现了。
之前只搜了PE13,没想到中间加个空格也不影响,对设备树语法还是不熟悉。

---------------------------------------------------

            /* bt_rst_n      = <&pio PE 13 GPIO_ACTIVE_LOW>; */

仔细想了想,这不是设备树的pio写法。PE 13本来就是两个参数。

注释了这句或者改为其他IO后,i2c2可以成功创建了,但是adb功能有没了。
发现设备树里usb0有这句:

   /* usb_id_gpio = <&pio PE 12 GPIO_ACTIVE_HIGH>; */

和i2c2管脚也冲突了。
注释掉后正常了。
那么,usb id可以不用?

#43 Re: 全志 SOC » t113s3 tina2.1,想设置PE13位i2c2引脚,总是提示被占用,但设备树里没看到占用。 » 2024-11-29 15:32:21

还有个问题:
按这个教程,我在/etc/init.d/目录下加了个S99qtapp,给予了执行权限,添加了如下内容。

#!/bin/sh
#
# Start Qt app
#

start() {
    printf "Start qt app ..."
    /home/app 1
}

stop() {
    printf "Stopping qt app ..."
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart|reload)
        stop
        start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $?

写了个简单应用,qDebug打印了个"hello"。可启动后,调试串口没看到有打印,手动执行倒是能看到。

#44 全志 SOC » t113s3 tina2.1,想设置PE13位i2c2引脚,总是提示被占用,但设备树里没看到占用。 » 2024-11-29 13:40:53

Gentlepig
回复: 5

开机信息里相关信息如下:

[    2.323168] sunxi-i2c sunxi-i2c1: sunxi-i2c1 supply twi not found, using dummy regulator
[    2.333103] sunxi-i2c sunxi-i2c1: probe success     
[    2.338516] sun8iw20-pinctrl 2000000.pinctrl: pin PE13 already requested by 2000000.pinctrl:141; cannot claim for 2502800
[    2.351237] sun8iw20-pinctrl 2000000.pinctrl: pin-141 (2502800.twi) status -22
[    2.359364] sun8iw20-pinctrl 2000000.pinctrl: could not request pin 141 (PE13) from group PE13  on device 2000000.pinctrl
[    2.371678] sunxi-i2c 2502800.twi: Error applying setting, reverse things back
[    2.379819] sunxi-i2c: probe of 2502800.twi failed with error -22
[    2.388118] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pb not found, using dummy regulator
[    2.400490] get ehci0-controller wakeup-source is fail.

内核设备树相关如下:

&pio {
        twi2_pins_a: twi2@0 {
                pins = "PE12", "PE13";
                function = "twi2";
                muxsel = <2>;
                drive-strength = <10>;
        };
 
       twi2_pins_b: twi2@1 {
               pins = "PE12", "PE13";
               function = "gpio_in";
       };
};

&twi2 {
        clock-frequency = <400000>;
        pinctrl-0 = <&twi2_pins_a>;
        /* pinctrl-1 = <&twi2_pins_b>; */
        pinctrl-names = "default", "sleep";
        /* dmas = <&dma 45>, <&dma 45>; */
        /* dma-names = "tx", "rx"; */
        status = "okay";

        adxl345: gpio@53 {
                compatible = "allwinner, adxl345_i2c";
                reg = <0x53>;
                status = "okay";
        };
};

将twi2_pins引脚改为PG14,PG15,能显示出i2c2设备。

请教,这是哪里设置错了?

附件是设备树文件。
board.txt
sun8iw20p1.txt

#45 全志 SOC » t113i用调试口用串口0,存储介质用emmc,做下记录。 » 2024-11-27 16:19:16

Gentlepig
回复: 2

之前用spinand,从上电到进入系统,大约用10秒左右,改成emmc后,大约用6.5秒多一点,效果还是挺明显的。
记录下遇到的问题。

1 sdk,mango的github上的仓库下架后,下载sdk不是那么方便了,不过有些网盘还是有2.0,2.1的sdk的。有的比较大,8G的,11G的,有的较小是4G左右。不过是个repo文件,需要执行下命令,然后也就是8G多了。而且只是d1-h的sdk,然后需要找yuzu的补丁,原版仓库也下架了,不过github上有其他网友转存了。打上补丁后,就有t113s3-nezha了。

2 电源部分,这次先焊了各路dc/dc和t113s3,结果晶振一直不起振。后来发现是vcc-rtc没接,芯片就不工作。板子上有2个1.8V,一个是dcdc,一个是芯片自带的ldoa输出。vcc-rtc焊接到ldoa了,结果一个板子正常启动了,另一个发现dc/dc的1.8V不稳定了,从2.4-3.1V变化。将vcc-rtc焊接到dcdc的1.8V也不行。不过发现了个现象,用热风枪加热芯片后的一段时间内,dc/dc的1.8V是稳定的。这时能烧录程序,过一会就不行了,dcdc 1.8V就开始变化。将t113s3吹下来后重新焊接,vcc-rtc接在dcdc 1.8v,这时dcdc1.8V暂时稳定了,ldoa的输出变成2.7V了。程序较大时无法完成烧录,解决不了暂时放一边去了。ldoa输出接了AVCC和HPVCC,dcdc的1.8V接到了其他需要1.8V的地方。感觉可能时内部ldo坏了,这些需要1.8V的供电内部有的可能连到了一块?

3 调试串口,参考的https://blog.csdn.net/qq_39721016/article/details/125524789,结果uboot正常,跳转到内核就没信息了。最后发现还需要设置内核配置里的kernel hacking里的串口的物理和虚拟地址。更改后就可以看到内核调试信息了。

4 emmc部分,用了米德方客的4g容量的emmc,做了等长和阻抗。进内核以后加载根文件系统时,提示找不到mmcblk5,往上翻,看到有错误提示pc2被用作spi了不能再用作emmc引脚。找到内核设备树,关掉spi0功能,可以进到系统了。

#46 Re: 全志 SOC » t113 emmc 使用mq-R编译后,无法启动,卡在optee » 2024-11-27 13:19:46

同样使用emmc遇到了问题。
使用emmc,且调试串口修改为uart0。
修改了sys_concig.fex,设置调试串口为uart0。
一开始我也是卡在了
M/TC: OP-TEE version: 6aef7bb2-dirty (gcc version 5.3.1 20160412 (Linaro GCC 5.3-2016.05)) #1 Fri Jul 23 09:25:11 UTC 2021 arm
后来发现是uboot里没有设置uart为调试串口,设置uboot的sun8iw20p1_uart3_defconfig里的CONFIG_CONS_INDEX=1后,可以看到能进入uboot里。

但是最后启动内核没成功:

[30]HELLO! BOOT0 is starting!
[33]BOOT0 commit : 88480af-dirty
[36]set pll start
[42]periph0 has been enabled
[45]set pll end
[46][pmu]: bus read error
[49]board init ok
[51]ZQ value = 0x2f
[52]get_pmu_exist() = -1
[55]DRAM BOOT DRIVE INFO: V0.33
[58]DRAM CLK = 936 MHz
[60]DRAM Type = 3 (2:DDR2,3:DDR3)
[63]DRAMC read ODT  off.
[65]DRAM ODT value: 0x42.
[68]ddr_efuse_type: 0xa
[71]DRAM SIZE =128 M
[73]dram_tpr4:0x0
[75]PLL_DDR_CTRL_REG:0xf8004d00
[78]DRAM_CLK_REG:0xc0000000
[80][TIMING DEBUG] MR2= 0x20
[88]DRAM simple test OK.
[90]rtc standby flag is 0x0, super standby flag is 0x0
[95]dram size =128
[98]card no is 2
[100]sdcard 2 line count 4
[102][mmc]: mmc driver ver 2021-05-21 14:47
[112][mmc]: Wrong media type 0x0, but host sdc2, try mmc first
[117][mmc]: ***Try MMC card 2***
[140][mmc]: RMCA OK!
[142][mmc]: mmc 2 bias 0
[154][mmc]: MMC 5.1
[156][mmc]: HSSDR52/SDR25 4 bit
[159][mmc]: 50000000 Hz
[161][mmc]: 3700 MB
[163][mmc]: ***SD/MMC 2 init OK!!!***
[234]Loading boot-pkg Succeed(index=0).
[238]Entry_name        = u-boot
[243]Entry_name        = optee
[247]Entry_name        = dtb
[250]tunning data addr:0x430003e8
[253]Jump to second Boot.
M/TC: OP-TEE version: 6aef7bb2-dirty (gcc version 5.3.1 20160412 (Linaro GCC 5.3-2016.05)) #1 Fri Jul 23 09:25:                                                                                                        m


U-Boot 2018.07-ge987def5-dirty (Nov 27 2024 - 10:42:25 +0800) Allwinner Technology

[00.307]CPU:   Allwinner Family
[00.309]Model: sun8iw20
I2C:   FDT ERROR:fdt_set_all_pin:[twi0]-->FDT_ERR_BADPATH
FDT ERROR:fdt_set_all_pin:[twi1]-->FDT_ERR_BADPATH
ready
[00.331]DRAM:  128 MiB
[00.334]Relocation Offset is: 04eff000
[00.353]secure enable bit: 0
[00.356]smc_tee_inform_fdt failed with: ffff000a
[00.362]CPU=1008 MHz,PLL6=600 Mhz,AHB=200 Mhz, APB1=100Mhz  MBus=300Mhz
[00.368]gic: sec monitor mode
sunxi flash map init
[00.373]flash init start
[00.375]workmode = 0,storage type = 2
[00.378][mmc]: mmc driver ver uboot2018:2021-12-20 13:35:00
[00.385][mmc]: SUNXI SDMMC Controller Version:0x50310
[00.413][mmc]: Best spd md: 2-HSDDR52/DDR50, freq: 2-50000000, Bus width: 4
[00.420]sunxi flash init ok
[00.425]Loading Environment from SUNXI_FLASH... OK
[00.439]Item0 (Map) magic is bad
[00.442]the secure storage item0 copy0 magic is bad
[00.446]Item0 (Map) magic is bad
[00.449]the secure storage item0 copy1 magic is bad
[00.454]Item0 (Map) magic is bad
secure storage read widevine fail
[00.460]secure storage read widevine fail with:-1
secure storage read ec_key fail
[00.467]secure storage read ec_key fail with:-1
secure storage read ec_cert1 fail
[00.474]secure storage read ec_cert1 fail with:-1
secure storage read ec_cert2 fail
[00.482]secure storage read ec_cert2 fail with:-1
secure storage read ec_cert3 fail
[00.489]secure storage read ec_cert3 fail with:-1
secure storage read rsa_key fail
[00.496]secure storage read rsa_key fail with:-1
secure storage read rsa_cert1 fail
[00.504]secure storage read rsa_cert1 fail with:-1
secure storage read rsa_cert2 fail
[00.512]secure storage read rsa_cert2 fail with:-1
secure storage read rsa_cert3 fail
[00.519]secure storage read rsa_cert3 fail with:-1
[00.524]out of usb burn from boot: not need burn key
root_partition is rootfs
set root to /dev/mmcblk0p5
[00.533]update part info
[00.536]update bootcmd
[00.538]change working_fdt 0x43ebee70 to 0x43e9ee70
[00.543][mmc]: no mmc-hs400-1_8v!
[00.546][mmc]: delete mmc-hs200-1_8v from dtb
[00.550][mmc]: get max-frequency ok 50000000 Hz
disable nand error: FDT_ERR_BADPATH
[00.568]update dts
Hit any key to stop autoboot:  0 
[05.667]no vendor_boot partition is found
Android's image name: t113-nezha
[05.679]Starting kernel ...

[05.681][mmc]: mmc exit start
[05.698][mmc]: mmc 2 exit ok

停止autoboot后,printenv如下:

=> printenv
boot_dsp0=sunxi_flash read 45000000 ${dsp0_partition};bootr 45000000 0 0
boot_fastboot=fastboot
boot_normal=sunxi_flash read 45000000 ${boot_partition};bootm 45000000
boot_partition=boot
boot_recovery=sunxi_flash read 45000000 recovery;bootm 45000000
bootcmd=run setargs_mmc boot_normal
bootdelay=5
cma=8M
console=ttyS0,115200
dsp0_partition=dsp0
earlyprintk=sunxi-uart,0x02500000
fdtcontroladdr=43ebee70
force_normal_boot=1
init=/pseudo_init
initcall_debug=0
keybox_list=widevine,ec_key,ec_cert1,ec_cert2,ec_cert3,rsa_key,rsa_cert1,rsa_cert2,rsa_cert3
loglevel=8
mmc_root=/dev/mmcblk0p5
mtd_name=sys
mtdids=
mtdparts=
nand_root=/dev/ubiblock0_5
partition=
partitions=boot-resource@mmcblk0p1:env@mmcblk0p2:env-redund@mmcblk0p3:boot@mmcblk0p4:rootfs@mmcblk0p5:private@m                                                                                                        8
root_partition=rootfs
rootfstype=ext4
setargs_mmc=setenv  bootargs earlyprintk=${earlyprintk} clk_ignore_unused initcall_debug=${initcall_debug} cons                                                                                                        1
setargs_nand=setenv bootargs ubi.mtd=${mtd_name} ubi.block=0,${root_partition} earlyprintk=${earlyprintk} clk_i                                                                                                        1
setargs_nand_ubi=setenv bootargs ubi.mtd=${mtd_name} ubi.block=0,${root_partition} earlyprintk=${earlyprintk} c                                                                                                        1

Environment size: 2005/131067 bytes

请教,这是哪里设置出错了?

基本是按这个帖子修改的。https://bbs.aw-ol.com/topic/1701/tina-linux-%E5%AD%98%E5%82%A8%E4%BB%8B%E8%B4%A8%E5%88%87%E6%8D%A2-emmc-spi-nand-spi-nor-sd-card-sd-nand/5

--------------------------------------------

进展了一点。
其实是进到内核里了,只是内核状态时调试串口没改对。
make kernel_menuconfig/kernel hacking里,有个串口的物理地址和虚拟地址,改成uart0对应的0x02500000后就可以了。

但是加载根文件系统失败:

[30]HELLO! BOOT0 is starting!                                                 
[33]BOOT0 commit : 88480af-dirty                                                                            
[36]set pll start                                                                                           
[42]periph0 has been enabled                                                                                
[45]set pll end                                                                                             
[46][pmu]: bus read error                                                                                   
[49]board init ok                                                                                           
[51]ZQ value = 0x2f                                                                                         
[52]get_pmu_exist() = -1                                                                                    
[55]DRAM BOOT DRIVE INFO: V0.33                                                                             
[58]DRAM CLK = 936 MHz                                                                                      
[60]DRAM Type = 3 (2:DDR2,3:DDR3)                                                                           
[63]DRAMC read ODT  off.                                                                                    
[65]DRAM ODT value: 0x42.                                                                                   
[68]ddr_efuse_type: 0xa                                                                                     
[71]DRAM SIZE =128 M                                                                                        
[73]dram_tpr4:0x0                                                                                           
[75]PLL_DDR_CTRL_REG:0xf8004d00                                                                             
[78]DRAM_CLK_REG:0xc0000000                                                                                 
[80][TIMING DEBUG] MR2= 0x20                                                                                
[88]DRAM simple test OK.                                                                                    
[90]rtc standby flag is 0x0, super standby flag is 0x0                                                      
[95]dram size =128                                                                                          
[98]card no is 2                                                                                            
[100]sdcard 2 line count 4                                                                                  
[102][mmc]: mmc driver ver 2021-05-21 14:47                                                                 
[111][mmc]: Wrong media type 0x0, but host sdc2, try mmc first                                              
[117][mmc]: ***Try MMC card 2***                                                                            
[140][mmc]: RMCA OK!                                                                                        
[142][mmc]: mmc 2 bias 0                                                                                    
[154][mmc]: MMC 5.1                                                                                         
[156][mmc]: HSSDR52/SDR25 4 bit                                                                             
[158][mmc]: 50000000 Hz                                                                                     
[161][mmc]: 3700 MB                                                                                         
[163][mmc]: ***SD/MMC 2 init OK!!!***                                                                       
[234]Loading boot-pkg Succeed(index=0).                                                                     
[237]Entry_name        = u-boot                                                                             
[243]Entry_name        = optee                                                                              
[247]Entry_name        = dtb                                                                                
[250]tunning data addr:0x430003e8                                                                           
[253]Jump to second Boot.                                                                                   
M/TC: OP-TEE version: 6aef7bb2-dirty (gcc version 5.3.1 20160412 (Linaro GCC 5.3-2016.05)) #1 Fri Jul 23 09m
                                                                                                            
                                                                                                            
U-Boot 2018.07-ge987def5-dirty (Nov 27 2024 - 14:56:37 +0800) Allwinner Technology                          
                                                                                                            
[00.306]CPU:   Allwinner Family                                                                             
[00.309]Model: sun8iw20                                                                                     
I2C:   FDT ERROR:fdt_set_all_pin:[twi0]-->FDT_ERR_BADPATH                                                   
FDT ERROR:fdt_set_all_pin:[twi1]-->FDT_ERR_BADPATH                                                          
ready                                                                                                       
[00.330]DRAM:  128 MiB                                                                                      
[00.334]Relocation Offset is: 04eff000                                                                      
[00.353]secure enable bit: 0                                                                                
[00.356]smc_tee_inform_fdt failed with: ffff000a                                                            
[00.361]CPU=1008 MHz,PLL6=600 Mhz,AHB=200 Mhz, APB1=100Mhz  MBus=300Mhz                                     
[00.367]gic: sec monitor mode                                                                               
sunxi flash map init                                                                                        
[00.372]flash init start                                                                                    
[00.374]workmode = 0,storage type = 2                                                                       
[00.378][mmc]: mmc driver ver uboot2018:2021-12-20 13:35:00                                                 
[00.384][mmc]: SUNXI SDMMC Controller Version:0x50310                                                       
[00.413][mmc]: Best spd md: 2-HSDDR52/DDR50, freq: 2-50000000, Bus width: 4                                 
[00.420]sunxi flash init ok                                                                                 
[00.425]Loading Environment from SUNXI_FLASH... OK                                                          
[00.439]Item0 (Map) magic is bad                                                                            
[00.441]the secure storage item0 copy0 magic is bad                                                         
[00.446]Item0 (Map) magic is bad                                                                            
[00.449]the secure storage item0 copy1 magic is bad                                                         
[00.454]Item0 (Map) magic is bad                                                                            
secure storage read widevine fail                                                                           
[00.460]secure storage read widevine fail with:-1                                                           
secure storage read ec_key fail                                                                             
[00.467]secure storage read ec_key fail with:-1                                                             
secure storage read ec_cert1 fail                                                                           
[00.474]secure storage read ec_cert1 fail with:-1                                                           
secure storage read ec_cert2 fail                                                                           
[00.482]secure storage read ec_cert2 fail with:-1                                                           
secure storage read ec_cert3 fail                                                                           
[00.489]secure storage read ec_cert3 fail with:-1                                                           
secure storage read rsa_key fail                                                                            
[00.496]secure storage read rsa_key fail with:-1                                                            
secure storage read rsa_cert1 fail                                                                          
[00.504]secure storage read rsa_cert1 fail with:-1                                                          
secure storage read rsa_cert2 fail                                                                          
[00.511]secure storage read rsa_cert2 fail with:-1                                                          
secure storage read rsa_cert3 fail                                                                          
[00.519]secure storage read rsa_cert3 fail with:-1                                                          
[00.524]out of usb burn from boot: not need burn key                                                        
root_partition is rootfs                                                                                    
set root to /dev/mmcblk0p5                                                                                  
[00.533]update part info                                                                                    
[00.536]update bootcmd                                                                                      
[00.538]change working_fdt 0x43ebee70 to 0x43e9ee70                                                         
[00.543][mmc]: no mmc-hs400-1_8v!                                                                           
[00.546][mmc]: delete mmc-hs200-1_8v from dtb                                                               
[00.550][mmc]: get max-frequency ok 50000000 Hz                                                             
disable nand error: FDT_ERR_BADPATH                                                                         
[00.568]update dts                                                                                          
Hit any key to stop autoboot:  0                                                                            
[01.659]no vendor_boot partition is found                                                                   
Android's image name: t113-nezha                                                                            
[01.670]Starting kernel ...                                                                                 
                                                                                                            
[01.673][mmc]: mmc exit start                                                                               
[01.690][mmc]: mmc 2 exit ok                                                                                
[    0.000000] Booting Linux on physical CPU 0x0                                                            
[    0.000000] Linux version 5.4.61 (any@Any-PC) (arm-openwrt-linux-muslgnueabi-gcc.bin (OpenWrt/Linaro GCC4
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d                              
[    0.000000] CPU: div instructions available: patching division code                                      
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache                     
[    0.000000] OF: fdt: Machine model: sun8iw20                                                             
[    0.000000] printk: bootconsole [earlycon0] enabled                                                      
[    0.000000] Memory policy: Data cache writealloc                                                         
[    0.000000] cma: Reserved 8 MiB at 0x47800000                                                            
[    0.000000] On node 0 totalpages: 32768                                                                  
[    0.000000]   Normal zone: 256 pages used for memmap                                                     
[    0.000000]   Normal zone: 0 pages reserved                                                              
[    0.000000]   Normal zone: 32768 pages, LIFO batch:7                                                     
[    0.000000] psci: probing for conduit method from DT.                                                    
[    0.000000] psci: PSCIv1.0 detected in firmware.                                                         
[    0.000000] psci: Using standard PSCI v0.2 function IDs                                                  
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.                                                       
[    0.000000] psci: SMC Calling Convention v1.0                                                            
[    0.000000] percpu: Embedded 15 pages/cpu s30348 r8192 d22900 u61440                                     
[    0.000000] pcpu-alloc: s30348 r8192 d22900 u61440 alloc=15*4096                                         
[    0.000000] pcpu-alloc: [0] 0 [0] 1                                                                      
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 32512                                 
[    0.000000] Kernel command line: earlyprintk=sunxi-uart,0x02500000 clk_ignore_unused initcall_debug=0 co 
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes, linear)                       
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes, linear)                         
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off                                      
[    0.000000] Memory: 109652K/131072K available (6144K kernel code, 254K rwdata, 1484K rodata, 1024K init,)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1                                   
[    0.000000] rcu: Preemptible hierarchical RCU implementation.                                            
[    0.000000]  Tasks RCU enabled.                                                                          
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.                       
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16                                              
[    0.000000] random: get_random_bytes called from start_kernel+0x264/0x3e8 with crng_init=0               
[    0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).                                        
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: s
[    0.000006] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns                  
[    0.008007] Switching to timer-based delay loop, resolution 41ns                                         
[    0.014184] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns     
[    0.023886] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (l)
[    0.034267] pid_max: default: 32768 minimum: 301                                                         
[    0.039015] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)                          
[    0.046348] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)                     
[    0.054665] CPU: Testing write buffer coherency: ok                                                      
[    0.059878] /cpus/cpu@0 missing clock-frequency property                                                 
[    0.065193] /cpus/cpu@1 missing clock-frequency property                                                 
[    0.070540] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000                                             
[    0.076704] Setting up static identity map for 0x40100000 - 0x40100060                                   
[    0.083365] rcu: Hierarchical SRCU implementation.                                                       
[    0.088565] smp: Bringing up secondary CPUs ...                                                          
[    0.094185] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001                                             
[    0.094303] smp: Brought up 1 node, 2 CPUs                                                               
[    0.104149] SMP: Total of 2 processors activated (96.00 BogoMIPS).                                       
[    0.110344] CPU: All CPU(s) started in SVC mode.                                                         
[    0.115414] devtmpfs: initialized                                                                        
[    0.130076] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5                      
[    0.138205] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911260446275000s
[    0.148069] futex hash table entries: 512 (order: 3, 32768 bytes, linear)                                
[    0.155302] pinctrl core: initialized pinctrl subsystem                                                  
[    0.161482] NET: Registered protocol family 16                                                           
[    0.167335] DMA: preallocated 256 KiB pool for atomic coherent allocations                               
[    0.203258] rtc_ccu: sunxi ccu init OK                                                                   
[    0.209320] ccu: sunxi ccu init OK                                                                       
[    0.213146] r_ccu: sunxi ccu init OK                                                                     
[    0.233999] sun6i-dma 3002000.dma-controller: sunxi dma probed                                           
[    0.241582] iommu: Default domain type: Translated                                                       
[    0.246618] sunxi iommu: irq = 24                                                                        
[    0.250832] SCSI subsystem initialized                                                                   
[    0.254790] usbcore: registered new interface driver usbfs                                               
[    0.260352] usbcore: registered new interface driver hub                                                 
[    0.265739] usbcore: registered new device driver usb                                                    
[    0.271613] Advanced Linux Sound Architecture Driver Initialized.                                        
[    0.278432] Bluetooth: Core ver 2.22                                                                     
[    0.282073] NET: Registered protocol family 31                                                           
[    0.286519] Bluetooth: HCI device and connection manager initialized                                     
[    0.292925] Bluetooth: HCI socket layer initialized                                                      
[    0.297798] Bluetooth: L2CAP socket layer initialized                                                    
[    0.302865] Bluetooth: SCO socket layer initialized                                                      
[    0.308010] pwm module init!                                                                             
[    0.312054] g2d 5410000.g2d: Adding to iommu group 0                                                     
[    0.317317] G2D: rcq version initialized.major:252                                                       
[    0.322868] clocksource: Switched to clocksource arch_sys_counter                                        
[    0.337301] sun8iw20-pinctrl 2000000.pinctrl: initialized sunXi PIO driver                               
[    0.346605] NET: Registered protocol family 2                                                            
[    0.351522] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 6144 bytes, linear)              
[    0.359946] TCP established hash table entries: 1024 (order: 0, 4096 bytes, linear)                      
[    0.367643] TCP bind hash table entries: 1024 (order: 1, 8192 bytes, linear)                             
[    0.374747] TCP: Hash tables configured (established 1024 bind 1024)                                     
[    0.381194] UDP hash table entries: 256 (order: 1, 8192 bytes, linear)                                   
[    0.387775] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)                              
[    0.394967] NET: Registered protocol family 1                                                            
[    0.400265] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pc not found, using dummy regulr
[    0.410577] spi spi0: spi0 supply spi not found, using dummy regulator                                   
[    0.417298] sunxi_spi_resource_get()2438 - [spi0] SPI MASTER MODE                                        
[    0.423461] sunxi_spi_resource_get()2476 - Failed to get sample mode                                     
[    0.429822] sunxi_spi_resource_get()2481 - Failed to get sample delay                                    
[    0.436277] sunxi_spi_resource_get()2485 - sample_mode:-1431633921 sample_delay:-1431633921              
[    0.444703] sunxi_spi_clk_init()2527 - [spi0] mclk 100000000                                             
[    0.450956] sunxi_spi_probe()2978 - [spi0]: driver probe succeed, base c881f000, irq 41                  
[    0.460525] workingset: timestamp_bits=30 max_order=15 bucket_order=0                                    
[    0.471877] squashfs: version 4.0 (2009/01/31) Phillip Lougher                                           
[    0.477898] ntfs: driver 2.1.32 [Flags: R/W].                                                            
[    0.511002] io scheduler mq-deadline registered                                                          
[    0.515564] io scheduler kyber registered                                                                
[    0.520592] [DISP]disp_module_init                                                                       
[    0.524569] disp 5000000.disp: Adding to iommu group 0                                                   
[    0.530243] [DISP] parser_disp_init_para,line:1430:                                                      
[    0.530247] of_property_read fb0_width fail                                                              
[    0.550519] disp 5000000.disp: 5000000.disp supply vcc-lcd not found, using dummy regulator              
[    0.559092] disp 5000000.disp: 5000000.disp supply vcc-pd not found, using dummy regulator               
[    0.572289] [DISP] disp_sys_pwm_request,line:442:                                                        
[    0.572294] disp_sys_pwm_request pwm 8 fail! -517                                                        
[    0.581720] [DISP] disp_sys_pwm_config,line:509:                                                         
[    0.581723] disp_sys_pwm_Config, handle is NULL!                                                         
[    0.591394] display_fb_request,fb_id:0                                                                   
[    0.595407] [DISP] Fb_copy_boot_fb,line:1445:                                                            
[    0.595411] no boot_fb0                                                                                  
[    0.602627] disp_al_manager_apply ouput_type:0                                                           
[    0.607601] [DISP]disp_module_init finish                                                                
[    0.612414] [DISP] lcd_clk_config,line:774:                                                              
[    0.612425] disp 0, clk: pll(114000000),clk(114000000),dclk(19000000) dsi_rate(114000000)                
[    0.612425]      clk real:pll(288000000),clk(288000000),dclk(24000000) dsi_rate(0)                       
[    0.612722] sunxi_sid_init()783 - insmod ok                                                              
[    0.616688] [DISP] disp_sys_pwm_request,line:442:                                                        
[    0.616692] disp_sys_pwm_request pwm 8 fail! -517                                                        
[    0.633579] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pe not found, using dummy regulr
[    0.636671] [DISP] disp_sys_pwm_config,line:509:                                                         
[    0.636673] disp_sys_pwm_Config, handle is NULL!                                                         
[    0.641700] uart uart0: uart0 supply uart not found, using dummy regulator                               
[    0.646108] [DISP] disp_sys_pwm_set_polarity,line:528:                                                   
[    0.646112] disp_sys_pwm_Set_Polarity, handle is NULL!                                                   
[    0.682642] uart0: ttyS0 at MMIO 0x2500000 (irq = 34, base_baud = 1500000) is a SUNXI                    
[    0.690545] sw_console_setup()1807 - console setup baud 115200 parity n bits 8, flow n                   
[    0.698526] printk: console [ttyS0] enabled                                                              
[    0.698526] printk: console [ttyS0] enabled                                                              
[    0.707401] printk: bootconsole [earlycon0] disabled                                                     
[    0.707401] printk: bootconsole [earlycon0] disabled                                                     
[    0.718734] misc dump reg init                                                                           
[    0.723315] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pg not found, using dummy regulr
[    0.734524] sunxi-rfkill soc@3000000:rfkill@0: module version: v1.0.9                                    
[    0.741764] sunxi-rfkill soc@3000000:rfkill@0: get gpio chip_en failed                                   
[    0.749118] sunxi-rfkill soc@3000000:rfkill@0: get gpio power_en failed                                  
[    0.756557] sunxi-rfkill soc@3000000:rfkill@0: wlan_busnum (1)                                           
[    0.763114] sunxi-rfkill soc@3000000:rfkill@0: Missing wlan_power.                                       
[    0.770060] sunxi-rfkill soc@3000000:rfkill@0: wlan clock[0] (32k-fanout1)                               
[    0.777818] sunxi-rfkill soc@3000000:rfkill@0: wlan_regon gpio=204 assert=1                              
[    0.785682] sunxi-rfkill soc@3000000:rfkill@0: wlan_hostwake gpio=202 assert=1                           
[    0.793813] sunxi-rfkill soc@3000000:rfkill@0: wakeup source is enabled                                  
[    0.801437] sunxi-rfkill soc@3000000:rfkill@0: Missing bt_power.                                         
[    0.808214] sunxi-rfkill soc@3000000:rfkill@0: bt clock[0] (32k-fanout1)                                 
[    0.815763] sunxi-rfkill soc@3000000:rfkill@0: bt_rst gpio=141 assert=0                                  
[    0.823768] [ADDR_MGT] addr_mgt_probe: module version: v1.0.11                                           
[    0.830930] [ADDR_MGT] addr_mgt_probe: success.                                                          
[    0.836313] dma-buf: Running sanitycheck                                                                 
[    0.840710] dma-buf: Running dma_fence                                                                   
[    0.844971] sizeof(dma_fence)=48                                                                         
[    0.848682] dma-buf: Running dma_fence/sanitycheck                                                       
[    0.854081] dma-buf: Running dma_fence/test_signaling                                                    
[    0.859745] dma-buf: Running dma_fence/test_add_callback                                                 
[    0.865742] dma-buf: Running dma_fence/test_late_add_callback                                            
[    0.872187] dma-buf: Running dma_fence/test_rm_callback                                                  
[    0.878067] dma-buf: Running dma_fence/test_late_rm_callback                                             
[    0.884428] dma-buf: Running dma_fence/test_status                                                       
[    0.889799] dma-buf: Running dma_fence/test_error                                                        
[    0.895085] dma-buf: Running dma_fence/test_wait                                                         
[    0.900263] dma-buf: Running dma_fence/test_wait_timeout                                                 
[    0.942879] dma-buf: Running dma_fence/test_stub                                                         
[    0.948075] dma-buf: Running dma_fence/race_signal_callback                                              
[    1.022884] thread_signal_callback[0] completed 36031 passes, 196 misses                                 
[    1.030423] thread_signal_callback[1] completed 36038 passes, 204 misses                                 
[    1.102886] thread_signal_callback[0] completed 39420 passes, 39420 misses                               
[    1.110627] thread_signal_callback[1] completed 39379 passes, 39378 misses                               
[    1.118903] libphy: Fixed MDIO Bus: probed                                                               
[    1.124218] sun8iw20-pinctrl 2000000.pinctrl: pin PE2 already requested by 2500000.uart; cannot claim foh
[    1.136206] sun8iw20-pinctrl 2000000.pinctrl: pin-130 (4500000.eth) status -22                           
[    1.144382] sun8iw20-pinctrl 2000000.pinctrl: could not request pin 130 (PE2) from group PE2  on device l
[    1.156499] sunxi-gmac 4500000.eth: Error applying setting, reverse things back                          
[    1.164750] sunxi-gmac: probe of 4500000.eth failed with error -22                                       
[    1.171853] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver                                   
[    1.179218] sunxi-ehci: EHCI SUNXI driver                                                                
[    1.184283] get ehci1-controller wakeup-source is fail.                                                  
[    1.190241] sunxi ehci1-controller don't init wakeup source                                              
[    1.196582] [sunxi-ehci1]: probe, pdev->name: 4200000.ehci1-controller, sunxi_ehci: 0xc0b5a928, 0x:c8835d
[    1.208635] sunxi-ehci 4200000.ehci1-controller: 4200000.ehci1-controller supply drvvbus not found, usinr
[    1.221121] sunxi-ehci 4200000.ehci1-controller: 4200000.ehci1-controller supply hci not found, using dur
[    1.233304] sunxi-ehci 4200000.ehci1-controller: EHCI Host Controller                                    
[    1.240558] sunxi-ehci 4200000.ehci1-controller: new USB bus registered, assigned bus number 1           
[    1.250561] sunxi-ehci 4200000.ehci1-controller: irq 61, io mem 0x04200000                               
[    1.282895] sunxi-ehci 4200000.ehci1-controller: USB 2.0 started, EHCI 1.00                              
[    1.291529] hub 1-0:1.0: USB hub found                                                                   
[    1.295791] hub 1-0:1.0: 1 port detected                                                                 
[    1.300736] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver                                       
[    1.307721] sunxi-ohci: OHCI SUNXI driver                                                                
[    1.312693] get ohci1-controller wakeup-source is fail.                                                  
[    1.318671] sunxi ohci1-controller don't init wakeup source                                              
[    1.324941] [sunxi-ohci1]: probe, pdev->name: 4200400.ohci1-controller, sunxi_ohci: 0xc0b5abb8           
[    1.334635] sunxi-ohci 4200400.ohci1-controller: 4200400.ohci1-controller supply drvvbus not found, usinr
[    1.347137] sunxi-ohci 4200400.ohci1-controller: 4200400.ohci1-controller supply hci not found, using dur
[    1.359333] sunxi-ohci 4200400.ohci1-controller: OHCI Host Controller                                    
[    1.366616] sunxi-ohci 4200400.ohci1-controller: new USB bus registered, assigned bus number 2           
[    1.379560] sunxi-ohci 4200400.ohci1-controller: irq 62, io mem 0x04200400                               
[    1.457656] hub 2-0:1.0: USB hub found                                                                   
[    1.461906] hub 2-0:1.0: 1 port detected                                                                 
[    1.466984] i2c /dev entries driver                                                                      
[    1.470971] sunxi cedar version 1.1                                                                      
[    1.475093] sunxi-cedar 1c0e000.ve: Adding to iommu group 0                                              
[    1.481406] VE: sunxi_cedar_probe power-domain init!!!                                                   
[    1.487266] VE: install start!!!                                                                         
[    1.487266]                                                                                              
[    1.492752] VE: cedar-ve the get irq is 42                                                               
[    1.492752]                                                                                              
[    1.499209] VE: ve_debug_proc_info:(ptrval), data:(ptrval), lock:(ptrval)                                
[    1.499209]                                                                                              
[    1.508503] VE: install end!!!                                                                           
[    1.508503]                                                                                              
[    1.513593] VE: sunxi_cedar_probe                                                                        
[    1.517554] Bluetooth: HCI UART driver ver 2.3                                                           
[    1.522539] Bluetooth: HCI UART protocol H4 registered                                                   
[    1.528322] Bluetooth: HCI UART protocol BCSP registered                                                 
[    1.534576] Bluetooth: XRadio Bluetooth LPM Mode Driver Ver 1.0.10                                       
[    1.542508] sun8iw20-pinctrl 2000000.pinctrl: pin PC2 already requested by 4025000.spi; cannot claim forc
[    1.554542] sun8iw20-pinctrl 2000000.pinctrl: pin-66 (4022000.sdmmc) status -22                          
[    1.562745] sun8iw20-pinctrl 2000000.pinctrl: could not request pin 66 (PC2) from group PC2  on device 2l
[    1.574764] sunxi-mmc 4022000.sdmmc: Error applying setting, reverse things back                         
[    1.583103] sunxi-mmc: probe of 4022000.sdmmc failed with error -22                                      
[    1.591116] sunxi-mmc 4020000.sdmmc: SD/MMC/SDIO Host Controller Driver(v4.25 2022-6-21 13:40)           
[    1.601006] sunxi-mmc 4020000.sdmmc: ***ctl-spec-caps*** 8                                               
[    1.607214] sunxi-mmc 4020000.sdmmc: No vmmc regulator found                                             
[    1.613576] sunxi-mmc 4020000.sdmmc: No vqmmc regulator found                                            
[    1.620020] sunxi-mmc 4020000.sdmmc: No vdmmc regulator found                                            
[    1.626477] sunxi-mmc 4020000.sdmmc: No vd33sw regulator found                                           
[    1.633030] sunxi-mmc 4020000.sdmmc: No vd18sw regulator found                                           
[    1.639571] sunxi-mmc 4020000.sdmmc: No vq33sw regulator found                                           
[    1.646122] sunxi-mmc 4020000.sdmmc: No vq18sw regulator found                                           
[    1.653103] sunxi-mmc 4020000.sdmmc: Got CD GPIO                                                         
[    1.658466] sunxi-mmc 4020000.sdmmc: set cd-gpios as 24M fail                                            
[    1.665119] sunxi-mmc 4020000.sdmmc: sdc set ios:clk 0Hz bm PP pm UP vdd 21 width 1 timing LEGACY(SDR12)B
[    1.676301] sunxi-mmc 4020000.sdmmc: no vqmmc,Check if there is regulator                                
[    1.696461] sunxi-mmc 4020000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SB
[    1.720873] sunxi-mmc 4020000.sdmmc: detmode:gpio irq                                                    
[    1.726604] sunxi-mmc 4020000.sdmmc: sdc set ios:clk 0Hz bm PP pm OFF vdd 0 width 1 timing LEGACY(SDR12)B
[    1.738216] sunxi-mmc 4021000.sdmmc: SD/MMC/SDIO Host Controller Driver(v4.25 2022-6-21 13:40)           
[    1.748096] sunxi-mmc 4021000.sdmmc: ***ctl-spec-caps*** 8                                               
[    1.754311] sunxi-mmc 4021000.sdmmc: No vmmc regulator found                                             
[    1.760659] sunxi-mmc 4021000.sdmmc: No vqmmc regulator found                                            
[    1.767117] sunxi-mmc 4021000.sdmmc: No vdmmc regulator found                                            
[    1.773572] sunxi-mmc 4021000.sdmmc: No vd33sw regulator found                                           
[    1.780113] sunxi-mmc 4021000.sdmmc: No vd18sw regulator found                                           
[    1.786666] sunxi-mmc 4021000.sdmmc: No vq33sw regulator found                                           
[    1.793218] sunxi-mmc 4021000.sdmmc: No vq18sw regulator found                                           
[    1.799776] sunxi-mmc 4021000.sdmmc: Cann't get pin bias hs pinstate,check if needed                     
[    1.809140] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 0Hz bm PP pm UP vdd 21 width 1 timing LEGACY(SDR12)B
[    1.820365] sunxi-mmc 4021000.sdmmc: no vqmmc,Check if there is regulator                                
[    1.840527] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SB
[    1.864764] sunxi-mmc 4021000.sdmmc: detmode:manually by software                                        
[    1.872437] sunxi-mmc 4021000.sdmmc: smc 1 p1 err, cmd 52, RTO !!                                        
[    1.872590] sunxi_led_probe()1749 - start                                                                
[    1.883882] sunxi_get_str_of_property()1595 - failed to get the string of propname led_regulator!        
[    1.884645] sunxi-mmc 4021000.sdmmc: smc 1 p1 err, cmd 52, RTO !!                                        
[    1.893859] sunxi_register_led_classdev()1483 - led_classdev start                                       
[    1.907625] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SB
[    1.920227] sunxi_led_probe()1845 - finish                                                               
[    1.925082] exFAT: Version 1.3.0                                                                         
[    1.926145] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SB
[    1.930597] [AUDIOCODEC][sunxi_codec_parse_params][2437]:digital_vol:0, lineout_vol:26, mic1gain:31, mic1
[    1.930597]                                                                                              
[    1.957562] sunxi-mmc 4021000.sdmmc: smc 1 p1 err, cmd 5, RTO !!                                         
[    1.964346] sunxi-mmc 4021000.sdmmc: smc 1 p1 err, cmd 5, RTO !!                                         
[    1.971096] sunxi-mmc 4021000.sdmmc: smc 1 p1 err, cmd 5, RTO !!                                         
[    1.977864] sunxi-mmc 4021000.sdmmc: smc 1 p1 err, cmd 5, RTO !!                                         
[    1.977889] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 0Hz bm PP pm OFF vdd 0 width 1 timing LEGACY(SDR12)B
[    1.984649] [AUDIOCODEC][sunxi_codec_parse_params][2473]:adcdrc_cfg:0, adchpf_cfg:1, dacdrc_cfg:0, dachp0
[    1.995775] [DISP] disp_sys_pwm_request,line:442:                                                        
[    1.995783] disp_sys_pwm_request pwm 8 fail! -517                                                        
[    2.007152] [AUDIOCODEC][sunxi_internal_codec_probe][2634]:codec probe finished                          
[    2.011984] [DISP] disp_lcd_pwm_enable,line:1271:                                                        
[    2.011987] pwm device hdl is NULL                                                                       
[    2.018174] debugfs: Directory '203034c.dummy_cpudai' with parent 'audiocodec' already present!          
[    2.025561] [DISP] disp_device_attached_and_enable,line:233:                                             
[    2.025566] attached ok, mgr0<-->dev0                                                                    
[    2.030865] [SNDCODEC][sunxi_card_init][583]:card init finished                                          
[    2.034652] [DISP] disp_device_attached_and_enable,line:236:                                             
[    2.034660] type:1,mode:0,fmt:rgb,bits:8bits,eotf:4,cs:0 dvi_hdmi:2, range:2 scan:0 ratio:8              
[    2.077562] sunxi-codec-machine 2030340.sound: 2030000.codec <-> 203034c.dummy_cpudai mapping ok         
[    2.088477] input: audiocodec sunxi Audio Jack as /devices/platform/soc@3000000/2030340.sound/sound/card0
[    2.100427] [SNDCODEC][sunxi_card_dev_probe][836]:register card finished                                 
[    2.108800] NET: Registered protocol family 10                                                           
[    2.113854] [SNDCODEC][sunxi_hs_init_work][259]:resume-->report switch                                   
[    2.122088] Segment Routing with IPv6                                                                    
[    2.126324] NET: Registered protocol family 17                                                           
[    2.131469] Bluetooth: RFCOMM TTY layer initialized                                                      
[    2.137000] Bluetooth: RFCOMM socket layer initialized                                                   
[    2.142791] Bluetooth: RFCOMM ver 1.11                                                                   
[    2.147573] Registering SWP/SWPB emulation handler                                                       
[    2.167211] sun8iw20-pinctrl 2000000.pinctrl: pin PE2 already requested by 2500000.uart; cannot claim foh
[    2.179190] sun8iw20-pinctrl 2000000.pinctrl: pin-130 (4500000.eth) status -22                           
[    2.187317] sun8iw20-pinctrl 2000000.pinctrl: could not request pin 130 (PE2) from group PE2  on device l
[    2.199447] sunxi-gmac 4500000.eth: Error applying setting, reverse things back                          
[    2.207708] sunxi-gmac: probe of 4500000.eth failed with error -22                                       
[    2.214954] sun8iw20-pinctrl 2000000.pinctrl: pin PC2 already requested by 4025000.spi; cannot claim forc
[    2.226973] sun8iw20-pinctrl 2000000.pinctrl: pin-66 (4022000.sdmmc) status -22                          
[    2.235187] sun8iw20-pinctrl 2000000.pinctrl: could not request pin 66 (PC2) from group PC2  on device 2l
[    2.247196] sunxi-mmc 4022000.sdmmc: Error applying setting, reverse things back                         
[    2.255525] sunxi-mmc: probe of 4022000.sdmmc failed with error -22                                      
[    2.263933] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pb not found, using dummy regulr
[    2.276306] get ehci0-controller wakeup-source is fail.                                                  
[    2.282265] sunxi ehci0-controller don't init wakeup source                                              
[    2.288541] [sunxi-ehci0]: probe, pdev->name: 4101000.ehci0-controller, sunxi_ehci: 0xc0b5a408, 0x:c88b8b
[    2.300557] [sunxi-ehci0]: Not init ehci0                                                                
[    2.305397] get ohci0-controller wakeup-source is fail.                                                  
[    2.311345] sunxi ohci0-controller don't init wakeup source                                              
[    2.317648] [sunxi-ohci0]: probe, pdev->name: 4101400.ohci0-controller, sunxi_ohci: 0xc0b5a698           
[    2.327323] [sunxi-ohci0]: Not init ohci0                                                                
[    2.332525] otg manager soc@3000000:usbc0@0: soc@3000000:usbc0@0 supply usbc not found, using dummy regur
[    2.346128] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2           
[    2.355863] cfg80211: failed to load regulatory.db                                                       
[    2.355877] clk: Not disabling unused clocks                                                             
[    2.366051] ALSA device list:                                                                            
[    2.369377]   #0: audiocodec                                                                             
[    2.372610] alloc_fd: slot 0 not NULL!                                                                   
[    2.377191] VFS: Cannot open root device "mmcblk0p5" or unknown-block(0,0): error -6                     
[    2.385895] Please append a correct "root=" boot option; here are the available partitions:              
[    2.395290] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)               
[    2.404568] CPU1: stopping                                                                               
[    2.407605] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 5.4.61 #36                                         
[    2.414339] Hardware name: Generic DT based system                                                       
[    2.419733] [<c010de6c>] (unwind_backtrace) from [<c010a614>] (show_stack+0x10/0x14)                     
[    2.428430] [<c010a614>] (show_stack) from [<c062be28>] (dump_stack+0x88/0xa4)                           
[    2.436537] [<c062be28>] (dump_stack) from [<c010c254>] (handle_IPI+0xe4/0x180)                          
[    2.444742] [<c010c254>] (handle_IPI) from [<c0316614>] (gic_handle_irq+0x70/0x78)                       
[    2.453238] [<c0316614>] (gic_handle_irq) from [<c01021cc>] (__irq_svc+0x6c/0xa8)                        
[    2.461630] Exception stack(0xc705df80 to 0xc705dfc8)                                                    
[    2.467298] df80: 00000400 c76c7334 00000000 c01147a0 00000002 c705c000 c0a03de8 c0a03e24                
[    2.476474] dfa0: 4000406a 410fc075 00000000 00000000 c0b46748 c705dfd0 c0107f68 c0107f58                
[    2.485646] dfc0: 60000013 ffffffff                                                                      
[    2.489562] [<c01021cc>] (__irq_svc) from [<c0107f58>] (arch_cpu_idle+0x1c/0x38)                         
[    2.497864] [<c0107f58>] (arch_cpu_idle) from [<c013d43c>] (do_idle+0xd4/0x128)                          
[    2.506067] [<c013d43c>] (do_idle) from [<c013d728>] (cpu_startup_entry+0x18/0x20)                       
[    2.514561] [<c013d728>] (cpu_startup_entry) from [<40102bac>] (0x40102bac)                              
[    2.522381] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---

#47 Re: 硬件设计 KiCAD/Protel/DXP/PADS/ORCAD/EAGLE » 4层板一般选哪种层压结构? » 2024-11-21 10:18:06

明白了些。
比如如1.6厚度板子,选用3313的话,50欧阻抗120欧阻抗线径,大约是6-8mil。选7628结构的话,120欧阻抗可能就要13mil的,如果线距设6-8mil的话。
如果是1.2厚度的板子,选3313的话,线径可能就有点细了,而选7628结构,大都在8mil左右。

#48 Re: 全志 SOC » 网上下载的t113用的tina5.x sdk,无t113s3配置,求个补丁。 » 2024-11-21 09:49:56

来尔的:

Lunch menu... pick a combo:
     1	t113-awol_evb1-tina
     2	t113-dev-tina
     3	t113-evb1_auto_nor-tina
     4	t113-evb1_auto-tina
     5	t113-evb1-tina
     6	t113_i-evb1_auto_nand-tina
     7	t113_i-evb1_auto-tina
     8	t113-pro-tina
     9	t113s2-evb1-tina
    10	t113s2-evb_axp313a-tina
Which would you like? [Default t113__i-evb1_auto]: 

只有选6和7才不报错,其他则报错:

Which would you like? [Default t113_i-evb1_auto]: 5
Jump to longan autoconfig
/home/any/mpu/t113s3/myirdd/T113/build.sh autoconfig -o openwrt -i t113 -b evb1 		-n default 
========ACTION List: mk_autoconfig -o openwrt -i t113 -b evb1 -n default;========
options : 

#49 全志 SOC » 网上下载的t113用的tina5.x sdk,无t113s3配置,求个补丁。 » 2024-11-21 09:12:16

Gentlepig
回复: 2

下了千问的sdk,打上了补丁,lucn选项里有t113i和t113s4,但是没有s3的,网友们,有补丁使其出现s3配置吗?
创虎的sdk,lunch里只有t113i。
但是我看网上帖子,tina5 lunch后有七八个选项,我下的这两个sdk,都只有三四个选项。

#50 Re: 全志 SOC » T113-s3使用Tina SDK编译Qt5.12.9失败 » 2024-11-21 09:07:13

过了快一年了,又编译了一遍qt,基于t113s3的tina2.1sdk。又遇到这些问题。感谢楼主的分享。
autoconfigure.sh脚本里一开始的export STAGING_DIR命令,执行脚本后,貌似没起作用,编译会有警告STAGING_DIR是空的,然后编译会报错,qlogging.cpp:  `backtrace'啥的。在执行脚本前,在命令行里手动执行下export STAGING_DIR=XXX,就不会报这些错误。
在ubuntu22.04下编译qt5.12,还会有些报错,和std:min  std:max相关的,找到报错的文件,加上#include<limits>即可解决。
在ubuntu22.04下编译qt5.15,也有报错,好像是std:某个模板参数不能为空,没找到解决办法,不过看编译过程的提示需要GCC版本大于7,sdk自带的是6.x版本。于是放弃qt5.15转而下载qt5.12。tina5.x的gcc版本有10和11,也许不会报这些错误。

另编译qt时,这个STAGING_DIR到底是干啥的?虽然修改为只想sdk/out/xxx/staging_dir后编译通过了,但是想知道其用途。

#51 Re: 全志 SOC » T113-I ddr初始化失败[悬赏200块] » 2024-11-21 08:56:48

aeo1234 说:

@Gentlepig

一比一对着接线已知不行,之前这个就是完全对着接的。焊接肯定没问题

那么之前的板,地址线,是一一对应的吗?
后来是如何改的?

还没走过ddr线,好奇。好像看imx6ul官方板地址线也不是一一对应的,这个必须软件上也做对应调整吗?

-----------------------------

下载了imx6ul原理图,地址线是一一对应的,数据线是打乱了的...
0 4 7 3 1 5 6 2 8 9 10 11 12 13 14 15.

#52 Re: 全志 SOC » T113-I ddr初始化失败[悬赏200块] » 2024-11-18 17:00:08

创龙开发板多少钱出?
----------------------------
算啦,才想起来创龙的t113i板没有rgb接口。

#53 Re: 全志 SOC » T113-I ddr初始化失败[悬赏200块] » 2024-11-18 12:25:46

suibian 说:

哈哈,200要归我了。
找到全志的参考原理图调整数据线的线序,你这个线序不对。

没看明白,看了下官方这个图,数据线是一一对应的,地址线倒是打乱了。
楼主截图只截出了数据线,貌似和官方原理图一样的,地址线没截出来。

#54 Re: 硬件设计 KiCAD/Protel/DXP/PADS/ORCAD/EAGLE » 4层板一般选哪种层压结构? » 2024-11-11 10:11:38

lcfmax 说:

这两种都可以啊,最好GND位于主芯片这边

感谢。另7268,3313,1080这些,常见一般用哪个?

#55 硬件设计 KiCAD/Protel/DXP/PADS/ORCAD/EAGLE » 4层板一般选哪种层压结构? » 2024-11-11 08:42:16

Gentlepig
回复: 5

成品1.6厚度,家里创默认好像是7628结构,群里有朋友推荐3313,看嘉立创列表,还有1080, 2116,以及带各种字母后缀的。
一般选哪种好呢?

另就是四层板的堆叠一般选哪种?
元件/信号-----地层-----电源-----信号
还是
元件/信号-----电源-----地层-----信号

#56 硬件设计 KiCAD/Protel/DXP/PADS/ORCAD/EAGLE » 请教,emmc的clk和cmd两个信号如何走线? » 2024-11-11 08:34:57

Gentlepig
回复: 3

想用t113s3接emmc试试,4bit模式。bit0-bit3倒是好说,大都在最外层引脚上,clk和cmd信号就特别靠里了。
1 看了下nezha开发板的pcb图,到emmc处就变成3.3mil的线径走线了,这也太细了...
2 在立创开源上找了另一个emmc的t113s3开源工程,线径倒是没变细,但是clk和cmd是到接近emmc时打孔到底层,再走线到emmc的cmd和clk管脚位置处打孔回到顶层。
以上两个板子都是两层板。

3还有找了个文章,还介绍了一种方法,cmd和clk连接多个nc管脚走到芯片外。

方法1就不打算尝试了,也太细了,立创好像支持3.5mil。
2和3选哪种好呢?

#57 Re: 全志 SOC » 分享一个自己做的T113-S3/S4开发板 » 2024-11-07 14:52:06

感谢分享,lceda格式的,能导入到kicad。
请问sdk用的哪一个?
之前用的mango的,忘了是2.0还是2.1,不过github上的仓库移除了。
新的是5.x了吧,有没有办法搞到呢?不想让代理商上门访问...

#58 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » FreeRTOS运行Lvgl,应该如何设计框架的? » 2024-10-15 17:56:32

armstrong 说:

ui界面应该和其它逻辑分离,要做到关闭ui线程,程序仍然正常工作,只是无法与用户交互。

那么ui线程和其他线程的数据交互如何处理好呢?用信号量?还是全局变量?
比如其他线程定时采集大量数据,每隔几秒要在ui上刷新。

#59 Re: 工业芯 匠芯创 » 请教如何定位D133程序崩溃的位置 » 2024-10-15 17:38:06

hzqlz 说:
Gentlepig 说:

不用硬件调试器行不行啊?
像linux那样,可以通过usb或网口进行gdb调试就好了。

基础太差了,还不了解这方法,我学习一下,谢谢大佬提供思路

我是说如果rtt也能像linux那样可以通过usb或网口进行gdb调试就好了。

#60 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » 请教rtt目录下的menuconfig.py和python库里的menuconfig.py名字冲突了,如何解决呢? » 2024-10-15 17:36:11

海石生风 说:

也可用python -m venv 为sdk单独创建一个的scons运行环境,不要将其它软件安装到这个环境即可。

实际用着venv,也激活了,但是不知为何还是先用到了系统的python环境变量。

#61 Re: 工业芯 匠芯创 » 请教如何定位D133程序崩溃的位置 » 2024-10-14 09:39:09

不用硬件调试器行不行啊?
像linux那样,可以通过usb或网口进行gdb调试就好了。

#62 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 好奇大疆无人机主控用的什么芯片? » 2024-10-14 09:37:04

Gentlepig
回复: 0

网上看到的开源飞控一般用cortex m4, m7芯片。刷b站看到这个:
https://www.bilibili.com/video/BV1vatDewEN8/?spm_id_from=333.337.search-card.all.click
好奇用的什么主控,有评论说是e3t方案,没搜到这个芯片的信息。
又搜到个拆解视频,也有e3t,不过说是光电传感器。
https://mbb.eet-china.com/forum/topic/145037_1_1.html

#63 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » 请教rtt目录下的menuconfig.py和python库里的menuconfig.py名字冲突了,如何解决呢? » 2024-10-14 09:28:12

Gentlepig
回复: 3

ubuntu下d133的sdk,使用的是rtt。之前编译正常,这几天貌似下过别的软件,安装过一些python库。再次编译时报错了:

$ me
scons: Reading SConscript files ...
ImportError: cannot import name 'mk_rtconfig' from 'menuconfig' (/home/any/.local/lib/python3.10/site-packages/menuconfig.py):
  File "/home/any/Mcu/artinchip/luban-lite/SConstruct", line 11:
    chk_prj_config(AIC_ROOT)
  File "/home/any/Mcu/artinchip/luban-lite/tools/scripts/aic_build.py", line 1426:
    from menuconfig import mk_rtconfig

显示调用的是python/site-packages/menuconfig.py,实际应该调用的是rtt/tools/meunconfig.py。
目前是将python目录下的该名了,暂时可以正常编译。有没有其他解决办法呢?

#64 Re: 工业芯 匠芯创 » D133EBS LVGL 显示异常 » 2024-10-14 08:43:57

是不是色深选择的不合适?
比如板子是rgb565,lcd参数这里也是设置了16位,而lvgl里设置成了32位。或者相反。

#65 Re: 全志 SOC » 搞定 T113 / T113-S3 裸奔驱动CAN (转) » 2024-09-30 11:56:05

xing 说:

有人用这个代码跑起来了吗?

可以成功运行的。

#66 Re: 工业芯 匠芯创 » D211DBV Lanqsuen RISC-V开发板的原理图官方公开么,买了板子没给资料 » 2024-09-23 10:30:58

xsx_kair 说:

@cchhiipp
麻烦你先发我一个吧,我周六问的,到现在没回复
https://whycan.com/files/members/10858/QQ截图20240922222301.png

图片不打下码吗?姓名、电话、地址,全发网上了啊,个人隐私不重要吗?
坑网貌似是发帖24小时内可编辑,赶紧修改下吧,要不私聊站长给你撤掉图片吧。

#67 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,编译edge源码,报错找不到__aeabi_read_tp。 » 2024-09-21 11:29:31

重新下载工程,再次编译,通过了。

回想下,可能还是环境搭建的问题。
一开始git clone仓库后,直接编译,遇到了些报错,有些是和python相关的,比如缺少jinjia2、lz4等。不想将这些python库安装到根目录下,于是创建了python虚拟环境,pip下载了相应库。再编译,还是报错,经群友提醒在tools目录下有个环境搭建脚本,执行了后,应该是把需要的一些软件下载了。但是编译还是有问题,感觉可能是依赖问题。后来删了下载的git仓库,再重新下载,再编译就通过了。

#68 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,编译edge源码,报错找不到__aeabi_read_tp。 » 2024-09-20 13:11:29

https://github.com/EdgeTX/edgetx/wiki/Build-Instructions-under-Ubuntu-20.04
按这个来的,不过我是ubuntu22.04。
执行的是:

cmake -DPCB=X10 -DPCBREV=TX16S -DDEFAULT_MODE=2 -DGVARS=YES -DPPM_UNIT=US -DLUA_MIXER=YES -DCMAKE_BUILD_TYPE=Debug ../

搜了工程,没搜到mtp关键字相关。

-------------------------------------

以下是执行cmake和make configure时的输出信息,执行make firmware98%报错,信息在顶楼。

(edgeTxEnv) any@Any-Desktop:~/Mcu/DownloadFromWeb/edgetx/edgetx_main/build-output$ cmake -DPCB=X10 -DPCBREV=TX16S -DDEFAULT_MODE=2 -DGVARS=YES -DPPM_UNIT=US -DLUA_MIXER=YES -DCMAKE_BUILD_TYPE=Debug ../
-- CMAKE_ARGS: -DDEBUG=YES;-DDEFAULT_MODE=2;-DGVARS=YES;-DHELI=NO;-DINTERNAL_GPS=YES;-DLUA=YES;-DLUA_MIXER=YES;-DPCB=X10;-DPCBREV=TX16S;-DPPM_UNIT=US
-- CMAKE_BUILD_TYPE: Debug
-- Configuring done
-- Generating done
-- Build files have been written to: /home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/build-output
(edgeTxEnv) any@Any-Desktop:~/Mcu/DownloadFromWeb/edgetx/edgetx_main/build-output$ make configure
[ 50%] Built target arm-none-eabi-configure
[ 60%] Creating directories for 'native'
[ 70%] No download step for 'native'
[ 80%] No update step for 'native'
[ 90%] No patch step for 'native'
[100%] Performing configure step for 'native'
loading initial cache file /home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/build-output/native-prefix/tmp/native-cache-Debug.cmake
-- Python found, version: 3.10.12
-- EdgeTX 2.11.0-selfbuild @ e303b126
-- Foxlib found at /usr/lib/x86_64-linux-gnu/libFOX-1.6.so
-- Qt Version: 5.15.3
-- SDL2 Lib: /usr/lib/x86_64-linux-gnu/libSDL2.so Libs: -L/usr/lib/x86_64-linux-gnu  -lSDL2; Headers: /usr/include/SDL2
-- Simulators library search path: ../lib/companion211
Fetched miniz source code from Github: /home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/build-output/native/_deps/miniz-src
Fetched yaml-cpp source code from Github: /home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/build-output/native/_deps/yaml-cpp-src
-- Qt Version: 5.15.3
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) 
Fetched maxLibQt source code from Github: /home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/build-output/native/_deps/maxlibqt-src/src
TARGET companion211: cpp compiler /usr/bin/c++ v11
-- Added optional gtests-companion target
-- install /home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/build-output/native to /usr
-- Downloading linuxdeploy and plugins...
-- Downloading linuxdeploy and plugins finished
mv: 对 '/home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/build-output/native/squashfs-root' 调用 stat 失败: 没有那个文件或目录
-- Internal GPS enabled
-- Adding support for USB serial
-- Adding support for PXX1 as internal module
-- Adding support for PXX2 as internal module
-- Adding support for MULTI as internal module
-- Adding support for CRSF as internal module
TARGET simu/libsimulator: cpp compiler /usr/bin/c++ v11
-- Added optional gtests target
-- firmware target disabled
-- Configuring done
-- Generating done
-- Build files have been written to: /home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/build-output/native
[100%] Built target native-configure
[100%] Built target configure

#69 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,编译edge源码,报错找不到__aeabi_read_tp。 » 2024-09-20 09:12:15

Gentlepig
回复: 3
[ 97%] Building CXX object radio/src/CMakeFiles/firmware.dir/targets/common/arm/stm32/flysky_gimbal_driver.cpp.obj
[ 97%] Building C object radio/src/CMakeFiles/firmware.dir/syscalls.c.obj
[ 98%] Building CXX object radio/src/CMakeFiles/firmware.dir/cli.cpp.obj
[ 98%] Linking CXX executable ../../firmware.elf
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: ../../firmware.elf: section .tbss._ZL24stbi__de_iphone_flag_set lma 0x815a8fc adjusted to 0x815a900
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: ../../firmware.elf: section .tbss._ZL26stbi__de_iphone_flag_local lma 0x815a8fc adjusted to 0x815a904
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: ../../firmware.elf: section .tbss._ZL31stbi__unpremultiply_on_load_set lma 0x815a8fc adjusted to 0x815a908
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: ../../firmware.elf: section .tbss._ZL33stbi__unpremultiply_on_load_local lma 0x815a8fc adjusted to 0x815a90c
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: ../../firmware.elf: section .tbss._ZL33stbi__vertically_flip_on_load_set lma 0x815a8fc adjusted to 0x815a910
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: ../../firmware.elf: section .tbss._ZL35stbi__vertically_flip_on_load_local lma 0x815a8fc adjusted to 0x815a914
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: CMakeFiles/firmware.dir/gui/colorlcd/libui/bitmapbuffer_fileio.cpp.obj: in function `stbi__build_huffman(stbi__huffman*, int*)':
/home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/radio/src/thirdparty/stb/stb_image.h:979: undefined reference to `__aeabi_read_tp'
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: /home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/radio/src/thirdparty/stb/stb_image.h:979: undefined reference to `__aeabi_read_tp'
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: CMakeFiles/firmware.dir/gui/colorlcd/libui/bitmapbuffer_fileio.cpp.obj: in function `stbi__zbuild_huffman(stbi__zhuffman*, unsigned char const*, int)':
/home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/radio/src/thirdparty/stb/stb_image.h:979: undefined reference to `__aeabi_read_tp'
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: /home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/radio/src/thirdparty/stb/stb_image.h:979: undefined reference to `__aeabi_read_tp'
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: CMakeFiles/firmware.dir/gui/colorlcd/libui/bitmapbuffer_fileio.cpp.obj: in function `stbi__convert_format(unsigned char*, int, int, unsigned int, unsigned int)':
/home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/radio/src/thirdparty/stb/stb_image.h:979: undefined reference to `__aeabi_read_tp'
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: CMakeFiles/firmware.dir/gui/colorlcd/libui/bitmapbuffer_fileio.cpp.obj:/home/any/Mcu/DownloadFromWeb/edgetx/edgetx_main/radio/src/thirdparty/stb/stb_image.h:979: more undefined references to `__aeabi_read_tp' follow
collect2: error: ld returned 1 exit status
make[7]: *** [radio/src/CMakeFiles/firmware.dir/build.make:7687:firmware.elf] 错误 1
make[6]: *** [CMakeFiles/Makefile2:747:radio/src/CMakeFiles/firmware.dir/all] 错误 2
make[5]: *** [CMakeFiles/Makefile2:754:radio/src/CMakeFiles/firmware.dir/rule] 错误 2
make[4]: *** [Makefile:384:firmware] 错误 2
make[3]: *** [CMakeFiles/firmware.dir/build.make:70:CMakeFiles/firmware] 错误 2
make[2]: *** [CMakeFiles/Makefile2:409:CMakeFiles/firmware.dir/all] 错误 2
make[1]: *** [CMakeFiles/Makefile2:416:CMakeFiles/firmware.dir/rule] 错误 2

编译进度都98%了,结果出这个错...
网上搜了下,貌似和交叉编译有关,有的是直接创建个空函数。

#70 Re: 工业芯 匠芯创 » D133EBS使用 » 2024-09-20 09:09:52

据说100脚的封装管脚特别密,不好画板还是不好加工来着。

#71 Re: 工业芯 匠芯创 » 看到gitee有D215了 » 2024-09-19 08:40:22

怀念以前的合宙,单片机板9.9元交个朋友,还想等合宙出linux开发板呢,结果策略变了。

#72 Re: 工业芯 匠芯创 » 看到gitee有D215了 » 2024-09-18 10:59:42

我以为要出512M内存版本,结果貌似还是64M内存。这是做减法?

#73 Re: 工业芯 匠芯创 » 求购一块D21X的板子,需要有摄像头和屏幕,哪位大佬有,我买来学习 » 2024-09-18 10:47:35

xsx_kair 说:

@642242855
这个屏的介绍好像rgb只支持5寸的,请问怎么搞7寸和10.1的

看了下介绍,rgb接口是rgb666,5寸和7寸差别估计也就是背光部分了,估计7寸也能用,如果官方能提供原理图的话,你可以看下背光部分电路。
10寸的话,可以考虑lvds接口,这个板不是也带了么。

另,在其他帖子里看到你打算用rtt,那还可以考虑d133啊。官方最便宜的开发板139元rgb接口带4.3寸屏。299的rgb接口和lvds接口都有,带7寸lvds屏,带电容触摸,感觉也是值的。

#74 Re: 工业芯 匠芯创 » D211的CAN通讯如何避免死机 » 2024-09-18 10:40:39

@ArtInChip
那就太好了,稍后试试1.0.6。

#75 Re: 工业芯 匠芯创 » 求购一块D21X的板子,需要有摄像头和屏幕,哪位大佬有,我买来学习 » 2024-09-14 16:50:17

https://item.taobao.com/item.htm?abbuck … 1a24%22%7D
搜了下,这家比较便宜。

启明智显的M4好像也是用的D21X,不过看了下,7寸的也接近400元了。
D211和D213芯片差价不会太大的,有价格合适的,买D213也挺好。

--------------------------------------------------------------------------------

不过看了下好几家用这个图片,感觉不一定是真实卖的...
慎重选择吧。

-------------------------------------------------------------------------------

要不就参照官方原理图进行删减,自己画一版,难度也不大。

#76 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » artinchip d133移植awtk hmi的一些心得,记录一下。 » 2024-09-12 15:35:49

Gentlepig
回复: 0

群里看到有群友介绍awtk hmi,也许适当裁减下可运行在8M内存的d133cbs下,不过现在出了16M的d133ccs,内存问题不用担忧了。
lubanlite sdk里自带移植好的awtk,虽然不是最新的,但是移植相关部分在awtk-rtos目录下,直接更新awtk源码不会对运行awtk造成影响。参考awtk-hmi里的介绍,将所需的几个仓库下载下来,awtk-mvvm, awtk-hmi等。
将各目录逐个加入scon工程目录。awtk, awtk-mvvm都要全部加入,awtk-hmi除了common目录外,都是demo,加入一个demo即可。
有几个注意的地方,记录一下。
1 hmi demo里src目录下有common和pages页面,common目录下有navigator.c文件,里面的函数和mvvm的同名函数冲突。询问了作者,可以保留mvvm里的文件,不包含hmi demo下的src/common目录。也许有其他好的办法防止冲突?
2 demo_home例程运行后,我以为点击屏幕按钮,串口就应该有数据输出,后来才明白,hmi程序和mcu程序交互,是mcu先向hmi发一些信息,类似握手?然后点击hmi界面后,hmi才会像mcu发送数据,mcu收到后立即有数据返回。
3 modbus client例程在板子上运行后,板子崩溃,后发现modbus_client_view_model.c里的modbus_client_model_create()函数会创建个新的线程并启动,但是没有给该线程进行设置,没设置线程的name、堆栈大小、优先级,在这里添加对应函数调用即可。不过优先级这里设置后应该没用,还是会设成0,最后是在rtt创建线程时设置程固定值解决。
4 编译板子上的awtk-hmi可能会遇到问题,可以尝试先编译pc版的。我不想装vs环境,打算用gcc编译,需要修改awtk目录下的awtk_config_comom.py文件,将TOOL_NAMES = mingw前的井号去掉。有个prepare.bat脚本可以一键编译,不过觉得有时候编译通过了,但是最后运行还是有问题,可以挨个到awtk各仓库目录下执行scons WITH_JERRYSCRIPT=False重新编译下,这样更容易看到出错情况。
5 modbus client例程,用serial的话,需要在modbus_demo.json里指定站号,我原以为会是"slaver":xx,结果却是"unit_id":xx

#77 Re: 工业芯 匠芯创 » D211的CAN通讯如何避免死机 » 2024-09-10 08:46:20

使用d133也是遇到类似问题,最开始的版本,can总线上已经有其他设备在收发信息,d133上电,有几率卡死,好像是接收错误。后来sdk更新了,这个问题不再出现了,但是如果总线上其他设备上电晚,d133先上电,没有其他can接收设备,则d133 can发送卡死,还恢复不了...

#78 Re: 工业芯 匠芯创 » 请问D133的IO电压是3.4V么 » 2024-09-07 09:03:16

我就是按参考原理图来的,计算下来是3.38V。如果用dc/dc的话,应该也容易调成近似值吧。没尝试过用LDO,不知道会不会热。
另外两路电压,建议画板时都画上,哪怕不焊接。目前版本的sdk,配置菜单里只能设置打开LDO1X了。我记得以前的版本LDO18也可以打开。

#79 Re: 工业芯 匠芯创 » 请问D133CBS有公开的EDA原理图么 » 2024-09-07 08:45:54

去立创开源搜了下,没有d133的开源工程,d211的倒是有一个。

#80 Re: 工业芯 匠芯创 » 请问D133CBS有公开的EDA原理图么 » 2024-09-06 08:51:21

就照着画一遍吧,就当再熟悉遍硬件。别人画好的不一定适合自己的需求啊。

#81 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » rtt+lvgl,使用table控件,屏幕上滚动table控件时,lvgl界面卡死,但其他线程正常,table控件可刷新数据。 » 2024-08-29 14:36:12

lvgl线程优先级是20,touch线程优先级是25,改成19后,问题貌似消失,测试时间还不够长,有待验证,也不清楚修改优先级后会不会有其他影响。

#82 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » rtt+lvgl,使用table控件,屏幕上滚动table控件时,lvgl界面卡死,但其他线程正常,table控件可刷新数据。 » 2024-08-29 11:04:10

打开了lvgl的帧率及cpu占用率显示功能,内存占用没显示出来,可能和用了malloc有关。
以下提到的界面卡死,只是lvgl界面卡死,不能按及拖动,但是lvgl还能刷新帧率及cpu占用率,rtt的其他线程也正常。

复制了官方table例程:
https://lvgl.100ask.net/8.2/widgets/core/table.html#
例程是2列7行,运行后大部分情况下正常,有很小概率出现界面卡死。
改成4列7行,界面卡死概率更大了。
行列互换,改成7列,然后添加若干行,很容易出现界面卡死。

不拖动,只按压table的表格项,有时候会出现画面跳动以下,感觉像是触控数据出了问题。

void test_ui_init(void)
{
    static lv_style_t fontDefault;
    lv_style_init(&fontDefault);
    lv_style_set_text_font(&fontDefault, &lv_font_montserrat_30);

    lv_obj_t * table = lv_table_create(lv_scr_act());
    // lv_obj_add_style(table, &fontDefault, 0);
    lv_obj_set_size(table, 700, 400);

    lv_table_set_cell_value(table, 0, 0, "Name");
    lv_table_set_cell_value(table, 1, 0, "Apple");
    lv_table_set_cell_value(table, 2, 0, "Banana");
    lv_table_set_cell_value(table, 3, 0, "Lemon");
    lv_table_set_cell_value(table, 4, 0, "Grape");
    lv_table_set_cell_value(table, 5, 0, "Melon");
    lv_table_set_cell_value(table, 6, 0, "Peach");
    lv_table_set_cell_value(table, 7, 0, "Nuts");

    lv_table_set_cell_value(table, 0, 1, "Price");
    lv_table_set_cell_value(table, 1, 1, "$7");
    lv_table_set_cell_value(table, 2, 1, "$4");
    lv_table_set_cell_value(table, 3, 1, "$6");
    lv_table_set_cell_value(table, 4, 1, "$2");
    lv_table_set_cell_value(table, 5, 1, "$5");
    lv_table_set_cell_value(table, 6, 1, "$1");
    lv_table_set_cell_value(table, 7, 1, "$9");

    // lv_table_set_cell_value(table, 0, 2, "Name");
    // lv_table_set_cell_value(table, 1, 2, "Apple");
    // lv_table_set_cell_value(table, 2, 2, "Banana");
    // lv_table_set_cell_value(table, 3, 2, "Lemon");
    // lv_table_set_cell_value(table, 4, 2, "Grape");
    // lv_table_set_cell_value(table, 5, 2, "Melon");
    // lv_table_set_cell_value(table, 6, 2, "Peach");
    // lv_table_set_cell_value(table, 7, 2, "Nuts");
//
    // lv_table_set_cell_value(table, 0, 3, "Price");
    // lv_table_set_cell_value(table, 1, 3, "$7");
    // lv_table_set_cell_value(table, 2, 3, "$4");
    // lv_table_set_cell_value(table, 3, 3, "$6");
    // lv_table_set_cell_value(table, 4, 3, "$2");
    // lv_table_set_cell_value(table, 5, 3, "$5");
    // lv_table_set_cell_value(table, 6, 3, "$1");
    // lv_table_set_cell_value(table, 7, 3, "$9");

    // lv_obj_set_height(table, 200);
    lv_obj_center(table);

    lv_obj_add_event_cb(table, draw_part_event_cb, LV_EVENT_DRAW_PART_BEGIN, NULL);
}

打开了lvgl的日值功能,有时候会出现这种警告:

[Warn]  (60.346, +10)    indev_pointer_proc: X is 809 which is greater than hor. res    (in lv_indev.c line #362)
[Warn]  (60.356, +10)    indev_pointer_proc: X is 809 which is greater than hor. res    (in lv_indev.c line #362)
[Warn]  (60.366, +10)    indev_pointer_proc: X is 809 which is greater than hor. res    (in lv_indev.c line #362)
[Warn]  (60.376, +10)    indev_pointer_proc: X is 809 which is greater than hor. res    (in lv_indev.c line #362)
[Warn]  (60.406, +30)    indev_pointer_proc: X is 809 which is greater than hor. res    (in lv_indev.c line #362)
[Warn]  (60.416, +10)    indev_pointer_proc: X is 809 which is greater than hor. res    (in lv_indev.c line #362)
[Warn]  (60.426, +10)    indev_pointer_proc: X is 809 which is greater than hor. res    (in lv_indev.c line #362)

而且,手已经抬起没有再按压,结果还是不停的出现这个警告,再按下屏幕才消失。
不过出现界面卡死时不一定会有这个警告,有这个警告不一定会界面卡死。

#83 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » rtt+lvgl,使用table控件,屏幕上滚动table控件时,lvgl界面卡死,但其他线程正常,table控件可刷新数据。 » 2024-08-28 14:11:56

Gentlepig
回复: 2

table控件需要显示7列数据,行数不确定。
只显示一行数据时,界面正常,按钮可起作用,table列可左右拖动。
显示多行数据时,比如除标题行外,数据行3行及以上时,按按钮来回切换该页面和其他页面,都正常,数据刷新也正常。但是左右拖动或上下拖动table列或行时,有很大几率界面卡死,但是table里的数据还能正常刷新。
请教,这是哪里的问题?

static void lvgl_thread_entry(void *parameter)
{
    lv_init();
    lv_port_disp_init();
    lv_port_indev_init();
    lv_user_gui_init();

    /* handle the tasks of LVGL */
    while(1)
    {
#ifdef AIC_LVGL_TEST_DEMO
#include "candata.h"
        rt_err_t ret = rt_sem_take(&canRefreshSem, 1);
        if (ret == RT_EOK)
        {
            uint8_t rowNumber = 0;
            for (uint8_t id = 0; id < 10; id++)
            {
                if (canData[id].enable == 0)
                {
                    continue;
                }
                rowNumber++;
                lv_table_set_row_cnt(tblCan, rowNumber + 1);
                lv_table_set_cell_value_fmt(tblCan, rowNumber, 0, "%d", id);
                // lv_table_set_cell_value_fmt(tblCan, rowNumber, 1, "%d", canData[id].timeStamp);
                struct tm datetime;
                time_t timestamp = (time_t)canData[id].timeStamp;
                localtime_r(&timestamp, &datetime);
                lv_table_set_cell_value_fmt(tblCan, rowNumber, 1, "%d:%d:%d", datetime.tm_hour, datetime.tm_min, datetime.tm_sec);
                lv_table_set_cell_value_fmt(tblCan, rowNumber, 2, "%d", canData[id].mp2Adc);
                lv_table_set_cell_value_fmt(tblCan, rowNumber, 3, "%d", canData[id].mp5Adc);
                lv_table_set_cell_value_fmt(tblCan, rowNumber, 4, "%d", canData[id].temp1Value);
                lv_table_set_cell_value_fmt(tblCan, rowNumber, 5, "%d", canData[id].coValue);
                lv_table_set_cell_value_fmt(tblCan, rowNumber, 6, "%d", canData[id].smokeValue);
            }
        }
#endif
    }
}

#85 Cortex M0/M3/M4/M7 » daplink源码,为何boot程序里也有SCB->VTOR设置? » 2024-08-21 13:45:44

Gentlepig
回复: 0

这是在main_bootloader.c文件里:

264 int main(void)
  1 {
  2     // initialize vendor sdk
  3     sdk_init();
  4     // init leds and button
  5     gpio_init();
  6     // init settings
  7     config_init();
  8     // Hook for custom boards initialisation
  9     board_bootloader_init();
 10 
 11     // check for invalid app image or rst button press. Should be checksum or CRC but NVIC validation is better than nothing.
 12     // If the interface has set the hold in bootloader setting don't jump to app
 13     if (!reset_button_pressed()
 14             && g_board_info.target_cfg
 15             && validate_bin_nvic((uint8_t *)g_board_info.target_cfg->flash_regions[0].start)
 16             && !config_ram_get_initial_hold_in_bl()) {
 17         // change to the new vector table
 18         SCB->VTOR = g_board_info.target_cfg->flash_regions[0].start; //bootloaders should only have one flash region for interface
 19         // modify stack pointer and start app
 20         modify_stack_pointer_and_start_app((*(uint32_t *)(g_board_info.target_cfg->flash_regions[0].start)),
 21                 (*(uint32_t *)(g_board_info.target_cfg->flash_regions[0].start + 4)));               
 22     }   

这是在main_interface.c文件里:

551 int main(void)
  1 {
  2     // Explicitly set the vector table since the bootloader might not set
  3     // it to what we expect.
  4 #if DAPLINK_ROM_BL_SIZE > 0
  5     SCB->VTOR = SCB_VTOR_TBLOFF_Msk & DAPLINK_ROM_IF_START;
  6 #endif  
  7     // initialize vendor sdk
  8     sdk_init();
  9     
 10     // Initialize CMSIS-RTOS
 11     osKernelInitialize();

这是boot里设置的中断向量表的实际地址,文件在stm32f103xb_bl.c:

37  // stm32f103 target information
  1 target_cfg_t target_device = {
  2     .version                    = kTargetConfigVersion,
  3     .sectors_info               = sectors_info,
  4     .sector_info_length         = (sizeof(sectors_info))/(sizeof(sector_info_t)),
  5     .flash_regions[0].start     = 0x08000000 + KB(48),
  6     .flash_regions[0].end       = 0x08000000 + KB(128),
  7     .flash_regions[0].flags     = kRegionIsDefault,
  8     .ram_regions[0].start       = 0x20000000,
  9     .ram_regions[0].end         = 0x20005000,
 10     /* .flash_algo not needed for bootloader */
 11 };

我看到的iap应用,都是只在app程序里设置SCB->VTOR,为何daplink源码里的boot程序这里,在跳转iap之前,为何也设置了SCB->VTOR?

#86 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 【开源】自制一部RK3566智能手机!语音聊天、4G上网、打游戏、拍视频、玩吃鸡、体感游戏 » 2024-08-19 09:17:44

没看明白,这是个扩展板吧?这个扩展板如何和泰山派相连呢?

-----------------------------------------------------------------------------------------

好像有点明白了,是把泰山派的触摸接口,mipi-dsi接口,扩展接口,接到这个底板上,底板再加其他外设,组成手机。

#87 Re: ESP32/ESP8266 » esp32p4开箱 » 2024-08-13 09:24:02

cctv180 说:

我记得没有wifi蓝牙的吧,优势在那里呢

刷屏吧。

#88 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » 谈谈干前端四年的几点感受 » 2024-08-08 08:57:41

这是机器人,截取网上的一些帖子自动发帖。看这账号以往的发帖记录就知道了。

就这个帖子来说,在掘金搜到了同样的帖子:
https://juejin.cn/post/7258509816691834917

#89 Re: ESP32/ESP8266 » ESP32-P4终于可以购买了, 官网tb开发板499, 小贵, » 2024-08-08 08:47:51

打开后显示已下架,已售卖90,价格变为399了?
带7寸1200*600的电容屏,带摄像头,感觉也值了。

#90 Re: 工业芯 匠芯创 » 图片旋转测试 » 2024-08-01 14:39:33

我的是d133,用的rgb屏,看me菜单里有旋转属性,设置了结果没不能正常显示了。最后是靠lvgl里的旋转解决的。

#91 Re: 上海航芯 » 大神能搞一下仿PLC程序移植吗? » 2024-08-01 13:48:35

你这链接后边多了个逗号。去网盘下载下来后解压提示部分文件有密码。
既然是用的at32f415,那就用这个芯片吧。

#93 Cortex M0/M3/M4/M7 » 请教,如何学习daplink源码? » 2024-07-30 17:35:28

Gentlepig
回复: 2

daplink源码中,main文件在main_interface.c文件中,整个工程貌似只创建了main_task一个任务。
而main_task任务里,while循环里,主要是等待7个任务通知/消息。

 53 while (1) {
  1     flags = osThreadFlagsWait(FLAGS_MAIN_RESET // Put target in reset state
  2        | FLAGS_MAIN_90MS            // 90mS tick
  3        | FLAGS_MAIN_30MS            // 30mS tick
  4        | FLAGS_MAIN_POWERDOWN       // Power down interface
  5        | FLAGS_MAIN_DISABLEDEBUG    // Disable target debug
  6        | FLAGS_MAIN_PROC_USB        // process usb events
  7        | FLAGS_MAIN_CDC_EVENT       // cdc event
  8        , osFlagsWaitAny
  9        , osWaitForever);

reset好像是让目标板复位的;
90MS是处理usb是否连接的;
30ms是处理led灯闪烁的;
power_down好像是板子断电相关的;
disabledebug好像是设置目标退出debug状态;
proc_usb是被usb中断函数调用的;
cdc_event好像是usb转串口相关。

那么daplink的主要功能,烧录程序及硬件仿真,是在哪里完成的呢?

#94 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机IO如何控制24V正输出? » 2024-07-27 12:05:25

@xuqm
感谢,看了下,确实是高边控制。
之前搜了个友顺的,写的是达林顿管。下了东芝的手册,是Mos管。

#95 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机IO如何控制24V正输出? » 2024-07-26 16:29:58

642242855 说:

AO3401两毛钱

差了下AO3401是30V耐压,感觉裕量不是很够。而且,想实现的是控正,这个是nmos,更适合控负吧。

#96 Re: 工业芯 匠芯创 » 匠心创的芯片只有windows环境的下载工具吗? » 2024-07-26 08:52:15

我用的d133,是可以在ubuntu下完成编译、烧录的。
sdk下执行onestep脚本后,lunch、me、m,可选择项目、配置项目、编译项目,有个aicupg,可以通过usb烧录生成的镜像。不知道这个命令是否支持串口烧录。
板子启动后,进入rtt的msh后,也可以输入aicupg,使板子重启并进入boot模式。
ab命令也可以根据现有工程添加新的工程。

目前感觉不如win下Aiburn软件方便的地方是,Aiburn可以设置为按分区烧写,因为每次编译修改可能只改动了os分区,如果只烧录os分区,花的时间很短的。aicupg命令看介绍也支持按地址烧录的,不过可能得自己计算地址及大小了,没试过。

#97 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » rtt的flashdb库,如何将数据保存到文件系统里? » 2024-07-25 15:58:47

asd7893361 说:

这个板子好像开源的资料还不多,看看大佬能不能分享

官方提供了几个开发板的原理图和pcb,sdk里,本地软件包里有差不多常用到的已经移植好了的库,而且还在更新。
flashdb没在本地仓库里,不过按例程配置下可以运行。

#98 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机IO如何控制24V正输出? » 2024-07-25 08:32:26

xuqm 说:

如果有多个通道,有的大电流,有的小电流,可以看看TBD62783(8通道,价格2.5),一个通道500mA,大电流就2-3个通道并联,小电流就单通道

感谢,搜了下手册,500mA的达林顿管阵列,这和ULN2803类似啊。

#99 Re: 工业芯 匠芯创 » 请教,单片机一般如何保存定时采集的数据,要求长期保存,方便查寻历史记录。 » 2024-07-24 14:47:37

@海石生风
你的d21x也是运行的rtt还是linux?
按说d13x和d21x主频相比差不算太大。d13x 480M, d21x 504/600M.
剩下的,内存大小差异?8M不够用?新做了一版,打算试试16M的。

我插入9000条数据就卡死,但是连续插入8k条数据可以成功。最后放弃了sqlite这一方案。
后来尝试了flashdb。

想问下,nand flash,是不是就不用考虑擦写均衡了?
我看flashdb的几个例程,都是spi nor flash和onchip flash的。

#100 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机IO如何控制24V正输出? » 2024-07-24 09:11:32

bunny 说:

L298N不香吗?

太大了,15脚!也贵。
目前需要能最大输出2A甚至1A即可。

#103 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机IO如何控制24V正输出? » 2024-07-23 08:38:09

海石生风 说:

是的,开关搞慢点,主要是减少电流冲击并提高EMI特性吧

再请教下,对比用三极管和mos管来控制24V输出,相对来说,是不是mos管这种方案扛干扰能力相对差些?毕竟三极管需要持续的电流才能导通,而mos管只要维持一定的电压就能导通。

#104 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机IO如何控制24V正输出? » 2024-07-22 13:42:03

海石生风 说:

PMOS开关电路,很常见呀。不过要注意VGS数值不要超过12V
https://whycan.com/files/members/1798/屏幕截图_20240722_122744.png

感谢。

我刚才理解错了,Vgs和Vgs(th)不是一回事来着...

再请教,这个C3在这里起什么作用呢?让Q4开启和关断更慢一点?

#105 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机IO如何控制24V正输出? » 2024-07-22 10:43:53

lignin 说:

io口控制pmos的G级,导通电压选择在单片机电压范围内的就行

PMOS要控制24V+输出,单片机IO没法直接控G吧,这样VGS怎么也有20V左右压差,肯定导通的。

#106 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机IO如何控制24V正输出? » 2024-07-22 10:41:57

marcus 说:

直接上继电器或者固态继电器

继电器要么贵要么体积大,开关寿命也不出三极管和mos管。

#107 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机IO如何控制24V正输出? » 2024-07-22 09:24:34

Gentlepig
回复: 35

之前一直是单片机IO控制光藕,光藕控制三极管基极电流,三极管下拉控制输出。
但有的客户,愿意用万用表电压档测量输出口,习惯的认为没有测到电压电路就认为电路有问题。

那么,如何控制直接输出24V呢?用PMOS控制24V+?那么得用24V电压来控制这个PMOS吧?
求推荐个成熟电路。

#108 Re: 工业芯 匠芯创 » 摄像头硬件电路咨询 » 2024-07-18 10:33:33

D213好像只支持DVP吧。

乐鑫的eps32p4有mipi输入。

#110 Re: 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 是时候告别CSDN了! » 2024-07-16 10:35:21

我也不喜欢csdn,但是搜东西很容易就搜到csdn链接了。
比较喜欢的是cnblog,但是昨天发现cnblog资金短缺,都发帖号召人们冲会员支持下网站渡过难关了。搜了下,才知道cnblog去年就遇到资金问题。不禁感叹,办个网站也真不容易啊。

#111 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » betaflight源码中,adc转电压值这个函数没看懂。 » 2024-07-12 10:20:20

经飞控群里二木仙人指点,去看了inav的代码:

455 uint16_t getVBatSample(void) {
  1     // calculate battery voltage based on ADC reading
  2     // result is Vbatt in 0.01V steps. 3.3V = ADC Vref, 0xFFF = 12bit adc, 1100 = 11:1 voltage divider (10k:1k)
  3     return (uint64_t)adcGetChannel(ADC_BATTERY) * batteryMetersConfig()->voltage.scale * ADCVREF / (0xFFF * 1000);
  4 }

这个就很容易理解了。

#112 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » betaflight源码中,adc转电压值这个函数没看懂。 » 2024-07-12 08:47:28

Gentlepig
回复: 1

src/main/sensors/voltage.c中的函数:

159 STATIC_UNIT_TESTED uint16_t voltageAdcToVoltage(const uint16_t src, const voltageSensorADCConfig_t *config)
  1 {
  2     // calculate battery voltage based on ADC reading                                                
  3     // result is Vbatt in 0.01V steps. 3.3V = ADC Vref, 0xFFF = 12bit adc, 110 = 10:1 voltage divider (10k:1k) * 100 for 0.01V
  4     return ((((uint32_t)src * config->vbatscale * getVrefMv() / 10 + (0xFFF * 5)) / (0xFFF * config->vbatresdivval)) / config->vbatresdivmultiplier);
  5 }   

getVreMv()函数,默认返回是3300,对应3300mV;
config->vbatscale,默认值是110;
config->vbatresdivval,默认值是10;
config->vbatresdivmultiplier,默认值是1.

找到个at32f435的原理图,可能不一定完全对应的上,原理图里只用了一个adc,用的10K:1K测量的电池电压。
按我的逻辑,(adc值/0xfff)*3300,得到测量的adc电压值,然后放大11倍,就是电池电压了。可看这个公式,对应不上。

-----------------------------------------------------------

如果把原式中的+(0xfff*5)去掉,精简下:
((((uint32_t)src * config->vbatscale * getVrefMv() / 10) / (0xFFF * config->vbatresdivval)) / config->vbatresdivmultiplier);
= src * 110 * 3300 / 10 / (0xFFF * 10) / 1
= src * 110 * 3300 / 0xFFF
这样看,就和我的逻辑计算公式差不多了,只是查了10倍, 那么原式中的+0xFFF*5,有什么作用呢?

-----------------------------------------------------------

单独把0xFFF*5部分拿出来再除以后续部分:
0xFFF*5 / (0xFFF * 10) / 1 = 0.5

这么看,这部分是为了四舍五入?

感觉这个转换函数写的好繁琐。

----------------------------------------------

算错,src * 110 * 3300 / 10 / (0xFFF * 10) / 1, 应该是:
= src * 110 * 3300 / 0xFFF * 10 * 10
= src * 11 * 3300 / 0xFFF * 10
可以看作将adc值转换为电压值后,按分压电阻放大11备得到mV单位的电池电压,再除以10得到0.01V单位的电池电压。

算是明白了,就是觉得这个公式好繁琐。

#113 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » rtt,同时打开SAL组件和本地的lwip组件,就报ip4_addr重复定义。 » 2024-07-10 09:01:11

最后发现遇到的问题是485芯片和单片机之间的电阻坏了,所以单片机没收到数据。
以为libmodbus必须打开SAL组件,现在发现其实如果只用rtu模式的话,不需要SAL组件,不过会默认打开POSIX组件。

#114 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 如何解除spi nor flash状态寄存器里的写保护位? » 2024-07-09 10:40:11

dlk /> sf probe qspi01
qspi0 freq (input): 99000000Hz
qspi0 freq ( bus ): 49500000Hz
01-01 10:14:57 I/NO_TAG: Flash ID: 0xef4018
01-01 10:14:57 I/NO_TAG: Find a Winbond flash chip. Size is 167772.
qspi0 freq (input): 99000000Hz
qspi0 freq ( bus ): 99000000Hz
01-01 10:14:57 I/NO_TAG: sf_cmd flash device is initialize success.
01-01 10:14:57 I/NO_TAG: Probe SPI flash sf_cmd by SPI device qspi.
16 MB sf_cmd is current selected device.
dlk /> sf status
The sf_cmd flash status register current value is 0x00.

早上给群里的朋友试我的固件,修改了配置,打开了芯片的内置1.8V LDO功能。当时现象依旧。
发现gitee上sdk更新了,就拉取了下来,编译并下载,现象依旧。
然后关闭了芯片的1.8V LDO功能,结果,能成功下载了,虽然我认为和LDO打开/关闭关系不大...

#115 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 如何解除spi nor flash状态寄存器里的写保护位? » 2024-07-08 17:21:43

看sdk手册里,看到这么一句:
    SPI_CS、SPI_WP、SPI_HOLD必需保留上拉电阻。
    QSPI 信号必需做等长约束,约束不大于20mil,否则跑4线模式容易出现速度跑不高的情况。
实际没有做等长约束,

4根信号线中,最长的710mil,两根650mil左右,一根600mi两座有。
sclk信号线500mil左右。

感觉这里的问题可能性也不大,毕竟目前上店后,片外flash里的程序还能加载到ram里运行,说明读是能成功的。只是不能写。

#116 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 如何解除spi nor flash状态寄存器里的写保护位? » 2024-07-08 13:49:09

Gentlepig
回复: 2

用的芯片是匠芯创的d133,该芯片程序只能存储在片外存储设备上,现用的是w25q128.
正常下载程序使用了一段时间后,发现烧录程序时,下载软件提示下载完成,但是实际没下载成功,程序还是运行的上次成功烧录的那个程序。
更换w25q128后,又可正常烧录。但是,使用一段时间后,仍有概率出现相同问题。

后来知道了spi nor flash有个状态寄存器,就用sfdu命令来查看状态寄存器的值:

sf status
The sf_cmd flash status register current value is 0xFC. 

发现该值为0xFC,而另一块正常的板子,值为0。
查手册,得知为1的各位,其实是写保护位。
通过sf status 0 0,将该寄存器值恢复为0,可以正常烧写了。

过了大概有两三个月吧,问题又出现了,这次读取状态寄存器值,仍为0xFC, 我尝试用sf status 0 0清除该寄存器,结果程序就卡死了...

请教,还有什么办法,可以解除spi nor flash的写保护位吗?

#117 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » rtt,同时打开SAL组件和本地的lwip组件,就报ip4_addr重复定义。 » 2024-07-06 17:45:30

updandtcp.c文件里的

9   // #include <lwip/netif.h>
  1 // #include <lwip/ip_addr.h> 

注释掉,然后该文件很多地方报错,干脆把该文件里的大部分函数里的内容注释掉,结果不报错了。

现在是打开SAL组件,打开了libmodbus库并使能了modbusrtu例程序。
结果运行后,还是显示发送后接收超时,现象和之前一样。
之前用示波器测试过串口的收发及使能管脚,都有波形。
当时是看libmodbus里用了select,所以可能是SAL组件没打开的原因...

#118 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » rtt,同时打开SAL组件和本地的lwip组件,就报ip4_addr重复定义。 » 2024-07-06 16:33:44

Gentlepig
回复: 2

用的d133 sdk,自带rtt,还有一些移植好了的本地软件包。
单用本地软件包里的lwip里的例程,能正常运行。
现在像运行libmodbus库,发现需要打开SAL组件,打开SAL组件,又会关联NETDEV组件,打开后发现好几个重复定义,比如ip4_addr。

搜了下,有如下多个定义:

grep -rnw "typedef struct ip4_addr"
packages/third-party/lwip/src/include/lwip/ip4_addr.h:57:typedef struct ip4_addr ip4_addr_t;
kernel/rt-thread/components/net/netdev/include/netdev_ipaddr.h:98:typedef struct ip4_addr
kernel/rt-thread/components/net/lwip/lwip-2.1.2/src/include/lwip/ip4_addr.h:57:typedef struct ip4_addr ip4_addr_t;
kernel/rt-thread/components/net/lwip/lwip-2.0.3/src/include/lwip/ip4_addr.h:57:typedef struct ip4_addr ip4_addr_t;

后两个应该没使能,应该没包含进去。
第一个是本地软件包里的lwip,第二个是rtt里的netdev组件。
俩文件还不一样,要是一样的话我就删除一个就行了...

我觉得应该是两个.h文件不能在同一个.c文件中被包含,但是,不知道如何去查找引起冲突的文件...

-------------------------------------

查看报错信息,找第一个报错时的.c文件:

In file included from kernel/rt-thread/components/net/netdev/include/arpa/inet.h:14,
                 from kernel/rt-thread/components/net/sal/include/sal_socket.h:15,
                 from kernel/rt-thread/components/net/sal/include/socket/sys_socket/sys/socket.h:16,
                 from application/rt-thread/can2eth/udpandtcp.c:5:
kernel/rt-thread/components/net/netdev/include/netdev_ipaddr.h:84: note: this is the location of the previous definition
   84 | #define ntohl(x) (uint32_t)PP_NTOHL(x)
      | 
In file included from packages/third-party/lwip/src/include/lwip/ip_addr.h:43,
                 from packages/third-party/lwip/src/include/lwip/netif.h:46,
                 from application/rt-thread/can2eth/udpandtcp.c:9:
packages/third-party/lwip/src/include/lwip/ip4_addr.h:51:8: error: redefinition of 'struct ip4_addr'
   51 | struct ip4_addr {
      |        ^~~~~~~~
In file included from kernel/rt-thread/components/net/netdev/include/arpa/inet.h:14,
                 from kernel/rt-thread/components/net/sal/include/sal_socket.h:15,
                 from kernel/rt-thread/components/net/sal/include/socket/sys_socket/sys/socket.h:16,
                 from application/rt-thread/can2eth/udpandtcp.c:5:

感觉是自己写的这个udpandtcp.c文件的问题?

#119 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » rtt的flashdb库,如何将数据保存到文件系统里? » 2024-07-06 11:42:05

tsdb方式存储的数据,每一条目里,存储的是数据偏移位值及数据长度,实际数据是从该扇区底部开始往上存储的。

hexdump log.fdb.0
0000000 ff3f ffff 5354 304c 0001 0000 ffff ffff
0000010 ffff ffff ffff ffff ffff ffff ffff ffff
0000020 ffff ffff ffff ffff ff1f ffff 0001 0000
0000030 0008 0000 0ff8 0000 ff1f ffff 0002 0000
0000040 0008 0000 0ff0 0000 ff1f ffff 0003 0000
0000050 0008 0000 0fe8 0000 ff1f ffff 0004 0000
0000060 0008 0000 0fe0 0000 ff1f ffff 0005 0000
0000070 0008 0000 0fd8 0000 ff1f ffff 0006 0000
0000080 0008 0000 0fd0 0000 ff1f ffff 0007 0000
0000090 0008 0000 0fc8 0000 ff1f ffff 0008 0000
00000a0 0008 0000 0fc0 0000 ff1f ffff 0009 0000
00000b0 0008 0000 0fb8 0000 ff1f ffff 000a 0000
00000c0 0008 0000 0fb0 0000 ff1f ffff 000b 0000
00000d0 0008 0000 0fa8 0000 ff1f ffff 000c 0000
00000e0 0008 0000 0fa0 0000 ffff ffff ffff ffff
00000f0 ffff ffff ffff ffff ffff ffff ffff ffff
*
0000fa0 0026 0000 005a 0000 0024 0000 0055 0000
*
0001000

#120 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » rtt的flashdb库,如何将数据保存到文件系统里? » 2024-07-06 09:09:43

FashDB目录下有fdb_cfg.h文件,里边有FDB_USING_FAL_MODE  FDB_WRITE_GRAN    FDB_USING_FILE_LIBC_MODE  FDB_USING_FILE_POSIX_MODE等宏定义。而我用的luban-lite sdk里,menuconfig里也有对应选项,且生成到了rtconfig.h里。结果有些宏定义重复了,而以上MODE宏定义,只能三选一,由于有了两个地方都有定义,造成了同时使能了其中多个。
目前都改成使用FDB_USING_FILE_POSIX_MODE,貌似是成功了。

dlk /> test_flashdb
dlk /> [FlashDB][kv][env][/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:1784) The oldest addr is @0x00000000
[FlashDB][kv][env][/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:1800) KVDB size is 16384 bytes.
[FlashDB] FlashDB V2.1.0 is initialize success.
[FlashDB] You can get the latest version on https://github.com/armink/FlashDB .
[FlashDB][sample][kvdb][basic] ==================== kvdb_basic_sample ====================
[FlashDB][sample][kvdb][basic] get the 'boot_count' value is 1
[FlashDB][sample][kvdb][basic] set the 'boot_count' value to 2
[FlashDB][sample][kvdb][basic] ===========================================================
[FlashDB][sample][kvdb][string] ==================== kvdb_type_string_sample ====================
[FlashDB][sample][kvdb][string] create the 'temp' string KV, value is: 36C
[FlashDB][sample][kvdb][string] get the 'temp' value is: 36C
[FlashDB][sample][kvdb][string] set 'temp' value to 38C
[FlashDB][sample][kvdb][string] delete the 'temp' finish
[FlashDB][sample][kvdb][string] ===========================================================
[FlashDB][sample][kvdb][blob] ==================== kvdb_type_blob_sample ====================
[FlashDB][sample][kvdb][blob] create the 'temp' blob KV, value is: 36
[FlashDB][sample][kvdb][blob] get the 'temp' value is: 36
[FlashDB][sample][kvdb][blob] set 'temp' value to 38
[FlashDB][sample][kvdb][blob] delete the 'temp' finish
[FlashDB][sample][kvdb][blob] ===========================================================
[FlashDB][tsl][log][/data] (packages/third-party/FlashDB/src/fdb_tsdb.c:978) TSDB (log) oldest sectors is 0x00000000, current using sector                                                                                                                                     .
[FlashDB][sample][tsdb] ==================== tsdb_sample ====================
[FlashDB][sample][tsdb] append the new status.temp (36) and status.humi (85)
[FlashDB][sample][tsdb] append the new status.temp (38) and status.humi (90)
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 3, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 4, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 3, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 4, temp: 38, humi: 90
[FlashDB][sample][tsdb] query count is: 2
[FlashDB][sample][tsdb] set the TSL (time 1) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 2) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 3) status from 2 to 3
[FlashDB][sample][tsdb] set the TSL (time 4) status from 2 to 3
[FlashDB][sample][tsdb] ===========================================================
hexdump env.fdb.0
0000000 3f3f ffff 4446 3042 ffff ffff ffff ffff
0000010 ff3f ffff 564b 3030 0026 0000 c32c b664
0000020 ff08 ffff 0006 0000 7375 7265 616e 656d
0000030 7261 696d 6b6e ff3f ffff 564b 3030 0026
0000040 0000 4c95 83fc ff08 ffff 0006 0000 6170
0000050 7373 6f77 6472 3231 3433 3635 ff0f ffff
0000060 564b 3030 0026 0000 f64e efde ff0a ffff
0000070 0004 0000 6f62 746f 635f 756f 746e 0000
0000080 0000 ff3f ffff 564b 3030 0071 0000 1dce
0000090 135c ff09 ffff 0050 0000 6f62 746f 745f
00000a0 6d69 0065 0000 0000 0000 0100 0000 0000
00000b0 0000 0200 0000 0000 0000 0300 0000 0000
00000c0 0000 0000 0000 0000 0000 0000 0000 0000
*
00000f0 0000 3f00 ffff 4bff 3056 2730 0000 a700
0000100 d62e 0b29 ffff 04ff 0000 5f00 765f 7265
0000110 6e5f 6d75 5f5f 0000 0000 ff3f ffff 564b
0000120 3030 0026 0000 912b 5762 ff0a ffff 0004
0000130 0000 6f62 746f 635f 756f 746e 0001 0000
0000140 ff0f ffff 564b 3030 001f 0000 b630 fa55
0000150 ff04 ffff 0003 0000 6574 706d 3633 0f43
0000160 ffff 4bff 3056 1f30 0000 be00 d69b 0464
0000170 ffff 03ff 0000 7400 6d65 3370 4338 ff0f
0000180 ffff 564b 3030 0020 0000 89da b6c5 ff04
0000190 ffff 0004 0000 6574 706d 0024 0000 ff0f
00001a0 ffff 564b 3030 0020 0000 4151 1ccc ff04
00001b0 ffff 0004 0000 6574 706d 0026 0000 ffff
00001c0 ffff ffff ffff ffff ffff ffff ffff ffff
*
0001000

使用FDB_USING_FILE_POSIX_MODE模式时,我以为文件路径会是/dev/data呢,结果/data就行。

而使用FDB_USING_FILE_LIBC_MODE模式时,就是上边楼层最后追踪到的fwrite()函数,写入size是12,返回却是1。原因未知。

在两个地方都配置为FDB_USING_FAL_MODE模式,FDB_WRITE_GRAN配置为1或32,都是卡到这里:

dlk /> test_flashdb
dlk /> [FlashDB][kv][(null)

#121 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » rtt的flashdb库,如何将数据保存到文件系统里? » 2024-07-05 14:13:52

追踪最后的这个报错:

[FlashDB][tsl][log][/data] Error: write tsl failed (2)

是在fdb_tsdc.c

    /* write the TSL node */
   1     result = write_tsl(db, blob, cur_time);
   2     if (result != FDB_NO_ERR) {
   3         FDB_INFO("Error: write tsl failed (%d)", result);
   4         return result;
   5     }

检测write_tsl()这个函数的返回,如果不是0,则报错。

static fdb_err_t write_tsl(fdb_tsdb_t db, fdb_blob_t blob, fdb_time_t time)
   1 {
   2     fdb_err_t result = FDB_NO_ERR;
   3     struct log_idx_data idx;
   4     uint32_t idx_addr = db->cur_sec.empty_idx;
   5 
   6     idx.log_len = blob->size;
   7     idx.time = time;
   8     idx.log_addr = db->cur_sec.empty_data - FDB_WG_ALIGN(idx.log_len);
   9     /* write the status will by write granularity */
  10     _FDB_WRITE_STATUS(db, idx_addr, idx.status_table, FDB_TSL_STATUS_NUM, FDB_TSL_PRE_WRITE, false);
  11     /* write other index info */
  12     FLASH_WRITE(db, idx_addr + LOG_IDX_TS_OFFSET, &idx.time,  sizeof(struct log_idx_data) - LOG_IDX_TS_OFFSET, false);
  13     /* write blob data */
  14     FLASH_WRITE(db, idx.log_addr, blob->buf, blob->size, false);
  15     /* write the status will by write granularity */
  16     _FDB_WRITE_STATUS(db, idx_addr, idx.status_table, FDB_TSL_STATUS_NUM, FDB_TSL_WRITE, true);
  17 
  18     return result;
  19 }

可write_tsl()这个函数,里面声明了result,赋值为0,然后就是最后的return result了,其他地方没用到result。
奇怪这个result是什么时候被赋值为2的。

-------------------------------

懂了,在该函数里调用的几个宏里,有return result返回,如:

68   #define _FDB_WRITE_STATUS(db, addr, status_table, status_num, status_index, sync)    \
   1     do {                                                                       \
   2         result = _fdb_write_status((fdb_db_t)db, addr, status_table, status_num, status_index, sync);\
   3         if (result != FDB_NO_ERR) return result;                               \
   4     } while(0);
   5 
   6 #define FLASH_WRITE(db, addr, buf, size, sync)                                 \
   7     do {                                                                       \
   8         result = _fdb_flash_write((fdb_db_t)db, addr, buf, size, sync);        \
   9         if (result != FDB_NO_ERR) return result;                               \
  10     } while(0);

---------------------------------------------

修改FDB_WRITE_GRAN这个值,由32改为1,结果报错crc错误。
我用的spi nor flash,四线qspi,应该选1吧?

26  /* Using FAL storage mode */
  1 // #define FDB_USING_FAL_MODE
  2 
  3 #ifdef FDB_USING_FAL_MODE
  4 /* the flash write granularity, unit: bit
  5  * only support 1(nor flash)/ 8(stm32f2/f4)/ 32(stm32f1)/ 64(stm32f7)/ 128(stm32h5) */
  6 #define FDB_WRITE_GRAN                1        /* @note you must define it for a value */
  7 #endif
dlk /> test_flashdb
dlk /> [FlashDB][kv][env][/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:1784) The oldest addr is @0x00000000
[FlashDB][kv][env][/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:1800) KVDB size is 16384 bytes.
[FlashDB][kv][env][/data] Sector header info is incorrect. Auto format this sector (0x00000000).
[FlashDB][kv][env][/data] Sector header info is incorrect. Auto format this sector (0x00001000).
[FlashDB][kv][env][/data] Sector header info is incorrect. Auto format this sector (0x00002000).
[FlashDB][kv][env][/data] Sector header info is incorrect. Auto format this sector (0x00003000).
[FlashDB][kv][env][/data] All sector header is incorrect. Set it to default.
[FlashDB] FlashDB V2.1.0 is initialize success.
[FlashDB] You can get the latest version on https://github.com/armink/FlashDB .
[FlashDB][sample][kvdb][basic] ==================== kvdb_basic_sample ====================
[FlashDB][sample][kvdb][basic] get the 'boot_count' failed
[FlashDB][sample][kvdb][basic] set the 'boot_count' value to 1
[FlashDB][sample][kvdb][basic] ===========================================================
[FlashDB][sample][kvdb][string] ==================== kvdb_type_string_sample ====================
[FlashDB][kv][env][/data] Error: Read the KV (@0x00000010) CRC32 check failed!
[FlashDB][sample][kvdb][string] create the 'temp' string KV, value is: 36C
[FlashDB][kv][env][/data] Error: Read the KV (@0x00000010) CRC32 check failed!
[FlashDB][kv][env][/data] Error: Read the KV (@0x00000010) CRC32 check failed!
[FlashDB][sample][kvdb][string] set 'temp' value to 38C
[FlashDB][kv][env][/data] Error: Read the KV (@0x00000010) CRC32 check failed!
[FlashDB][kv][env][/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:954) Not found 'temp' in KV.
[FlashDB][sample][kvdb][string] delete the 'temp' finish
[FlashDB][sample][kvdb][string] ===========================================================
[FlashDB][sample][kvdb][blob] ==================== kvdb_type_blob_sample ====================
[FlashDB][kv][env][/data] Error: Read the KV (@0x00000010) CRC32 check failed!
[FlashDB][sample][kvdb][blob] create the 'temp' blob KV, value is: 36
[FlashDB][kv][env][/data] Error: Read the KV (@0x00000010) CRC32 check failed!
[FlashDB][kv][env][/data] Error: Read the KV (@0x00000010) CRC32 check failed!
[FlashDB][sample][kvdb][blob] set 'temp' value to 38
[FlashDB][kv][env][/data] Error: Read the KV (@0x00000010) CRC32 check failed!
[FlashDB][kv][env][/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:954) Not found 'temp' in KV.
[FlashDB][sample][kvdb][blob] delete the 'temp' finish
[FlashDB][sample][kvdb][blob] ===========================================================
[FlashDB][tsl][log][/data] Sector (0x00000000) header info is incorrect.
[FlashDB][tsl][log][/data] All sector format finished.
[FlashDB][tsl][log][/data] (packages/third-party/FlashDB/src/fdb_tsdb.c:978) TSDB (log) oldest sectors is 0x00000000, current using sector                                                                                                                                     .
[FlashDB][sample][tsdb] ==================== tsdb_sample ====================
[FlashDB][tsl][log][/data] Error: update the sector status failed (2)[FlashDB][sample][tsdb] append the new status.temp (36) and status.hum                                                                                                                                    )
[FlashDB][tsl][log][/data] Error: write tsl failed (2)[FlashDB][sample][tsdb] append the new status.temp (38) and status.humi (90)
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 0, temp: 40, humi: 805688500
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 0, temp: 40, humi: 805688604
[FlashDB][sample][tsdb] query count is: 0
[FlashDB][sample][tsdb] set the TSL (time 0) status from 1 to 3
[FlashDB][sample][tsdb] ===========================================================

--------------------------------

定位到这里,fwrite写入的size是12,可函数返回值却是1.

if ((fseek(fp, addr, SEEK_SET) != 0) || (fwrite(buf, size, 1, fp) != size))

#122 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » rtt的flashdb库,如何将数据保存到文件系统里? » 2024-07-05 09:27:43

dlk /> test_flashdb
dlk /> [FlashDB][sample][kvdb][basic] ==================== kvdb_basic_sample ====================
[FlashDB][kv][(null)][(null)] Error: KV ((null)) isn't initialize OK.
[FlashDB][sample][kvdb][basic] get the 'boot_count' value is 0
[FlashDB][kv][(null)][(null)] Error: KV ((null)) isn't initialize OK.
[FlashDB][sample][kvdb][basic] set the 'boot_count' value to 1
[FlashDB][sample][kvdb][basic] ===========================================================
[FlashDB][sample][kvdb][string] ==================== kvdb_type_string_sample ====================
[FlashDB][kv][(null)][(null)] Error: KV ((null)) isn't initialize OK.
[FlashDB][sample][kvdb][string] create the 'temp' string KV, value is: 36C
[FlashDB][kv][(null)][(null)] Error: KV ((null)) isn't initialize OK.
[FlashDB][kv][(null)][(null)] Error: KV ((null)) isn't initialize OK.
[FlashDB][sample][kvdb][string] set 'temp' value to 38C
[FlashDB][kv][(null)][(null)] Error: KV ((null)) isn't initialize OK.
[FlashDB][sample][kvdb][string] delete the 'temp' finish
[FlashDB][sample][kvdb][string] ===========================================================
[FlashDB][sample][kvdb][blob] ==================== kvdb_type_blob_sample ====================
[FlashDB][kv][(null)][(null)] Error: KV ((null)) isn't initialize OK.
[FlashDB][sample][kvdb][blob] create the 'temp' blob KV, value is: 36
[FlashDB][kv][(null)][(null)] Error: KV ((null)) isn't initialize OK.
[FlashDB][sample][kvdb][blob] get the 'temp' value is: 0
[FlashDB][kv][(null)][(null)] Error: KV ((null)) isn't initialize OK.
[FlashDB][sample][kvdb][blob] set 'temp' value to 38
[FlashDB][kv][(null)][(null)] Error: KV ((null)) isn't initialize OK.
[FlashDB][sample][kvdb][blob] delete the 'temp' finish
[FlashDB][sample][kvdb][blob] ===========================================================
[FlashDB] Error: Partition (fdb_tsdb1) not found.
[FlashDB] Error: TSDB (log

今早发现FlashDB目录下不知道什么时候多了个文件,打开看貌似是些记录啥的。忘了名了,已经删了,再次编译也没再出现。
不过执行test_flashdb,出现以上信息。

--------------------------------------------

发现昨天保存时,不知道什么时候删除了个/,导致fdb_kvdb_init()这条语句被注释了。恢复后,还是昨天下午的那个报错。

lk /> test_flashdb
dlk /> [FlashDB] (db->sec_size != 0) has assert failed at _fdb_init_ex.

----------------------------------------------
照抄linux的demo,又增加了两个语句:

bool file_mode = true;
uint32_t sec_size = 4096, db_size = sec_size * 4;

/* set the sector and database max size */
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_SEC_SIZE, &sec_size);
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_MAX_SIZE, &db_size);
/* enable file mode */      
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_FILE_MODE, &file_mode);

编译后可以运行,但是/data目录下没有看到新增文件。

dlk /> test_flashdb
dlk /> [FlashDB][kv][env][/dev/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:1784) The oldest addr is @0x00000000
[FlashDB][kv][env][/dev/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:1800) KVDB size is 16384 bytes.
[FlashDB][kv][env][/dev/data] Sector header info is incorrect. Auto format this sector (0x00000000).
[FlashDB][file] Error: open (/dev/data/env.fdb.0) file failed.
[FlashDB][kv][env][/dev/data] Sector header info is incorrect. Auto format this sector (0x00001000).
[FlashDB][file] Error: open (/dev/data/env.fdb.1) file failed.
[FlashDB][kv][env][/dev/data] Sector header info is incorrect. Auto format this sector (0x00002000).
[FlashDB][file] Error: open (/dev/data/env.fdb.2) file failed.
[FlashDB][kv][env][/dev/data] Sector header info is incorrect. Auto format this sector (0x00003000).
[FlashDB][file] Error: open (/dev/data/env.fdb.3) file failed.
[FlashDB][kv][env][/dev/data] All sector header is incorrect. Set it to default.
[FlashDB][file] Error: open (/dev/data/env.fdb.0) file failed.
[FlashDB] FlashDB V2.1.0 is initialize success.
[FlashDB] You can get the latest version on https://github.com/armink/FlashDB .
[FlashDB][sample][kvdb][basic] ==================== kvdb_basic_sample ====================
[FlashDB][sample][kvdb][basic] get the 'boot_count' failed
[FlashDB][sample][kvdb][basic] set the 'boot_count' value to 1
[FlashDB][sample][kvdb][basic] ===========================================================
[FlashDB][sample][kvdb][string] ==================== kvdb_type_string_sample ====================
[FlashDB][sample][kvdb][string] create the 'temp' string KV, value is: 36C
[FlashDB][sample][kvdb][string] set 'temp' value to 38C
[FlashDB][kv][env][/dev/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:954) Not found 'temp' in KV.
[FlashDB][sample][kvdb][string] delete the 'temp' finish
[FlashDB][sample][kvdb][string] ===========================================================
[FlashDB][sample][kvdb][blob] ==================== kvdb_type_blob_sample ====================
[FlashDB][sample][kvdb][blob] create the 'temp' blob KV, value is: 36
[FlashDB][sample][kvdb][blob] set 'temp' value to 38
[FlashDB][kv][env][/dev/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:954) Not found 'temp' in KV.
[FlashDB][sample][kvdb][blob] delete the 'temp' finish
[FlashDB][sample][kvdb][blob] ===========================================================
[FlashDB][tsl][log][/dev/data] Sector (0x00000000) header info is incorrect.
[FlashDB][file] Error: open (/dev/data/log.fdb.0) file failed.
[FlashDB][file] Error: open (/dev/data/log.fdb.1) file failed.
[FlashDB][file] Error: open (/dev/data/log.fdb.2) file failed.
[FlashDB][file] Error: open (/dev/data/log.fdb.3) file failed.
[FlashDB][tsl][log][/dev/data] All sector format finished.
[FlashDB][tsl][log][/dev/data] (packages/third-party/FlashDB/src/fdb_tsdb.c:978) TSDB (log) oldest sectors is 0x00000000, current using sec                                                                                                                                    .
[FlashDB][sample][tsdb] ==================== tsdb_sample ====================
[FlashDB][tsl][log][/dev/data] Error: write tsl failed (3)[FlashDB][sample][tsdb] append the new status.temp (36) and status.humi (85)
[FlashDB][tsl][log][/dev/data] Error: write tsl failed (3)[FlashDB][sample][tsdb] append the new status.temp (38) and status.humi (90)
[FlashDB][sample][tsdb] query count is: 0
[FlashDB][sample][tsdb] ===========================================================

---------------------------------------------

原来用的posix模式打开文件,修改为libc模式,貌似成功了。

35  /* Using file storage mode by LIBC file API, like fopen/fread/fwrte/fclose */
  1 #define FDB_USING_FILE_LIBC_MODE
  2                                                                                                      
  3 /* Using file storage mode by POSIX file API, like open/read/write/close */                          
  4 // #define FDB_USING_FILE_POSIX_MODE
dlk /> test_flashdb
dlk /> [FlashDB][kv][env][/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:1784) The oldest addr is @0x00000000
[FlashDB][kv][env][/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:1800) KVDB size is 16384 bytes.
[FlashDB][kv][env][/data] Sector header info is incorrect. Auto format this sector (0x00000000).
[FlashDB][kv][env][/data] Sector header info is incorrect. Auto format this sector (0x00001000).
[FlashDB][kv][env][/data] Sector header info is incorrect. Auto format this sector (0x00002000).
[FlashDB][kv][env][/data] Sector header info is incorrect. Auto format this sector (0x00003000).
[FlashDB][kv][env][/data] All sector header is incorrect. Set it to default.
[FlashDB] FlashDB V2.1.0 is initialize success.
[FlashDB] You can get the latest version on https://github.com/armink/FlashDB .
[FlashDB][sample][kvdb][basic] ==================== kvdb_basic_sample ====================
[FlashDB][sample][kvdb][basic] get the 'boot_count' failed
[FlashDB][sample][kvdb][basic] set the 'boot_count' value to 1
[FlashDB][sample][kvdb][basic] ===========================================================
[FlashDB][sample][kvdb][string] ==================== kvdb_type_string_sample ====================
[FlashDB][kv][env][/data] Error: The KV @0x00000024 length has an error.
[FlashDB][sample][kvdb][string] create the 'temp' string KV, value is: 36C
[FlashDB][sample][kvdb][string] set 'temp' value to 38C
[FlashDB][kv][env][/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:954) Not found 'temp' in KV.
[FlashDB][sample][kvdb][string] delete the 'temp' finish
[FlashDB][sample][kvdb][string] ===========================================================
[FlashDB][sample][kvdb][blob] ==================== kvdb_type_blob_sample ====================
[FlashDB][sample][kvdb][blob] create the 'temp' blob KV, value is: 36
[FlashDB][sample][kvdb][blob] set 'temp' value to 38
[FlashDB][kv][env][/data] (packages/third-party/FlashDB/src/fdb_kvdb.c:954) Not found 'temp' in KV.
[FlashDB][sample][kvdb][blob] delete the 'temp' finish
[FlashDB][sample][kvdb][blob] ===========================================================
[FlashDB][tsl][log][/data] Sector (0x00000000) header info is incorrect.
[FlashDB][tsl][log][/data] All sector format finished.
[FlashDB][tsl][log][/data] (packages/third-party/FlashDB/src/fdb_tsdb.c:978) TSDB (log) oldest sectors is 0x00000000, current using sector                                                                                                                                     .
[FlashDB][sample][tsdb] ==================== tsdb_sample ====================
[FlashDB][tsl][log][/data] Error: write tsl failed (2)[FlashDB][sample][tsdb] append the new status.temp (36) and status.humi (85)
[FlashDB][tsl][log][/data] Error: write tsl failed (2)[FlashDB][sample][tsdb] append the new status.temp (38) and status.humi (90)
[FlashDB][sample][tsdb] query count is: 0
[FlashDB][sample][tsdb] ===========================================================

dlk /> cd /data
dlk /data> ls
Directory /data:
env.fdb.0           4096                     
env.fdb.1           4096                     
env.fdb.2           4096                     
env.fdb.3           4096                     
log.fdb.0           4096                     
log.fdb.1           4096                     
log.fdb.2           4096                     
log.fdb.3           4096  

#123 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » rtt的flashdb库,如何将数据保存到文件系统里? » 2024-07-04 17:43:25

参考linux那个demo发现,要使用文件系统,除了使能那两个宏之一,还要增加个设置语句:

bool file_mode = true;
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_FILE_MODE, &file_mode);

运行后,提示堆栈溢出,原来分配了1K,改成10k,不再报那个错误了,但是有如下报错,也不知道写入是否成功,明天再看。

dlk /> test_flashdb
dlk /> [FlashDB] (db->sec_size != 0) has assert failed at _fdb_init_ex.

#124 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » rtt的flashdb库,如何将数据保存到文件系统里? » 2024-07-04 17:16:40

Gentlepig
回复: 7

板子是匠芯创的d133,片外spi nor flash。目前有两个分区用来存储数据,/rodata分区格式化为fat32文件系统,/data分区格式化为littlefs文件系统,两个分区都可读写。

luban-lite sdk里虽然有flashdb配置选项,但是没有flashdb库文件。手动下载下来放到packages/third-party/目录下,将src,inc,sample三个文件夹加到工程里,demo目录下有多个单片机的demo,照抄stm32f405-spi-flash那个,写了个test_demo.c文件放到了demo目录下并添加到工程里。

初始化时,有这个语句:

// result = fdb_kvdb_init(&kvdb, "env", "fdb_kvdb1", &default_kv, NULL);
result = fdb_kvdb_init(&kvdb, "env", "/dev/data", &default_kv, NULL);

板子没有叫fdb_kvdb1的分区,我改成"data",报错:

dlk /> fal probe qspi01
Device qspi01 NOT found. Probe failed.
No flash device or partition was probed.
Usage: fal probe [dev_name|part_name]   - probe flash device or partition by given name.
[I/FAL] ==================== FAL partition table ====================
[I/FAL] | name     | flash_dev |   offset   |    length  |
[I/FAL] -------------------------------------------------------------
[I/FAL] | spl      | norflash0 | 0x00000000 | 0x00040000 |
[I/FAL] | env      | norflash0 | 0x00040000 | 0x00020000 |
[I/FAL] | env_r    | norflash0 | 0x00060000 | 0x00020000 |
[I/FAL] | os       | norflash0 | 0x00080000 | 0x00200000 |
[I/FAL] | os_r     | norflash0 | 0x00280000 | 0x00000000 |
[I/FAL] | rodata   | norflash0 | 0x00280000 | 0x00500000 |
[I/FAL] | rodata_r | norflash0 | 0x00780000 | 0x00100000 |
[I/FAL] | data     | norflash0 | 0x00880000 | 0x00700000 |
[I/FAL] =============================================================
dlk /> test_flashdb
dlk /> [FlashDB][kv][env][data] (packages/third-party/FlashDB/src/fdb_kvdb.c:1784) The oldest addr is @0x00000000
[FlashDB][kv][env][data] (packages/third-party/FlashDB/src/fdb_kvdb.c:1800) KVDB size is 7340032 bytes.
[FlashDB][kv][env][data] Sector header info is incorrect. Auto format this sector (0x00000000).

改成"/data"或"/dev/data",使能FDB_USING_FILE_LIBC_MODE或FDB_USING_FILE_POSIX_MODE,  报错找不到分区:

dlk /> test_flashdb
dlk /> [FlashDB] Error: Partition (/data) not found.
[FlashDB] Error: KVDB (env

#125 Re: 工业芯 匠芯创 » ubuntu下终端scons编译时,没有错误高亮显示,如何解决呢? » 2024-07-04 14:00:07

xfdr0805 说:

@温柔的猪 之前回复过你,还没搞定吗。在rtconfig.py 里添加 -fdiagnostics-color=always 就会有颜色提示了

不好意思,一直没尝试,后来忘了。今天编译时又找不到报错在哪一行,于是就发了这个帖子。
我找到了rtconfig.py,但是不知道该加到哪里。
直接加到末尾新行,不符合语法。
写成这样又没效果:
SCONSFLAGS="-fdiagnostics-color=always"

-----------------------------------------------

  0 BUILD = 'release'
  1 if BUILD == 'debug':
  2     CFLAGS_DBG = ' -O0 -gdwarf-2 -fdiagnostics-color=always'
  3     AFLAGS_DBG = ' -gdwarf-2'
  4 else:
  5     CFLAGS_DBG = ' -O2 -g2 -fdiagnostics-color=always'
  6     AFLAGS_DBG = ''
  7 

不知道该加到哪个flags里,就加到CFLAGS_DBG里了,我看下面还有CFLAGS和M_CFLAGS,也都用到了这个变量。
反正是起作用了。
感谢。

#126 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2024-07-04 09:29:54

忘了之前的过程了...
2.0的sdk是从mango的github上下载的,现在好像仓库移除了。
2.1的sdk是从全志官网下载的,当时注册就能下载,现在貌似不行了,得签nda。
不过t113s3官方的sdk已经是tina5.x了吧。tina2.x是基于openwrt的,tina5.x是直接基于buildroot的了,好像是这样子。

之前用tina2.0时,make menuconfig里有qt选项,于是就想尽量用官方自带的,觉得可能更好,于是就折腾了一阵子。
而到tina2.1时,sdk里已经没有qt库了,也就死心了,安心单独编译qt。

cp: cannot stat '/home/embedfire/workspace/tina-t113/Tina_Linux_2022/Tina-Linux/out/t113-evb1/compile_dir/target/qt-everywhere-src-5.12.9/ipkg-install/usr/lib/libQt5MultimediaQuick.so*': No such file or directory

无论自己单独编译,还是用sdk自带的,编译qt都有个配置选项,里边配置编译哪些库。你可以看下是应该选这个库还是不该选。
编译qt库也挺费时间的。

#127 Re: 工业芯 匠芯创 » 关于匠心创技术支持的问题 » 2024-07-03 13:39:44

dykxjh 说:
Gentlepig 说:

你艾特的那个是代理商。另外两个才是原厂人员,不过他们建群后就没怎么说过话。

我艾特了3个人啊

看错,群里官方人员确实没怎么理大家的问题。
不过,这个群存在的意义,算是给了用这个芯片的人一个互相沟通的渠道。

#128 Re: 工业芯 匠芯创 » 关于匠心创技术支持的问题 » 2024-07-03 09:18:13

你艾特的那个是代理商。另外两个才是原厂人员,不过他们建群后就没怎么说过话。

#129 工业芯 匠芯创 » ubuntu下终端scons编译时,没有错误高亮显示,如何解决呢? » 2024-07-03 09:04:48

Gentlepig
回复: 4

印象中win下conEmu貌似是可以把scon编译时的error显示为红字的。
ubuntu下终端,gcc make时,error也是红字。但是scons编译时,全是白字,有时候编译信息好几页,一页一页的去找error关键字,很考验眼力。请问,有啥好的解决办法?

#130 Re: 工业芯 匠芯创 » 买开发板送“调试器”,限量20个。先到先得!!! » 2024-07-02 16:04:40

stlink, dalink是不支持的。
jlink不知道怎么用。
看官方文档介绍是用cklink的。
据说有将stm32板刷成cklink的,不过貌似管脚并不是原swd管脚。

#131 Re: 工业芯 匠芯创 » 基于D211BBX的第一张工程板 » 2024-07-02 10:16:00

rtc那里,为什么变成了两颗电池?

#132 Re: 工业芯 匠芯创 » 昆仑派D133CBS编译运行lv_demo_music显示发虚、色阶明显 » 2024-07-01 08:52:21

估计是配置时,有些rgb引脚复用为其他功能了吧。
可以考虑把其他外设尽量都关掉,只保留rgb,调试串口等必须的。

#133 Re: 工业芯 匠芯创 » 请教,单片机一般如何保存定时采集的数据,要求长期保存,方便查寻历史记录。 » 2024-06-29 11:47:11

https://club.rt-thread.org/ask/question/9faea7447d375649.html
看这篇文章,发现需要打开SAL选项,估计是
enable bsd socket operated by file system api.
但是我搜目前的rtt组件,没搜到这个,目前打开的是:

  │ │                           [*] SAL: socket abstraction layer  --->                                                           │ │  
  │ │                           -*- Enable network interface device  --->   

而且,和local package里的lwip寸在冲突。

现在不用local lwip时,sqlite功能正常了。

-----------------------------------------------

一次插入8000条数据,可以成功,插入9000条,就卡住了,重启后发现目录下多了个journel.db。
删掉数据库,创新创建,多次插入8000调数据,可以成功,但发现插入一条数据的时间比插入8000调数据的时间还长。
比如,插入一条数据要16秒,插入8000调要12秒。
多次插入后,就出错了,用stu score再也无法查询出某范围的条数。复制数据到到pc,用db brower查看,也看到数据内容。
此时文件系统没有被占满,分配了7M空间,数据库才700多k。

------------------------------

删掉数据库,重新创建,然后每次只插入一条数据,发现时间大概话非1秒,有点难受啊。

用stu命令可以看到列出数据,看数据库最大条数是8564, 再新增也是这个数字。那么,数据库最大容量是8564?但实际不是,用stu score m n,可列出score值巍在m和n范围内的数据条,可以看的id有超过8664的。

#134 Re: 工业芯 匠芯创 » 请教,单片机一般如何保存定时采集的数据,要求长期保存,方便查寻历史记录。 » 2024-06-28 10:27:57

莫名奇妙的例程能正常运行了。

dlk /data> create_student_tbl
/data/stu_info.dbdlk /data> 
dlk /data> ls
Directory /data:
stu_info.db         12288                    
dlk /data> stu add 10
Insert 10 record(s): 1166ms, speed: 116ms/record
dlk /data> stu
test get all students
id:1    name:Student44408       score:40
id:2    name:Student44409       score:41
id:3    name:Student44411       score:43
id:4    name:Student44414       score:46
id:5    name:Student44418       score:50
id:6    name:Student44423       score:55
id:7    name:Student44429       score:61
id:8    name:Student44436       score:68
id:9    name:Student44444       score:76
id:10   name:Student44453       score:85
record(s):10
dlk /data> stu score 40 60

-------------------------------------

创建数据库,新增数据、删除、按分数范围查找,都能执行。
执行stu score时有个坑,按说stu score 40 60,就可以查找40-60分数的数据,结果本来是4个参数,有个可选的第5个参数,程序里只判断参数大于4个的情况下,也会去读取第5个参数,结果就卡住了。加个条件即可,参数大于5时才读第5个参数。

msh线程分配了10k空间,占用率85%。

-------------------------------------

上午发现stu add命令可以成功执行后,觉得之前尝试给msh分配的空间太大了,就由512k逐渐减下去,减到10k后sqlite例程的几个命令还可以使用,以为没事了。
下午切到win下,又试着重新编译sdk里的sqlite,结果又出现了上次的问题,create_student_tbl命令可以成功创建数据库,但是stu add命令就会失败,仍报错:

bind failed errmsg:database disk image is malformed

msh线程空间也改大了,无效。怀疑是spi速度的原因影响spi nor flash里的littlefs分区的读写,降低spi速度,无效。

又切回到ubuntu下,由于下午想尝试libmodbus,重新编译过。发现ubuntu下编译烧录后,stu add命令也是报错。

#135 Re: 工业芯 匠芯创 » 请教,单片机一般如何保存定时采集的数据,要求长期保存,方便查寻历史记录。 » 2024-06-27 16:55:44

https://club.rt-thread.org/ask/question/9faea7447d375649.html

这个sqlite在spi和sd卡上没法用,慢到无法忍受.归根结底是文件系统速度太慢.我有在uffs和yaffs文件系统上测,文件系统速度是上去了。但是数据量增加到一定量数据库就报SQL error: database disk image is malformed。不知道什么鬼。
但是在SD卡文件系统上测试就不会

在rtt论坛搜到同样报错的帖子,我还是放弃单片机上跑sqlite吧,或者等artinchip来解决。
话说,artinchip的lunban-lite sdk里带的这个sqlite,也许是给d21x这类片子运行的吧。

#136 Re: 工业芯 匠芯创 » 请教,单片机一般如何保存定时采集的数据,要求长期保存,方便查寻历史记录。 » 2024-06-26 16:08:05

感谢各位,板子是有网口的,目前是通过tcp将数据发送给局域网pc。

本机存储是想以后可能会用到,某些不定时的,数量较少的数据,希望存储到板子上。

#137 Re: 工业芯 匠芯创 » 请教,单片机一般如何保存定时采集的数据,要求长期保存,方便查寻历史记录。 » 2024-06-26 14:46:12

还是得看readme.

358 ## 注意事项
  1 - SQLite资源占用:RAM:250KB+,ROM:310KB+,所以需要有较充足的硬件资源。
  2 - 根据应用场景创建合理的表结构,会提高操作效率。
  3 - 根据应用场合理使用SQL语句,如查询条件,插入方式等。
  4 - 如涉及到多表操作或联表查询,最好使用PowerDesigner等工具合理设计表。

我是在msh里执行create_student_tbl命令的,应该是需要比较大的内存,而msh默认分配了4k内存,改成40k后,可以创建数据库成功了。使用stu add xxx命令来增加数据条出错了,还在解决:

dlk /> 
dlk /> cd data
dlk /data> ls
Directory /data:
123                 4                        
stu_info.db         12288                    
ui_font_Big.c       102408                   
dlk /data> stu add 1
01-01 08:31:52 E/app.dbhelper: bind failed errmsg:database disk image is malformed
01-01 08:31:52 E/app.dbhelper: db operator failed,rc=1
01-01 08:31:52 E/app.student_dao: add failed!
dlk /data> 

dbhelper.c文件里,该行报错:

268         sqlite3_finalize(stmt);
  1         if ((rc != SQLITE_OK) && (rc != SQLITE_DONE))
  2         {
  3             LOG_E("bind failed errmsg:%s", sqlite3_errmsg(db));
  4             goto __db_exec_fail;
  5         }

-------------------------------

msh栈空间改为400k,结果仍一样。
尝试改为1M,结果上电后,不运行了...

---------------------------------

student_dao.c里,执行stu add命令后,会调用到这个函数。

int student_add(rt_list_t *h)
{
    return db_nonquery_operator("insert into student(name,score) values (?,?);", student_insert_bind, h);
}

db_nonquery_operator()执行一系列操作后,调用的是如下函数。

static int student_insert_bind(sqlite3_stmt *stmt, int index, void *arg)
{
    int rc = 0;
    rt_list_t *h = arg, *pos, *n;
    student_t *s = RT_NULL;
    rt_list_for_each_safe(pos, n, h)
    {
        s = rt_list_entry(pos, student_t, list);
        sqlite3_reset(stmt);                                        //reset the stmt
        sqlite3_bind_text(stmt, 1, s->name, strlen(s->name), NULL); //bind the 1st data,is a string
        sqlite3_bind_int(stmt, 2, s->score);                        //bind the 1st data,is a int
        rc = sqlite3_step(stmt);                                    //execute the stmt by step
    }

    if (rc != SQLITE_DONE)
        return rc;
    return SQLITE_OK;
}

感觉是这个函数执行后返回的值rc,根据rc值执行了报错输出。

#138 Re: 工业芯 匠芯创 » 请教,单片机一般如何保存定时采集的数据,要求长期保存,方便查寻历史记录。 » 2024-06-26 09:26:13

海石生风 说:

@Gentlepig
写一大串没用的,难道你就没有怀疑是你输入的命令有问题?写了一大串也没有把重要细节show出来!

输入命令如下:

dlk /> df /rodata                                                               
disk free: 4.8 MB [ 9968 block, 512 bytes per block ]                           
dlk /> df /data                                                                 
disk free: 6.8 MB [ 1764 block, 4096 bytes per block ]                          
dlk /> create_student_tbl                                                       
/rodata/stu_info.db

对应函数如下,无参数,目的是创建数据库:

static int create_student_tbl(void)
{
    int fd = 0;

    db_set_name("/data/stu_info.db");
    fd = open(db_get_name(), O_RDONLY);
    rt_kprintf(db_get_name());
    if (fd < 0)
    {
        /* there is not the .db file.create db and table */
        const char *sql = "CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(32) NOT NULL,score INT NOT NULL);";
        return db_create_database(sql);
    }
    else if (db_table_is_exist("student") > 0)
    {
        /* there is the table int db.close the db. */
        close(fd);
        LOG_I("The table has already existed!\n");
        return RT_EOK;
    }
    else
    {
        /* there is not the table int db.create the table */
        const char *sql = "CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(32) NOT NULL,score INT NOT NULL);";
        return db_create_database(sql);
    }
}
MSH_CMD_EXPORT(create_student_tbl, create sqlite db);

详细文件见:
https://gitee.com/artinchip/luban-lite/blob/master/packages/third-party/sqlite/student_dao.c

#139 Re: 工业芯 匠芯创 » 请教,单片机一般如何保存定时采集的数据,要求长期保存,方便查寻历史记录。 » 2024-06-25 17:37:37

手头的板子没焊接sd相关,打算先用spi nor flash存储做个尝试。
rtt配置里勾选了littlefs和sqlte,sqlite里勾选了example。
/rodata配置为fatfs,分配了5M;/data配置为littlefs,分配了7M。

student_dao.c里默认数据库存在/data/stu_info.db。

编译后烧录到板子上,执行crate_student_tbl命令,按说应该在/data目录下生成stu_info.db数据库,可串口终端一直卡在这个命令这里,不过光标还是闪烁的。
等了几分钟后,仍是这个效果,就重启板子,发现/data下有stu_info.db文件,虽然大小为0。
执行stu命令,应该显示数据库所有数据,结果仍是卡住且光标正常闪烁。

以为是文件系统的问题,将student_dao.c里创建数据库的位值改为/rodata,这个是fatfs格式的。
结果执行create_student_tbl命令后,还是卡住,重启后,在/rodata目录下,并没有db数据库文件生成。

#140 Re: 工业芯 匠芯创 » 请教,单片机一般如何保存定时采集的数据,要求长期保存,方便查寻历史记录。 » 2024-06-25 09:32:40

晕哥 说:

建议用日志型(ext4,jffs2...)的文件系统,按时间段分文件存储。

如果没有后备电池和断电检测,做好最后一个文件阵亡的心理准备。

我这不是linux系统啊,是rtt,目前看sdk里默认打开了fatfs和littlefs。

#141 工业芯 匠芯创 » 请教,单片机一般如何保存定时采集的数据,要求长期保存,方便查寻历史记录。 » 2024-06-25 09:08:18

Gentlepig
回复: 27

目前用d133定时采集can总线上的数据,然后在rgb屏幕上的lvgl界面上显示出来。

但是想保存采集到的数据,方便其他设备查询历史记录,或者在lvgl界面上查询历史记录。
请教,有什么好的办法?

问了几个群里,有推荐sqlite3和flashdb的。想知道,使用数据库有什么好处?

还有就是目前使用的spi nor flash,如果用fatfs,好想说并不适合频繁擦写。

目前有两种需求:
1, 采集can总线上定时发送过来的数据,每次保存,或几次采集后保存一次,可能保存频率很高;
2, 采集can总线上不定时发送过来的,一般是系统出现问题时才发送过来,保存频率较低。

#142 Re: 工业芯 匠芯创 » d133上电时,can总线上正好有其它设备正在发送数据,d133有很大概率报can接收错误。 » 2024-06-24 14:52:17

更新1.0.5版本的sdk后,上电时can容易进错误中断的现象消除了。
对比新旧两版test_can例程,发现新例程在打开并配置好can后,增加了句打开can中断的语句。

    //enable CAN TX interrupt
    rt_device_control(can_tx_dev, RT_DEVICE_CTRL_SET_INT, NULL);

上一版的例程里没这么一句,但是却能进can中断。奇怪。

另,新版的sdk,lvgl的rtp使能后正常了,但是旋转屏幕却变得不正常了。
在lv_port_disp.c里的lv_port_disp_init()函数里,增加这一句:

    // disp_drv.rotated = LV_DISP_ROT_180;

画面视觉效果没有旋转,但是点击按钮没反映,而按旋转后的位值虚空点击,却出现了点击效果。
感觉是,画面貌似旋转了,但是呈现没旋转。

--------------------------------------------------------

比较下了,两版sdk,打开can时,参数里都带有中断方式参数,新版的,在设置完波特率等后,又通过ctrl命令打开中断。
于是对比了两版sdk里rtt_kernel里的can驱动部分,的rt_can_open(),发现给的参数里有中断方式,那么就在函数结尾处直接调用contrl命令打开中断。而新版里注释了这部分。
那么问题应该就是就板过早的打开了can接收中断,波特率还未配置,滤波器组也未配置,结果总线上有信息,于是就报错进错误中断了。

----------------------

lvgl屏幕旋转的问题是,忘了使能USE_DRAW_BUF这个宏定义。

#143 Re: 工业芯 匠芯创 » 求助,d133编译报错找不到stddef.h。 » 2024-06-22 14:13:44

找到问题了,sdk/toolchain目录下有些文件被删除了,其中有个include文件夹下原来是有stddef.h这个文件的。
现在将toolchain删了,再打开win_evn.bat时,会重新解压生成该目录。
想了想,可能是前两天在ubuntu下打开了win下的这个sdk,好像用me命令查看配置,也许这个时候对toolchains目录做了修改。

#144 工业芯 匠芯创 » 求助,d133编译报错找不到stddef.h。 » 2024-06-22 13:27:31

Gentlepig
回复: 1

win10下,sdk应该是1.0.4, 之前编译通过了。今天尝试再次编译,结果报错找不到stddef.h这个文件。
编译d133默认工程也是报这个错误。
搜了下,在rtdef.h里有:

#include <rtconfig.h>
#ifdef RT_USING_LIBC
#include <stdint.h>
#include <stddef.h>
#include <stdarg.h>
#endif /* RT_USING_LIBC */

又搜到:

在开启了 RT_USING_LIBC 后,GCC 编译使用 newlib
未开启 RT_USING_LIBC 时,GCC 编译使用 minilibc
dlib 是 RT-Thread 针对 IAR 编译器的移植适配(使用标准库接口时注意开启 RT_USING_LIBC)
armlibc 是 RT-Thread 针对 MDK 编译器的移植适配

https://blog.csdn.net/wandersky0822/article/details/120130059

但是,我印象中我没做啥设置修改啊。

-----------------------------

在me菜单里,搜了下RT_USING_LIBC,看其依赖关系,现在没处于选中状态啊。

-----------------------------

> m
scons: Reading SConscript files ...
args.outfile:  F:\MCU\ArtinChip\luban-lite/partition_table.h
cc1.exe: warning:  is shorter than expected
Newlib version:3.2.0
F:\MCU\ArtinChip\luban-lite\kernel\rt-thread
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: output\d13x_kunlunpi88-nor_rt-thread_helloworld
  CC application\rt-thread\helloworld\main.c
  CC bsp\artinchip\drv\audio\drv_audio.c
In file included from kernel\rt-thread\include/rtthread.h:27,
                 from application\rt-thread\helloworld\main.c:9:
kernel\rt-thread\include/rtdef.h:55:10: fatal error: stddef.h: No such file or directory
   55 | #include <stddef.h>
      |          ^~~~~~~~~~
compilation terminated . CC bsp\artinchip\drv\audio\drv_dmic.c

#146 Re: 全志 SOC » 全志t113芯片烧录问题求教 » 2024-06-22 08:26:28

万用表量各路电压;
t113-s3底部焊盘是gnd,是否焊接好?

另,dc/dc的输出部分的电感,建议用线绕的功率电感,有小封装的,比如4030啥的。

#147 Re: ESP32/ESP8266 » 计划做一款基于ESP32 S3的调试工具,具备工业485、CAN调试功能 » 2024-06-19 14:52:49

fj 说:

@Gentlepig
T113-S3的CAN只在手册上提了一句,请问下大佬调通了吗,有什么坑没

在坑网和aw-ol可以搜到的,有人发出来个can的驱动程序。我就做了几块板,测试能用。

#148 Re: 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 别墅群怎么看不到大家的吐槽呢? » 2024-06-19 13:54:03

今年越发感觉到大部分Q群都不活跃了。不知道微信技术群咋样。
很多qq技术群,都不怎么活跃了,有些纯休闲灌水的,倒是每天消息还不断,但是又感觉没啥意思。

#150 Re: 工业芯 匠芯创 » 基于D211BBX的第一张工程板 » 2024-06-15 10:46:49

挺棒的,想问下,rgb信号线一定要串电阻吗?作用是什么?左下方的那个方形模组是什么?

#151 Re: 工业芯 匠芯创 » 开始进入平头哥的双千兆网时代 » 2024-06-15 08:37:27

问下,为什么用了3.3V供电的can驱动芯片?直接用5V的,就可以省掉24VB了吧?

#152 Re: ESP32/ESP8266 » 计划做一款基于ESP32 S3的调试工具,具备工业485、CAN调试功能 » 2024-06-13 08:47:57

全触屏的吗?

IO不够的话,还可以考虑这样的方案:
全志t113s3再加wifi模块,还可以把网口留出来。t113s3也带can接口。io口足够多,有多余的串口。
就是linux启动不是那么快。
或者匠芯创的d133加wifi模块,同样有网口和can,rtt编程,启动速度足够快。
以上两个都可以接出rgb888接口,可以考虑用800*480的7寸屏。不过手持就不方便了。

我好奇如何调试,是需要先连到一个服务器上吗?

#153 Re: 工业芯 匠芯创 » D133 Eclipse工程在Linux系统下编译的解决办法 » 2024-06-01 09:07:38

海石生风 说:

上面那个udev rules就是通过udev添加设备节点呀: SYMLINK+="aic0"
USB设备接入后就会自动在/dev目录下生成aci0节点。其实不一定要加这个节点,只要权限许可就可以访问了。

另外,建议多了解udev。

我pc是ubuntu,在/etc/udev/rules.d目录下,新建个rules,比如我命名80-aicusb.rules,然后添加上边的内容。这样,板子如果进入烧录模式,在/dev/目录下,可以找到aic0这个设备。可以通过aicupg命令直接烧写程序了。

感谢。

#154 Re: 工业芯 匠芯创 » D133 Eclipse工程在Linux系统下编译的解决办法 » 2024-05-31 13:57:43

海石生风 说:

通用USB设备默认似乎不会在/dev目录添加节点,可以通过udev来添加其节点,并随便修改权限模式为666:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="33c3", ATTRS{idProduct}=="6677", MODE:="0666", SYMLINK+="aic0"

额,如何通过udev添加设备节点呢?
另,是不是每次通过usb连接d133板,都需要手动添加下节点?如果是这样的话,就不如sudo + scons aicupg命令了。

#155 Re: 工业芯 匠芯创 » D133 Eclipse工程在Linux系统下编译的解决办法 » 2024-05-30 17:22:23

海石生风 说:

Linux里的文件权限管理比Windows严格,无论是tty还是USB设置都需要用户对其有访问权限,可以用udev rules修改设备文件的权限模式来获取访问权限。

让进入烧录模式,用lsusb,可以看到有usb设备:

Bus 001 Device 006: ID 33c3:6677 Artinchip Artinchip Device

但是进入/dev目录,却没有增加相应的tty设备,所以不知道该对哪个设备修改用户权限了。

#156 Re: 工业芯 匠芯创 » D133 Eclipse工程在Linux系统下编译的解决办法 » 2024-05-30 10:22:10

发现onestep.sh里有aicupg这个命令,在win下试了,可以烧录。切到ubuntu下,执行onestep.sh后,执行aicupg,总是找不到设备。
经群里朋友提示,加sudo,但提示找不到aicupg命令,然后直接执行sudo scons aicupg -C .命令,可以烧录了。

那么,为何aicup命令无法找到设备呢?

#157 Re: 工业芯 匠芯创 » D211DCV 画了块板子,,AiBurn 烧录失败,,请求各位大牛指点。。 » 2024-05-29 16:32:56

XIVN1987 说:

我用的这个就是功率电感吧

https://whycan.com/files/members/1933/功率电感.jpg

功率电感一般是那种绕线的,比如4030封装之类的。

#158 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 交叉编译qt源码,如何指定openssl? » 2024-05-29 13:36:35

zyy299752 说:

你好 我也是遇到了 同样的问题,请问你解决了吗?

哈,一年了,忘了当时是怎么解决的。
估计就是上边回复里的那个问题吧,可能还是路径的问题?

#159 Re: 工业芯 匠芯创 » D211DCV 画了块板子,,AiBurn 烧录失败,,请求各位大牛指点。。 » 2024-05-29 08:51:07

dc/dc所用电感,不用工字电感不知道行不行,只前看到过别人的f1c100还是v3s来着,也是用的这种普通电感。

#160 Re: 工业芯 匠芯创 » luban-lite横屏竖用的设置方法 » 2024-05-29 08:44:21

niat_wxf 说:

1、打开 USE_DRAW_BUF;

2、设置变量 disp_drv.rotated = LV_DISP_ROT_90;


3.由于LVGL的旋转方向和触摸定义的旋转方向反了,1.0.3的SDK需要手动对调下90,270。后续SDK会更新掉这个问题。
LV_DISP_ROT_90

这是设置LVGL的旋转。

看sdk菜单里有frame旋转功能,但是我总是设置不成功。我设置旋转180度,结果rgb屏幕就变成雪花点了。

> Board options > Display Parameter ────────────────────────────────

┌───────────────── framebuffer rotation degree ─────────────────┐
│  Use the arrow keys to navigate this window or press the      │  
│  hotkey of the item you wish to select followed by the <SPACE │  
│  BAR>. Press <?> for additional information about this        │  
│ ┌───────────────────────────────────────────────────────────┐ │  
│ │                          (X) 0                            │ │  
│ │                          ( ) 90                           │ │  
│ │                          ( ) 180                          │ │  
│ │                          ( ) 270                          │ │  
│ │                                                           │ │  
│ │                                                           │ │  
│ └───────────────────────────────────────────────────────────┘ │  
├───────────────────────────────────────────────────────────────┤  
│                    <Select>      < Help >                     │  
└───────────────────────────────────────────────────────────────┘  
                                                                                                      

#161 Re: 工业芯 匠芯创 » d133上电时,can总线上正好有其它设备正在发送数据,d133有很大概率报can接收错误。 » 2024-05-28 15:42:25

bit4 R/W 0x0 SLEEP_MOD:Sleep Mode,休眠模式,只在复位模式可写
0x0:正常操作。控制器唤醒。
0x1:休眠模式。CAN无总线活动和无中断发生。

bit3 R/W 0x0 FILTER_MOD:Acceptance Filter Mode,接收过滤器模式
0x0:双过滤模式。使用两个过滤器。
0x1:单过滤模式。使用一个4字节过滤器。

bit2 R/W 0x0 SELFTEST_MOD:Self Test Mode,自测模式
0x0:正常操作。发送成功需有应答。
0x1:自测模式。在SELF_REQ自接收请求指令下,无需其它节点
参与也能完成整个节点测试,发送成功无需应答。

bit1 R/W 0x0 LISTEN_MOD:Listen Only Mode,只听模式
0x0:正常操作。错误计数停止于当前值 。
0x1:只听模式。只接收总线上数据,不产生应答信号,
也不更新接收错误计数。

bit0 R/W 0x1 RST_MOD:Reset Mode,复位模式
0x0:正常操作。控制器返回正常操作模式。
0x1:复位模式。发送或接收中止,控制器处于可配置状态。

这是can状态寄存器的描述。
程序里出错时打印了状态寄存器的值,我看是0xA2和0xF3差不多交替出现。这么看,像是在自动切换复位模式和正常模式。

[E] hal_can_bus_error_msg()340 0xA2
[E] hal_can_bus_error_msg()303 error in RX direction, [E] hal_can_bus_error_msg()314 Stuff Error, [E] hal_can_bus_error_msg()335 ID28~21
[E] hal_can_bus_error_msg()340 0xF3
[E] hal_can_bus_error_msg()303 error in RX direction, [E] hal_can_bus_error_msg()314 Other Error, [E] hal_can_bus_error_msg()335 Tolerate dominant bits
[E] hal_can_bus_error_msg()340 0xA2
[E] hal_can_bus_error_msg()303 error in RX direction, [E] hal_can_bus_error_msg()314 Other Error, [E] hal_can_bus_error_msg()335 Tolerate dominant bits
[E] hal_can_bus_error_msg()340 0xF3
[E] hal_can_bus_error_msg()303 error in RX direction, [E] hal_can_bus_error_msg()314 Other Error, [E] hal_can_bus_error_msg()335 Tolerate dominant bits
[E] hal_can_bus_error_msg()340 0xA2
[E] hal_can_bus_error_msg()303 error in RX direction, [E] hal_can_bus_error_msg()314 Stuff Error, [E] hal_can_bus_error_msg()335 ID28~21
[E] hal_can_bus_error_msg()340 0xA2
[E] hal_can_bus_error_msg()303 error in RX direction, [E] hal_can_bus_error_msg()314 Other Error, [E] hal_can_bus_error_msg()335 Tolerate dominant bits
[E] hal_can_bus_error_msg()340 0xF3
[E] hal_can_bus_error_msg()303 error in RX direction, [E] hal_can_bus_error_msg()314 Stuff Error, [E] hal_can_bus_error_msg()335 ID28~21

#163 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » rtos+lvgl,其它线程如何通知lvgl线程更新数据?还是直接在其它线程里更新lvgl控件? » 2024-05-27 17:12:13

感谢。
目前暂定大概10秒can收到一组数据。
用2的话,比如定时1秒更新下lvgl控件显示,感觉有点浪费,毕竟实际10秒才有数据变动。

#164 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » rtos+lvgl,其它线程如何通知lvgl线程更新数据?还是直接在其它线程里更新lvgl控件? » 2024-05-27 15:35:23

Gentlepig
回复: 5

比如现在有can和lvgl两个线程。can可能不定期接收到数据,接收到数据后想更新到屏幕上。
那么该如何设计更新逻辑好呢?
1, can线程里收到数据后调用lvgl控件直接更改显示;
2,can线程收到数据后存到全局变量里,lvgl线程里开启个定时器,定时刷新控件读取这个全局变量;
3,can线程收到数据后存到全局变量里,同时发送信号量,通知lvgl线程去读取这个全局变量?

请教,改怎么设计好呢?

#165 Re: 工业芯 匠芯创 » d133上电时,can总线上正好有其它设备正在发送数据,d133有很大概率报can接收错误。 » 2024-05-25 13:51:39

这是can错误处理函数,直接CAN_INTR_ERRB错误,进hal_can_bus_error_msg()函数。
看到里边有对发送错误计数寄存器的读取staus.txerr,超过阈值后,将can设置为复位模式。
虽然有对接收错误计数寄存器stauts.rxerr的读取,但是没看到有其它地方调用到。
另有对溢出错误的累加计数。
而看错误提示,应该是:
ERRB_INT:Bus Error Interrupt,总线错误中断(节点检测到总线上发生了错误)。
错误信息里提到的是,接收方向错误,Tolerate dominant bits错误。

static void hal_can_error_handle(can_handle *phandle, u32 err_status)
{
    u32 can_status;
    u8 errcode;

    errcode = readb(phandle->can_base + CAN_ERRCODE_REG) &
              CAN_ERRCODE_SEGCODE_MASK;

    can_status = readl(phandle->can_base + CAN_STAT_REG);
    phandle->status.rxerr = readl(phandle->can_base + CAN_RXERR_REG);
    phandle->status.txerr = readl(phandle->can_base + CAN_TXERR_REG);

    if (err_status & CAN_INTR_ERRB) {
        hal_can_bus_error_msg(phandle);
    }

    if (err_status & CAN_INTR_ARBLOST) {
        hal_can_arblost_msg(phandle);
    }

    if (err_status & CAN_INTR_ERRP) {
        if (phandle->status.current_state == PASSIVE_STATUS)
            phandle->status.current_state = WARNING_STATUS;
        else
            phandle->status.current_state = PASSIVE_STATUS;
    }

    if (err_status & CAN_INTR_OVF) {
        phandle->status.othererrcnt++;
        phandle->status.recverrcnt++;
        hal_can_set_mode(phandle, CAN_MODE_RST);
        hal_can_mode_release(phandle, CAN_MODE_RST);
        if (phandle->callback)
            phandle->callback(phandle, (void *)CAN_EVENT_RXOF_IND);
        /* clear bit */
        writel(CAN_MCR_CLR_OVF, phandle->can_base + CAN_MCR_REG);
    }

    if (err_status & CAN_INTR_ERRW) {
        if (can_status & CAN_STAT_BUS)
            phandle->status.current_state = BUS_OFF;
        else if (can_status & CAN_STAT_ERR)
            phandle->status.current_state = WARNING_STATUS;
        else
            phandle->status.current_state = ACTIVE_STATUS;
    }

    if (phandle->status.current_state == BUS_OFF)
        hal_can_mode_release(phandle, CAN_MODE_RST);

    if (phandle->status.txerr > CAN_ERRP_THRESHOLD &&
        errcode == CAN_ERRCODE_ACK_SLOT)
    {
        writel(CAN_MCR_ABORTREQ, phandle->can_base + CAN_MCR_REG);
        hal_can_set_mode(phandle, CAN_MODE_RST);
        hal_can_mode_release(phandle, CAN_MODE_RST);
    }
}

hal_can_bus_error_msg()函数里,打印出了错误的方向、错误的类型、在哪个阶段出的错。

static void hal_can_bus_error_msg(can_handle *phandle)
{
    u8 i;
    u8 errinfo = readb(phandle->can_base + CAN_ERRCODE_REG);
    u8 errtype = (errinfo & CAN_ERRCODE_ERRTYPE_MASK) >> 6;
    u8 errdir = (errinfo & CAN_ERRCODE_DIR) >> 5;
    u8 errcode = errinfo & CAN_ERRCODE_SEGCODE_MASK;

    for (i = 0; i < ARRAY_SIZE(bus_err_dir); i++) {
        if (errdir == bus_err_dir[i].code) {
            hal_log_err("%s, ", bus_err_dir[i].msg);
            if (i)
                phandle->status.recverrcnt++;
            else
                phandle->status.snderrcnt++;
            break;
        }
    }

    for (i = 0; i < ARRAY_SIZE(bus_err_type); i++) {
        if (errtype == bus_err_type[i].code) {
            hal_log_err("%s, ", bus_err_type[i].msg);
            switch (i) {
            case 0:
                phandle->status.biterrcnt++;
                break;
            case 1:
                phandle->status.formaterrcnt++;
                break;
            case 2:
                phandle->status.stufferrcnt++;
                break;
            default:
                phandle->status.othererrcnt++;
                break;
            }
            break;
        }
    }

    for (i = 0; i < ARRAY_SIZE(bus_err_code); i++) {
        if (errcode == bus_err_code[i].code) {
            hal_log_err("%s\n", bus_err_code[i].msg);
            break;
        }
    }
}

翻了手册,看到这么一段话:

错误报警阈值ERRWT将作为报警功能提示当前发生的总线错误,且在控制器进入被动错误状态之前被触发。在复位模式下,ERRWT数值可在错误报警阈值寄存器(CAN_ERRWT)中进行配置。当TEC和/或REC数值大于等于ERRWT时,ERR_STAT 被置1。当TEC 和REC 数值都小于ERRWT时, ERR_STAT被复位0。只要ERR_STAT或BUS_STAT位值发生变化,便会触发错误报警中断ERRW_INT。

当TEC和/或REC数值大于127 时,节点进入被动错误状态。当TEC和REC数值都小于等于127时,节点重新变为主动错误状态。节点在主动错误和被动错误状态之间切换时,都将触发被动错误中断ERRP_INT。

当TEC 数值大于255 时,节点进入总线关闭离线状态。此时,控制器将REC数值置为0、TEC数值置为127、BUS_STAT位置1、产生错误报警中断ERRW_INT、控制器进入复位模式。

为了返回主动错误状态,必须进行离线恢复。首先需要退出复位模式,进入正常操作模式;然后要求节点在总线上检测到128 次11 个连续隐性位。每一次检测到11 个连续隐性位时,TEC 数值都将减1,当离线恢复完成后(TEC 数值从127 减小到0),BUS_STAT位复位为0,从而触发错误报警中断ERRW_INT。

看can相关寄存器,有个CAN_MODE寄存器,0为复位模式,3为接收过滤。

#166 Re: 工业芯 匠芯创 » d133上电时,can总线上正好有其它设备正在发送数据,d133有很大概率报can接收错误。 » 2024-05-25 09:09:19

irqreturn_t hal_can_isr_handler(int irq_num, void *arg)
{
    u32 int_status;
    can_handle *phandle = (can_handle *)arg;

    int_status = readl(phandle->can_base + CAN_INTR_REG);

    if (int_status & (CAN_INTR_ERRB | CAN_INTR_ARBLOST | CAN_INTR_ERRP |
                CAN_INTR_WAKEUP | CAN_INTR_OVF | CAN_INTR_ERRW))
        hal_can_error_handle(phandle, int_status);

    if (int_status & CAN_INTR_TX) {
        phandle->status.sndpkgcnt++;
        if (phandle->callback)
            phandle->callback(phandle, (void *)CAN_EVENT_TX_DONE);
    }

    if ((int_status & CAN_INTR_RX) && !(int_status & CAN_INTR_OVF)) {
        hal_can_rx_frame(phandle->can_base, &phandle->msg);
        if (phandle->callback)
            phandle->callback(phandle, (void *)CAN_EVENT_RX_IND);
    }

    writel(int_status, phandle->can_base + CAN_INTR_REG);
    return IRQ_HANDLED;
}

aic_hal_can.c文件里,can中断函数中,是先看状态寄存器,一旦出现错误,就先去进行错误处理。

如果d133先上电,而总线上其它设备还没上电,则也会报can发送错误,这是可以理解的,can总线上没有其它can设备是发送不成功的。但其它can设备一上电,这个发送错误就会立刻消除了。
而接收错误这里,大部分情况下会一直错下去。

#167 Re: 工业芯 匠芯创 » d133如何通过usb读写nor flash里的文件系统的数据? » 2024-05-25 09:02:00

tomas 说:

烧录镜像选择分区就可以了,rodata属于只读分区,如果是需要读写的文件,放在data分区就可以了

靠群里朋友的帮助解决了。

menuconfig里,file system image0,设置的fatfs文件系统,名字是rodata.fatfs,挂载到了/rodata分区。但还有个额外选项 FATFS enable write func in spinor 需要选中,fatfs文件系统才能可写。

----------------------------------------------------------

物理分区、文件系统分区,我还是有点晕乎。
partition_tab.h里应该定义的是物理分区吧,分成了4个部分。spl分区应该是存放boot程序。os分区应该是存放编译的可执行程序。另两个应该是存放资源文件。

#define FAL_PART_TABLE \
{ \
    {FAL_PART_MAGIC_WORD, "spl",FAL_USING_NOR_FLASH_DEV_NAME, 0,262144,0}, \
    {FAL_PART_MAGIC_WORD, "os",FAL_USING_NOR_FLASH_DEV_NAME, 262144,2097152,0}, \
    {FAL_PART_MAGIC_WORD, "rodata",FAL_USING_NOR_FLASH_DEV_NAME, 2359296,6291456,0}, \
    {FAL_PART_MAGIC_WORD, "data",FAL_USING_NOR_FLASH_DEV_NAME, 8650752,7340032,0}, \
}
#endif

board.c里是文件系统分区,其中有名为/data和/rodata的文件系统分区,/rodata分区挂载的是fatfs格式的blk_rodata类型的设备,/data分区挂载的是littlefs格式的data类型的设备。
这里最糊涂了,blk_rodata怎么来的?物理分区是如何挂载到/rodata的?

#ifdef RT_USING_DFS_ROMFS
#include "dfs_romfs.h"
static const struct romfs_dirent _mountpoint_root[] =
{
    {ROMFS_DIRENT_DIR, "ram", RT_NULL, 0},
    {ROMFS_DIRENT_DIR, "data", RT_NULL, 0},
    {ROMFS_DIRENT_DIR, "rodata", RT_NULL, 0},
    {ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0},
    {ROMFS_DIRENT_DIR, "udisk", RT_NULL, 0},
};
const struct romfs_dirent romfs_root =
{
    ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_mountpoint_root, ARRAY_SIZE(_mountpoint_root)
};
#endif
const struct dfs_mount_tbl mount_table[] = {
#ifdef RT_USING_DFS_ROMFS
    {RT_NULL, "/", "rom", 0, &romfs_root, 0},
#endif
#ifdef LPKG_RAMDISK_TYPE_INITDATA
    {"ramdisk0", "/ram", "elm", 0, 0, 0},
#endif
#if (defined(AIC_USING_FS_IMAGE_TYPE_FATFS_FOR_0) || defined(AIC_USING_FS_IMAGE_TYPE_FATFS_FOR_1))
    {"blk_rodata", "/rodata", "elm", 0, 0, 0},
#endif
#ifdef LPKG_USING_LITTLEFS
    {"data", "/data", "lfs", 0, 0, 0},
#endif
#ifdef LPKG_USING_DFS_UFFS
    {"data", "/data", "uffs", 0, 0, 1},
#endif
#ifdef AIC_USING_SDMC1
    {"sd0", "/sdcard", "elm", 0, 0, 0},
#endif
#if (defined(AIC_USING_USB0_HOST) || defined(AIC_USING_USB1_HOST))
    {"udisk", "/udisk", "elm", 0, 0, 0xFF},
#endif
    {0}
};
#endif

望清楚的朋友帮解惑。

#168 工业芯 匠芯创 » d133上电时,can总线上正好有其它设备正在发送数据,d133有很大概率报can接收错误。 » 2024-05-24 09:37:58

Gentlepig
回复: 7

怀疑是总线上其它设备发送数据发送了一半,d133才开始接收,结果报错。关键是,一次报错后,接下来所有的接收数据都报错。

[E] hal_can_bus_error_msg()303 error in RX direction, [E] hal_can_bus_error_msg()314 Other Error, [E] hal_can_bus_error_msg()335 Tolerate dominant bits

有什么解决办法好呢?一旦进入can错误处理这里就进行重启操作?

#169 工业芯 匠芯创 » d133如何通过usb读写nor flash里的文件系统的数据? » 2024-05-22 16:25:04

Gentlepig
回复: 2

比如有些图片,想传到板子上。不想把这些文件打包进烧录镜像里的话,能不能通过usb传到板子上?

使能了usb device,然后选了usb msc device,然后里面有个两个选项,ram template和storage template。
选了ram template后,win10上弹出个500k的盘符,提示要格式化,格式化后,做个修改,再重启,还提示要格式化...

选storage template模式,默认挂载路径是/sdcard,我没接sd接口,而且,想存到spi nor flash里。我看/rodata目录也是fat格式,就设置了这个目录,结果烧录后运行,提示:
[E/FAL] (blk_dev_write:106) This config only supports read!


请教,有什么办法,通过usb口,直接读写板子上spi nor flash的数据?

#170 Re: 工业芯 匠芯创 » d133的jtag只需要两根线吗? » 2024-05-17 15:51:28

平头哥芯片的私有两线接口通常被称为"cJTAG"(连续JTAG)或"Compact JTAG"。

cJTAG是一种用于调试和测试的串行接口标准,它旨在提供对芯片内部结构和寄存器的访问。与传统的JTAG接口相比,cJTAG采用了较少的引脚数量,并且支持更高的速度和更灵活的信号路由。

请注意,虽然cJTAG是平头哥芯片的常见接口,但具体芯片型号和配置可能会有所不同。因此,在实际使用中,建议参考芯片的文档和规格说明以了解其具体的接口类型和特性。

搜到了这个。

#171 工业芯 匠芯创 » d133的jtag只需要两根线吗? » 2024-05-17 15:22:25

Gentlepig
回复: 1

看了官方开发板原理图,aic-jtag可以接到rtp/ctp的两个管脚上,只用到了jtag-ms和jtag-ck两根信号线。
另一种方法是aic-jtag通过个转接接到了sdc1接口上,看了下sdc1相关引脚的服用功能,也只有jtag-ms和jtag-ck两个信号。

我的印象中,jtag一般是多根信号线的。
TCK(时钟)、TMS(状态)、TDI(数据输入)和TDO(数据输出)

为何这里只需要两个信号线?
那么用stlink可以调试d133吗?daplink可以调试d133吗?

#172 Re: 工业芯 匠芯创 » d133打开网口后,编译报错。 » 2024-05-17 10:36:01

海石生风 说:

复习下C语言的基础吧。只有位于BSS段的全局变量才会被自动初始化为0,而且这个初始化不是语言本身实现的,而是执行main函数之前的启动代码执行的。

受教。

15231831111 说:

解决了

将rx tx延时设置为0,就不会报错了。

#173 Re: 工业芯 匠芯创 » d133接rgb屏幕,如何让屏幕旋转? » 2024-05-17 09:27:47

tomas 说:

/* when define USE_DRAW_BUF, disp_drv.rotated can be
      LV_DISP_ROT_90/LV_DISP_ROT_180/LV_DISP_ROT_270
    */
    // disp_drv.rotated = LV_DISP_ROT_90;
留意注释,USE_DRAW_BUF也要使能

这个是lvgl软件旋转吧。

看 配置菜单里的 Graphics Support,应该是可以直接硬件支持旋转的吧,我想要的是这个效果。
默认的开机彩色方格,是没有使用lvgl的吧。

----------------------------------------

配置菜单里旋转180后,因为是花屏,盲点rtp校准,然后盲点屏幕上的按钮,发现调试串口发现这个警告出现了很多次。

[W] hal_ge_control()549 Invailid ioctl: 00004703

----------------------------------------

配置菜单里不旋转,lvgl里使能USR_DRAW_BUF, disp_drv.rotated = LV_DISP_ROT_180;确实能旋转了。
好奇这种旋转,有没有额外的性能开销?

但配置菜单里有这个旋转功能,还是想使用这个功能。

#174 Re: 工业芯 匠芯创 » d133打开网口后,编译报错。 » 2024-05-17 08:50:35

aozima 说:

比如 netif_list 为空?甚至还没初始化,是个脏值。

不检查就直接访问么?

确实是这个问题,lvgl线程和lwip_test_example优先级相同,改成lwip线程优先级更高一点就没事了。

请教,netif_list没初始化时,lvgl线程调用netif_list->ip_addr为什么会卡死?因为该指针是个不正常的位置值,进行读取造成程序无法运行?

另,如何检查呢?不懂指针的检查方法?

-------------------------------

搜了下,说是c语言指针未初始化时为NULL,也就是0.
那么netif_list为0时,调用netif_list->ip_addr为什么程序会卡死?

-------------------------------

gpt回答的:
在C语言中,如果一个指针未初始化,那么访问该指针所指向的结构体变量会导致未定义的行为。这可能会导致程序崩溃、产生奇怪的结果,或者其他不可预测的行为。

未初始化的指针会包含一个未知的内存地址,当你尝试通过这个指针去访问结构体的成员时,实际上是在尝试读取一个未知内存地址的内容,这是非常危险的行为。这种行为可能导致程序崩溃,或者读取到不可预测的数据,因为该内存区域可能被其他数据所覆盖,或者根本不存在有效数据。

因此,在使用指针之前,一定要确保将其初始化为合适的值,比如将其设置为一个有效的内存地址,或者使用NULL来表示空指针。

#175 工业芯 匠芯创 » d133接rgb屏幕,如何让屏幕旋转? » 2024-05-16 17:05:11

Gentlepig
回复: 2

目前用的1.0.4sdk,不旋转的话,lvgl, awtk都能运行,rtp也正常。开机默认有个彩色方格显示。

我想将屏幕旋转180,按d133-doc教程:

  ┌─────────────────────────────────────────────── Display Parameter ───────────────────────────────────────────────┐
  │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty submenus ----).  Highlighted letters    │
  │  are hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?>    │
  │  for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable                  │
  │                                                                                                                 │
  │ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
  │ │                   [*] Display Support                                                                       │ │
  │ │                   [ ] Ai PQ Tool Support                                                                    │ │
  │ │                       select Display interface (Display RGB interface)  --->                                │ │
  │ │                       RGB interface options  --->                                                           │ │
  │ │                       select framebuffer format (argb8888)  --->                                            │ │
  │ │                   [*] Support double framebuffer                                                            │ │
  │ │                   [*] Display color block                                                                   │ │
  │ │                       framebuffer rotation degree (180)  --->                                               │ │
  │ │                       Display Panels  --->                                                                  │ │
  │ │                       panel backlight control (gpio)  --->                                                  │ │
  │ │                   (PE.13) panel backlight enable pin                                                        │ │
  │ │                   [ ] panel backlight enable pin low active                                                 │ │
  │ │                                                                                                             │ │
  │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │
  ├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
  │                            <Select>    < Exit >    < Help >    < Save >    < Load >                             │
  └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

结果,开机的彩色放个都编程灰色混乱的了。

#176 Re: 工业芯 匠芯创 » d133打开网口后,编译报错。 » 2024-05-16 16:57:15

想在屏幕上显示本机ip,查看ifconfig命令的实现,看到是读取了全局变量netif_list或netif_default。
于是在Lvgl界面初始化里加了个label,初始化值为netif_list->ip_addr,按钮回调函数里,也更新这个label值为netif_list->ip_addr.
结果下载后第一次运行,能正常显示本机地址。但是重启后,就进不到应用程序了,串口中断也卡住不更新了。

后来发现在设置lalbe值为netif_list->ip_addr之前,加个rt_thread_mdelay(),不管多小。界面就又正常了。

请教,这是为什么?

void test_ui_init()
{
    lv_obj_t * btn = lv_btn_create(lv_scr_act());     /*Add a button the current screen*/
    lv_obj_set_pos(btn, 50, 50);                            /*Set its position*/
    lv_obj_set_size(btn, 120, 50);                          /*Set its size*/
    lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL);           /*Assign a callback to the button*/

    lv_obj_t * label = lv_label_create(btn);          /*Add a label to the button*/
    lv_label_set_text(label, "get ip address");                     /*Set the labels text*/
    lv_obj_center(label);

    rt_thread_mdelay(1);

    labelIpaddr = lv_label_create(lv_scr_act());
    lv_label_set_text_fmt(labelIpaddr, "local ip addr:0x%X", 0xaa55);
    lv_label_set_text_fmt(labelIpaddr, "local ip addr: %s", ip4addr_ntoa(&netif_list->ip_addr));
    lv_obj_set_pos(labelIpaddr, 200, 50);
    lv_obj_set_size(labelIpaddr, 400, 50);
}

#177 Re: Cortex M0/M3/M4/M7 » 看daplink源码编译教程,为何会生成多个if目录? » 2024-05-15 14:10:35

sjshe3326 说:

前面是dap的主控 后面是目标的主控  为了拖着烧录用的 好像是这样

我现在用的合宙的air32f103cbt6开发板,烧写的是air32f103xb_air32f103rb_if.hex。但是不光可以给ari32f103cb烧写程序,还可以给stm32f103cb, ve烧写程序,还可以给gd32f103cb, ve烧写程序。

-----------------------------

打开src/board目录下可以看到各对应的.c文件,比如stm32f072rb.c:

#include "target_family.h"
#include "target_board.h"

const board_info_t g_board_info = {
    .info_version = kBoardInfoVersion,
    .board_id = "0720",
    .family_id = kStub_HWReset_FamilyID,
    .target_cfg = &target_device,
    .board_vendor = "STMicroelectronics",
    .board_name = "NUCLEO-F072RB",
};

stm32f103rb.c:

#include "target_family.h"
#include "target_board.h"

const board_info_t g_board_info = {
    .info_version = kBoardInfoVersion,
    .board_id = "0001",
    .family_id = kStub_HWReset_FamilyID,
    .target_cfg = &target_device,
    .board_vendor = "LuatOS",
    .board_name = "Air32 MINI DAPLink",
};

感觉是这样的,这几个是给对应nucleo板上的stlink更新成dapllink用的。
各种nucleo板,虽然板载给用户使用的mcu有各种各样的,m3,m4,m0,l0,l4等,但上边都板载了个stm32f103cb作为stlink。

--------------------------------------

stm32f103xb_if这个工程,没有指定特定目标板,编译时报错,对比了下工程,没有包含类似stm32f103cb.c这样的目标板配置文件,算是少个参数。

#178 Cortex M0/M3/M4/M7 » 看daplink源码编译教程,为何会生成多个if目录? » 2024-05-15 11:05:32

Gentlepig
回复: 3

20240515.png
bl后缀的是bootloader工程,if后缀的是interface工程。
但是这里为什么有stm32f103xb_if和其它stm32f103xb_stm32f103rb_if工程?两者有什么区别呢?

比如stm32f103xb_stm32f072rb_if这个目录,072指的是当作daplink的主控芯片?那前边的103xb是啥意思?

#179 Re: Cortex M0/M3/M4/M7 » 请教,daplink如何解除M3单片机的写保护? » 2024-05-14 14:02:40

海石生风 说:

MDK: CMSIS-DAP Cortex-M Target Driver Setup中的Download Function选中Erase Full Chip

试了下,不行。erase full chip可能不会擦除option bytes部分吧。

---------------------------------------------------------------------------

https://gitee.com/delbertz/openocd-toolbox
找到这么个工具,可惜不支持gd系列的。

#180 Re: 工业芯 匠芯创 » d133打开网口后,编译报错。 » 2024-05-14 11:51:15

板子没问题,pc切到ubuntu后,板子可以ping通pc。
看样子是win10需要做些配置修改。

那么有个问题,如果不像修改win10配置,就这样ping不通win10,那么影响板子通过udp和tcp连接win10吗?

#181 Re: 工业芯 匠芯创 » d133打开网口后,编译报错。 » 2024-05-14 11:29:04

网口又遇到问题了,这个板子之前用1.0.3版本sdk时,网口能调通。
现在用1.0.4,pc可以ping通板子,板子无法ping通pc。

#182 Re: 工业芯 匠芯创 » d133的rtp如何配置? » 2024-05-14 09:39:03

比对了下test_rtp_draw例程和lvgl_ui里rtp部分,大部分相似,发现test_rtp_draw里,校准程序时,画了十字光标后获取当前触控值,进行了一次xy交换。而画点线时,也进行了一次xy交换才开始画。

不知道这里为什么要进行xy交换。

在lvgl和awtk程序里,也在这两个地方加入xy交换后,触控正常了。

#183 Re: 工业芯 匠芯创 » D133 Eclipse工程在Linux系统下编译的解决办法 » 2024-05-14 09:35:00

没这么试过,在linux可以脱离eclipse环境了吧。
应该可以直接用scons命令,或者执行sdk/tools/onestep.sh这个脚本,然后执行预定义的几个命令。
我在ubuntu下,me, ab, list, i, lunch这些都正常。
但是烧录问题还没解决吧,编译完了,再切到win下烧录?
希望官方出个linux下的烧录工具,或命令行工具。

#185 Re: ESP32/ESP8266 » esp32 p4板子 » 2024-05-11 14:25:37

Leotian 说:

ESP32-P4怎样不知道,目前ESP-S3是最佳的86盒工具,内存制约到屏幕分辨率和刷新频率,目前只是跑跑LVGL

啥是86盒?我搜了下,是墙体内的接线暗盒?

#186 工业芯 匠芯创 » 请问,rgb888和argb8888,区别大吗? » 2024-05-11 10:20:38

Gentlepig
回复: 3

d133,跑lvgl例程,硬件上是画了rgb888接口到lcd。然后sdk里菜单配置lcd也是rgb888, 顺序是bgr。
lvgl配置里,有个色深,只有16和32可选,我就选了32。
结果运行后,屏幕有些区域有些闪,字体看不到,或者放大发虚。

按群友配置,rgb565,色深16,就正常了。我又改成argb8888,色深32,也正常了。
rgb888的话,我的理解是正好通过24条信号线传到了屏里。那么argb8888呢?这是怎么传输的啊?lcd颜色信号线只有24条啊。

另,lcd配置里还有个data mirror选项,这个是干什么用的?

  │ │                                rgb mode (PRGB)  --->                                                                         │ │
  │ │                                interface format (PRGB 24 BIT)  --->                                                          │ │
  │ │                                data order (BGR)  --->                                                                        │ │
  │ │                                clock phase select (0 degree)  --->                                                           │ │
  │ │                            [ ] data mirror                                                                                   │ │
  │ │

#187 Re: 工业芯 匠芯创 » d122bbv LVGL demo测试 » 2024-05-11 09:57:12

看test_rtp_draw程序,有两处xy交换,一处是校准是,画出十字光标后,获取测试点坐标,获取后,进行了次xy转换。
然后画线程序画线时,将获取的触控坐标进行xy转换,再瞄点。

按这个,在lvgl_rtp相关部分加入这两个xy交换,就可以了。

lv_tpc_rtp.c

        if (data->x_coordinate > 0 || data->y_coordinate > 0) {
            press_flag = 1;
            rt_device_control(rtp_dev, RT_TOUCH_CTRL_SET_X_TO_Y, (void *)data);

lv_tpc_run.c

#ifdef AIC_USING_RTP
                    extern void lv_convert_adc_to_coord(struct rt_touch_data *data);
                    rt_device_control(dev, RT_TOUCH_CTRL_SET_X_TO_Y, (void *)(&(read_data[i])));
                    lv_convert_adc_to_coord(&read_data[i]);
#endif

请教,这里为什么要进行xy坐标交换?

#188 Re: 工业芯 匠芯创 » d122bbv LVGL demo测试 » 2024-05-10 13:53:26

Pre-Boot Program ... (24-03-28 14:17 853acea)
SPINOR
cs=0, phase=3
cs=1, phase=2
Psram_init done.
goto run SPL

tinySPL [Built on May  6 2024 15:16:22]
[W] usbh_get_connect_id()107 usb 0 port change wait failed.
[E] main()133 Not find udisk.
qspi0 freq (input): 99000000Hz
qspi0 freq ( bus ): 49500000Hz
qspi0 freq ( bus ): 99000000Hz
Selecting default config 'Luban-lite firmware'
spl read: 631304 byte, 13254 us -> 46514 KB/s
spl read: 235968 byte, 5011 us -> 45986 KB/s
spl read: 8924 byte, 494 us -> 17640 KB/s
 169281 : Run APP

     _         _   ___        ___ _     _
    / \   _ __| |_|_ _|_ __  / __| |__ (_)_ __
   / _ \ | '__| __|| || '_ \| |  | '_ \| | '_ \
  / ___ \| |  | |_ | || | | | |__| | | | | |_) |
 /_/   \_\_|   \__|___|_| |_|\___|_| |_|_| .__/
                                         |_|

Welcome to ArtInChip Luban-Lite 1.0 [Built on May 10 2024 11:41:54]
qspi0 freq (input): 99000000Hz
qspi0 freq ( bus ): 49500000Hz
01-01 12:13:24 I/NO_TAG: Flash ID: 0xef4018
01-01 12:13:24 I/NO_TAG: Find a Winbond flash chip. Size is 16777216 bytes.
qspi0 freq (input): 99000000Hz
qspi0 freq ( bus ): 99000000Hz
01-01 12:13:24 I/NO_TAG: norflash0 flash device is initialize success.
01-01 12:13:24 I/NO_TAG: Probe SPI flash norflash0 by SPI device qspi01 success.
[I] aic_find_panel()62 find panel driver : panel-rgb
[I] aicfb_probe()950 fb0 allocated at 0x40045920
[I] hal_ge_init()342 cmd queue hal, cmdq buffer size = 2048
[I] hal_ge_init()400 dither line phys: 0x40334180
01-01 12:13:24 I/RTP: x_plate 235 y_plate 665
01-01 12:13:24 I/touch: rt_touch init success
01-01 12:13:24 I/RTP: ArtInChip RTP loaded
01-01 12:13:24 I/WDT: ArtInChip WDT loaded
Reboot action: Watchdog-Reset, reason: Command-Reboot

Startup time: 0.473 sec
info: cmd ring buf size:1920
info: cmd ring buf size:1920
[I] rtp_get_fb_info()97 Screen width: 800, height: 480
dlk /> 01-01 12:13:39 I/RTP: Unsupported cmd: 0x1501
01-01 12:13:39 I/RTP: Unsupported cmd: 0x150b

电阻屏触控不准。
不运行lvgl程序,运行test_rtp_draw校准,然后画线,看着还算跟手,没有啥偏移。

lvgl例程里,也有触控校准部分,运行lvgl后,先执行了校准,然后进lvgl界面,但是触控偏移很大。可以左右滑动、上下滑动总是失败。
看串口信息,有两个关于rtp的警告:
Unsupported cmd: 0x1501
Unsupported cmd: 0x150b

#189 Re: 工业芯 匠芯创 » d122bbv LVGL demo测试 » 2024-05-10 11:29:26

问题已找到,lvgl色深选了32,而lcd接口设置的的rgb888,改成argb8888就正常了。

#190 Re: 工业芯 匠芯创 » d122bbv LVGL demo测试 » 2024-05-10 10:36:01

1_20240510-1033.jpg2_20240510-1033.jpg3_20240510-1034.jpg

参照luban-doc文档,添加lvgl_test程序。按介绍,应该是显示如第一张图片那样,结果却是第二张图片。放大按钮尺寸,显示第三张图片。

#191 Re: 工业芯 匠芯创 » d122bbv LVGL demo测试 » 2024-05-09 17:22:41


d133跑lvgl例程,用的800*480的屏幕。跑aic的base_demo,可能默认是1200*600分辨率的例程,显示不全,但是顶部哪里为何会乱闪?
又尝试lvgl官方的keypad_encoder例程,运行后不显示字体,还很虚。这个例程应该是800*480分辨率的啊。

#192 Re: 工业芯 匠芯创 » d133的rtp如何配置? » 2024-05-09 13:38:09

更新了1.0.4版的sdk,默认配置,rtp可以正常工作了。
sdk里的几个lvgl例程能够正常运行。想尝试运行lvgl官方例程,结果报错,有些依赖没搞懂。
awtk可以运行,但是默认好像是配合的ctp。按lvgl哪里的程序,修改touch_thread.c文件,加入了rtp部分。运行后校准屏幕后,可以显示例程界面,左边三个按钮可以点击进去响应界面,第四个也就是最右边的点击无反应。前三个按钮进去的页面,也无法点击右侧的返回按钮。感觉屏幕右侧失灵。

#193 Re: 硬件设计 KiCAD/Protel/DXP/PADS/ORCAD/EAGLE » 请教,这电路的作用。 » 2024-05-09 10:06:34

liuwei1214 说:

前面是供电进来啊,有防反接,有个开关切换的电路。后面是个稳压器。

看不懂,后边的U21和Q4是如何构成稳压器的?U21是tl431这个明白可以稳定一个电压,但是却稳定的是Q4的基极。

tlv431基准电压是1.24V,如果tlv431稳定工作,那么Q4基极电压是4.97V.

VPP接高电压,Q17导通,Q18导通。这里能看明白,然后呢?

要么有VPP供电,将Q3的集电极拉低,要么switch有高电平信号,将Q3集电极拉低。但是为什么要将Q3集电极拉低呢?Q3这里电流流向看不懂...

AGNDR,AGNDL是啥?

#194 Re: Php/Nodejs/Web/HTML5/Javascript/微信开发/Python » 2024年PHP还值得学吗? » 2024-05-08 08:42:12

就是机器人发帖,上个帖子我举报过,我以为会封号。

#196 Re: 工业芯 匠芯创 » d133打开网口后,编译报错。 » 2024-05-06 11:32:52

追踪SYSCFG_GMAC_RXDLY_SEL_SHIFT这个定义,发现需要AIC_SYSCFG_DRV_V10这个宏定义使能才有其定义。没找到怎么打开这个功能。

        #if AIC_DEV_GMAC0_RXDELAY
        cfg |= (AIC_DEV_GMAC0_RXDELAY << SYSCFG_GMAC_RXDLY_SEL_SHIFT);
        #endif

然后返回来,看到AIC_DEV_GMAC0_RXDELAY这个定义,是在me菜单里gmac0参数设置里配置的,默认是12,改成0后,就不执行下边那行了,可以通过编译了。

#197 工业芯 匠芯创 » d133打开网口后,编译报错。 » 2024-05-06 11:07:46

Gentlepig
回复: 9

报错如下。

bsp\artinchip\hal\syscfg\hal_syscfg.c: In function 'syscfg_gmac_init':
bsp\artinchip\hal\syscfg\hal_syscfg.c:408:42: error: 'SYSCFG_GMAC_RXDLY_SEL_SHIFT' undeclared (first use in this function); did you mean 'SYSCFG_GMAC_TXDLY_SEL_SHIFT'?
  408 |         cfg |= (AIC_DEV_GMAC0_RXDELAY << SYSCFG_GMAC_RXDLY_SEL_SHIFT);
      |                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                            CC bsp\artinchip\sys\d13x\time.c
SYSCFG_GMAC_TXDLY_SEL_SHIFT
bsp\artinchip\hal\syscfg\hal_syscfg.c:408:42: note: each undeclared identifier is reported only once for each function it appears in
  CC bsp\artinchip\sys\d13x\trap_c.c
scons: *** [output\d13x_cbs-nor_rt-thread_can2eth\bsp\artinchip\hal\syscfg\hal_syscfg.o] Error 1
scons: building terminated because of errors.

之前遇到过这个问题,忘了是怎么解决的了,好像是自己加了个这个定义。
今天更新到1.0.4后,再次编译,又遇到这个错误了。
请教,该如何解决?

#198 Re: 工业芯 匠芯创 » 5款Linux桌面环境推荐,你最爱哪个? » 2024-04-29 16:34:54

感觉楼主是机器人自动发帖。
搜了下楼主发的帖子,有几个明显是复制粘贴过来,原帖可能有图片,就只把文字复制过来了。

现在这个帖子,在厂家版块发了个不知所以的灌水贴。

#199 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机io检测按键输入,电路上如何设计,使可以检测是否接上按键? » 2024-04-27 17:28:06

4610 说:

@Gentlepig
就是说用常闭按键 开机时做个自检 按键状态不对(已触发)就当没接

明白了,感谢。就是只在上电时进行一次设备在线判断。

#200 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机io检测按键输入,电路上如何设计,使可以检测是否接上按键? » 2024-04-27 13:48:49

海石生风 说:

单个开关要识别两类状态:连接器插拔状态和开关的电平状态。可以使用带插拔识别的连接器,如3脚的DC连接器,其插头插入时会将其内部的弹片顶开从而可以在电路上产生电平信号。

多了个插拔识别而已,正常需求。

那就和楼上的4016朋友的方法1差不多了,单片机需要用2个io口来检测一个开关。

目前用的方法2,接不同电阻来进行ad检测。但是,这样的话,外接的开关设备相当于一个定制件了。

#201 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机io检测按键输入,电路上如何设计,使可以检测是否接上按键? » 2024-04-27 09:28:59

4610 说:

1、开关换单刀双掷 NCNO分别接两个IO
2、开关换单刀双掷 NCNO接不同电阻 AD检测
3、开关用NC 上电状态未触发视为未外接开关

感谢,1和2能看懂,确实是个办法。
3没看懂,能否再细讲一下?


我发这个帖子,一方面是想求个解决方案。
另一方面,我认为这个需求不合理、不现实,想听听大家的看法。

#203 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机io检测按键输入,电路上如何设计,使可以检测是否接上按键? » 2024-04-25 17:01:51

Gentlepig
回复: 7

单片机板有若干个输入输出口,输入接24V高低信号。本来是想用光耦将24V高低信号转成单片机io口电压接到单片机上。

可客户提出需求,想要板子能够检测到是否接了开关设备。即,板子的IO口需要有三个状态:未外接开关、开关弹起、开关按下。

这如何实现好呢?我也不理解为何会有这个需求。

#204 Re: 工业芯 匠芯创 » 有没有好用迷你的程序和gui工具推荐? » 2024-04-24 17:47:45

看awtk源码中的xml部分时,看介绍说是参考的fltk的,于是搜了下,是个小众gui。

fltk
一种使用C++开发的GUI工具包
FLTK (Fast Light Tool Kit 发音为fulltick) 是一种使用C++开发的GUI工具包,它可以应用于Unix,Linux,MS-Windows95/98/NT/2000和MacOS操作系统平台,相 对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积很小、速度比较快,且有着更好的移植性。

#205 Re: Cortex M0/M3/M4/M7 » st单片机涨价这么厉害,有什么好的替代? » 2024-04-22 08:51:46

现在stm32f103价格也便宜了。之前用的是gd32f103cb,现在又滚回到了stm32f103cb。
刚看了今天的立创价格,1000片的话,stm32f103cb:6.56, gd32f103cb:5.35。

#207 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » AWTK 开源智能串口屏方案发布 » 2024-04-12 10:35:08

awtk,awtk-mvvm,awtk-hmi,这三者是怎样的关系啊?希望有人能通俗易懂的讲解下。

我原以为awtk类似其它gui比如lvgl一样,只是实现gui的。发现awtk好像可以直接从xml读取信息然后绘制控件?

mvvm搜了下,总是搞不清楚,说是分三个部分model, view, viewmodel。view可以是从xml描述的控件信息,model是啥来着,数据模型?没明白,而viewmodel是自动生成的。mvvm就是自动绑定view和model的关系?这么理解?

awtk-hmi,是根据mvvm实现的一种特例?

#209 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » win下尝试编译awtk,执行scons后报错提示cjson.c文件里找不到string.h头文件。 » 2024-04-10 14:37:05

Gentlepig
回复: 1

Windows
请先安装 python(64 位系统要安装 64 位版本的 python),scons 和 Visual Studio C++(版本 >=2017)

如果没有安装 pywin32,请 pip 安装:

pip install pywin32
如果没有安装nodejs,请到 nodejs下载并安装。

编译运行 (在命令行模式下,进入 awtk 所在的目录,并运行下列命令):

scons
bin\demoui

---------------------------------

以上是readme里的,已安装了vsc++。

3rd\cjson\cJSON.c(40): fatal error C1083: 无法打开包括文件: “string.h”: No such file or directory

#210 Re: Cortex M0/M3/M4/M7 » 单片机作为Modbus主设备定时发送固定数据,不做设备返回数据判断的话,发送和返回会不会冲突? » 2024-03-29 09:17:28

测试了下,给modbus从设备发送命令到返回数据,大概时30ms左右。那么我现在发送间隔设为50ms,发送12帧,大概600ms多,在1秒内可以发完。

#211 Re: Cortex M0/M3/M4/M7 » 单片机作为Modbus主设备定时发送固定数据,不做设备返回数据判断的话,发送和返回会不会冲突? » 2024-03-28 11:41:33

marcus 说:

既然做主设备那么就不用考虑总线冲突的问题。因为总线数据通讯是由主设备决定的。
不判断从设备回传,那么假设一个回传延时就好了,在这段时间之后再发第二个数据包。

主要是这个回传时间不确定,我板子和pc上的ModbusSlave工具通信,通过串口监控软件监控。
发送时间间隔一开始设置10ms,发现有些就返回就没看到。
设置100ms间隔吧,我想每1s秒执行一遍modbus发送,但是有20多帧,100ms间隔就超了。

#212 Re: Cortex M0/M3/M4/M7 » 单片机作为Modbus主设备定时发送固定数据,不做设备返回数据判断的话,发送和返回会不会冲突? » 2024-03-28 08:48:56

@海石生风
用的是rs485,一直是用一个单片机io口管脚控制/rd和de管脚的,没法实现同时发送和接收...

我还是想想办法,发送后就等待串口接收吧,或者等到超时。

#213 Cortex M0/M3/M4/M7 » 单片机作为Modbus主设备定时发送固定数据,不做设备返回数据判断的话,发送和返回会不会冲突? » 2024-03-27 17:10:54

Gentlepig
回复: 9

单片机裸机编程,作为modbus主设备,每秒发送十多帧固定数据。原设想发送间隔固定几毫秒,不做从设备返回数据的接收判断。
现在想了想,这样的话,发送下一帧数据时,可能正好从设备响应上一帧数据正好也要发送数据,这样就冲突了吧?

#214 Re: 工业芯 匠芯创 » D12x QFN68 官方开发板参考设计资料 » 2024-03-27 08:52:45

好东西,感谢分享。
---------------------------
D122BBV-REF-V1-0 参考设计.zip
这个是不是上传错了?我打开allegro格式的和pads格式的,都是个只刚开始布局的图,没有走线。
---------------------------006AAB42761455D6070C431C1F304EC8.png

#215 Re: 全志 SOC » T113-S3如何将自己制作的动态库打包进镜像里的usr/lib目录下 » 2024-03-26 14:17:55

我也是将qt库放在这个目录下,结果是大部分qt库文件可以打包进去,但总是有几个进不去。

#216 Re: Cortex M0/M3/M4/M7 » 许久没来水个帖,瑞萨RA8D1超频到720MHz,CoreMark跑出4000分 » 2024-03-22 09:25:16

这个相较于现在见到比较常见的rsicv e907核的单片机,怎么样啊?

#218 工业芯 匠芯创 » d133的rtp如何配置? » 2024-03-20 08:51:38

Gentlepig
回复: 5

参考官方原理图画的板子,用的rtp,目前测量rtp四线,1-3间电阻值约为683欧,2-4间电阻约为210欧。宽边出线。
按如下设置。

  ┌──────────────────────────────────────────── RTP touch panel options ────────────────────────────────────────────┐
  │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty submenus ----).  Highlighted letters    │
  │  are hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?>    │
  │  for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable                  │
  │                                                                                                                 │
  │ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
  │ │                   [*] Using touch panel RTP                                                                 │ │
  │ │                   (15)  The sample period of RTP(in cycle mode)                                             │ │
  │ │                   (3800) The pressure threshold of RTP                                                      │ │
  │ │                   (683) The x-plate value of RTP touchscreen                                                │ │
  │ │                   (210) The Y-plate value of RTP touchscreen                                                │ │
  │ │                   (0xffff) The press detect enable debounce                                                 │ │
  │ │                   (0x4f00004f) The precharge delay of RTP                                                   │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │
  ├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
  │                            <Select>    < Exit >    < Help >    < Save >    < Load >                             │
  └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

按这个配置来,校准后,任意画线只能在屏幕对角线上出现点。
如果AIC_RTP_Y_PLATE值设为0的话,在屏幕画线的画,屏幕上的点就会很分散,类似满天星。
另,AIC_RTP_MAX_PRESSURE值该如何选取?

#219 Re: 工业芯 匠芯创 » 就很抽象,所有询问匠心扣扣群的帖子都没了 » 2024-03-19 13:32:56

估计是网站不让发布群号码。不过官方的和非官方的都已经创建了,非官方的能通过关键字搜到的。

#220 Re: 全志 SOC » 【讨论】开发基于T113-S3的网关 » 2024-03-18 16:00:57

会不会是芯片底部的gnd接触不好?
可以考虑拍个照片贴出来。

#222 Re: 全志 SOC » D1s 用新买的SPI FLASH W25N01GVZEIG 烧录失败,换一片又可以 » 2024-03-11 10:00:33

我用d133+rt-thread烧录spi nor flash也遇到过问题,你这个是spi nand,可能不一样。
我当时用usb烧录了几次程序后,忽然发现烧录时间变的很快,之前可能40多秒烧录完成,变成了3秒烧录完。然后程序其实还是上一回烧录的程序,本次烧录实际没成功。后来通过sf发现,可以查看spi nor flash的状态寄存器,发现不为0。我对比了下另一块正常的板,该寄存器值为0x00。通过sf status 0 0x00,可以将状态寄存器清零。然后就正常了。这个问题出现过几次,一直没搞懂原因。

#223 Re: 工业芯 匠芯创 » tcp client连接tcp sever,当tcp sever关闭后,tcp client仍能发送成功? » 2024-03-09 15:01:10

海石生风 说:

socket有好多配置项(block/non-block/keep-alive等),API函数也有flags,说了一大堆也不见代码是什么鸟样。一般人都懒得给你猜……

"Talk is cheap. Show me the fcking code!" —— Linus Torvalds

感谢,tcp client设置了keepalive后,如果server主动断开,过一会client会自动判断为断开了。
哈,问题已解决。折腾了我好几天。

#224 Re: 工业芯 匠芯创 » tcp client连接tcp sever,当tcp sever关闭后,tcp client仍能发送成功? » 2024-03-09 11:05:39

https://blog.csdn.net/awangdea99/article/details/107227193

服务端使用tcplistener接收连接请求。客户端使用tcpclient.connect主动连接。

在一对一的情况下(1个服务端只连接1个客户端时),服务端调用client.Close()主动关闭连接后,客户端接收函数(revString = br.ReadString();)立马报异常,因此可通过捕获此异常来进行重连操作。

但是,当一对多的情况下(1个服务端同时连接多个客户端),服务端对所有的client调用client.Close()主动关闭连接后,经常有少数(一般是一个)客户端无法捕获上面的异常,因此就无法通过捕获异常来重连。

为了解决上述问题,我试了网上很多方法,都不能解决此问题:

这是通病吗?

#225 Re: 工业芯 匠芯创 » tcp client连接tcp sever,当tcp sever关闭后,tcp client仍能发送成功? » 2024-03-09 09:36:37

现在感觉是我对tcp的连接/断开理解不正确。

尝试只用一个板子当作tcp client连接pc的tcp server,建立tcp连接后,pc端断开tcp server或直接关掉tcp server软件,板子作为tcp client的send()函数,都能返回-1,这和预想的一样。试验了很多次,都是这个结果。

但是当用两个板子都作为tcp client去连接pc的tcp server时,断开tcp server,两个板子的send()函数,至少有一个能返回-1。有时候两个都返回-1,有时候一个返回-1,另一个仍然返回发送的数据长度。

感觉tcp server端,不能保证和所有的tcp client实现完整的断开操作。

那么,tcp client端,就适合用send()返回值来判断tcp的连接状态。
还有其他办法来判断tcp连接状态吗?tcp client这里,我需要判断tcp连接状态退出tcp while循环,进行下一次重连操作。

#226 Re: 工业芯 匠芯创 » tcp client连接tcp sever,当tcp sever关闭后,tcp client仍能发送成功? » 2024-03-08 13:58:08

list_sem看到的信号量列表里,sem加数字的这4个信号量,应该都是lwip建立的。但是不知道对应的哪几个。

src/api/tcpip.c:485:  err_t err = sys_sem_new(&call->sem, 0);
src/api/sockets.c:2026:      if (sys_sem_new(&API_SELECT_CB_VAR_REF(select_cb).sem, 0) != ERR_OK) {
src/api/sockets.c:2371:    if (sys_sem_new(&API_SELECT_CB_VAR_REF(select_cb).sem, 0) != ERR_OK) {
src/api/api_lib.c:1318:  err = sys_sem_new(API_EXPR_REF(API_VAR_REF(msg).sem), 0);
src/api/api_msg.c:752:  if (sys_sem_new(&conn->op_completed, 0) != ERR_OK) {
src/core/sys.c:139:    err_t err = sys_sem_new(&delaysem, 0);

-------------------------------------

今天试验,发现断开tcp server后,板子继续tcp send()能返回发送数据长度时,不一定有信号量阻塞tcp线程。

 /> list_sem
semaphore        v   suspend thread
---------------- --- --------------
sem126           000 1:lwip_test_exampl
sem53            000 0
sem6             000 0
sem3             000 0
can data sem     000 1:udp and tcp thre
rxSem            000 1:canRxThread
can0tl           001 0
shrx             000 0
sem0             000 1:ping_thread
qspi0_s          000 0
heap_cma         001 0
heap_sys         001 0

是这样持续了几分钟后,tcp线程才被一个信号量阻塞。

----------------------------------------------

这是sdk里网络驱动里,发送数据的底层函数:

static err_t low_level_output(struct netif *netif, struct pbuf *p)
{
    aicmac_netif_t *aic_netif = (aicmac_netif_t *)netif;
    struct pbuf *q;
    aicmac_dma_desc_t *pdesc;
    int ret = ERR_OK;
#ifndef CONFIG_MAC_ZERO_COPY_TXBUF
    u8 *buffer;
    uint16_t framelength = 0;
    uint32_t bufferoffset = 0;
    uint32_t byteslefttocopy = 0;
    uint32_t payloadoffset = 0;
#else
    uint32_t p_cnt = 0;
    uint32_t p_type = 0;
    uint32_t empty_desc_cnt = 0;
    uint32_t index;
    uint32_t tmpreg = 0;
    uint32_t i = 0;
#endif

    pr_debug("%s\n", __func__);

    if ((netif == NULL) || (p == NULL)){
        pr_err("%s invalid parameter.\n", __func__);
        return ERR_MEM;
    }

    aicos_mutex_take(eth_tx_mutex, AICOS_WAIT_FOREVER);

    pdesc = dctl[aic_netif->port].tx_desc_p;
    /* before read: invalid cache */
    aicmac_dcache_invalid((uintptr_t)pdesc, sizeof(aicmac_dma_desc_t));

#ifndef CONFIG_MAC_ZERO_COPY_TXBUF
    buffer = (u8 *)(unsigned long)(pdesc->buff1_addr);
    bufferoffset = 0;

    for (q = p; q != NULL; q = q->next) {
        if ((pdesc->control & ETH_DMATxDesc_OWN) != (u32)RESET) {
            pr_err("%s no enough desc for transmit.(len = %u)\n", __func__, q->len);
            ret = ERR_MEM;
            goto error;
        }

        /* Get bytes in current lwIP buffer  */
        byteslefttocopy = q->len;
        payloadoffset = 0;

        /* Check if the length of data to copy is bigger than Tx buffer size*/
        while ((byteslefttocopy + bufferoffset) > ETH_TX_BUF_SIZE) {
            /* Copy data to Tx buffer*/
            memcpy((u8_t *)((u8_t *)buffer + bufferoffset),
                   (u8_t *)((u8_t *)q->payload + payloadoffset),
                   (ETH_TX_BUF_SIZE - bufferoffset));
            /* after write: flush cache */
            aicmac_dcache_clean((uintptr_t)((u8_t *)buffer + bufferoffset),
                                (ETH_TX_BUF_SIZE - bufferoffset));

            /* Point to next descriptor */
            pdesc = (aicmac_dma_desc_t *)(unsigned long)(pdesc->buff2_addr);
            /* before read: invalid cache */
            aicmac_dcache_invalid((uintptr_t)pdesc, sizeof(aicmac_dma_desc_t));

            /* Check if the buffer is available */
            if ((pdesc->control & ETH_DMATxDesc_OWN) != (u32)RESET) {
                pr_err("%s no enough desc for transmit.(len = %u)\n", __func__, q->len);
                ret = ERR_MEM;
                goto error;
            }

            buffer = (u8 *)(unsigned long)(pdesc->buff1_addr);

            byteslefttocopy = byteslefttocopy - (ETH_TX_BUF_SIZE - bufferoffset);
            payloadoffset = payloadoffset + (ETH_TX_BUF_SIZE - bufferoffset);
            framelength = framelength + (ETH_TX_BUF_SIZE - bufferoffset);
            bufferoffset = 0;
        }

        /* Copy the remaining bytes */
        memcpy((u8_t *)((u8_t *)buffer + bufferoffset),
               (u8_t *)((u8_t *)q->payload + payloadoffset), byteslefttocopy);
        /* after write: flush cache */
        aicmac_dcache_clean((uintptr_t)((u8_t *)buffer + bufferoffset),
                            byteslefttocopy);
        bufferoffset = bufferoffset + byteslefttocopy;
        framelength = framelength + byteslefttocopy;
    }

    /* Prepare transmit descriptors to give to DMA*/
    aicmac_submit_tx_frame(aic_netif->port, framelength);
#else
    /* Count number of pbufs in a chain */
    q = p;
    while (q != NULL) {
        if (q->len > ETH_DMATxDesc_TBS1){
            pr_err("%s too large pbuf.(len = %d)\n", __func__, q->len);
            ret = ERR_MEM;
            goto error;
        }
        p_cnt++;
        q = q->next;
    }

    /* Scan empty descriptor for DMA tx */
    while (((pdesc->control & ETH_DMATxDesc_OWN) == (uint32_t)RESET) &&
           (empty_desc_cnt < ETH_RXBUFNB)) {

        empty_desc_cnt++;
        if (empty_desc_cnt >= p_cnt)
            break;

        /* Point to next descriptor */
        pdesc = (aicmac_dma_desc_t *)(unsigned long)(pdesc->buff2_addr);
        if (pdesc == dctl[aic_netif->port].tx_desc_unconfirm_p){
            pr_info("%s don't overwrite unconfirm area.\n", __func__);
            break;
        }

        /* before read: invalid cache */
        aicmac_dcache_invalid((uintptr_t)pdesc, sizeof(aicmac_dma_desc_t));
    }

    if (p_cnt > empty_desc_cnt){
        pr_err("%s no enough desc for transmit pbuf.(pbuf_cnt = %d, empty_desc = %d)\n",
                __func__, p_cnt, empty_desc_cnt);
        ret = ERR_MEM;
        goto error;
    }

    pbuf_ref(p);
    q = p;
    p_type = p->type_internal;
    for(i=0; i<p_cnt; i++){
        index = pdesc->reserved1;
        if (index >= ETH_RXBUFNB){
            pr_err("%s get dma desc index err.\n", __func__);
            pbuf_free(p);
            ret = ERR_MEM;
            goto error;
        }

        if (i == (p_cnt-1)){
            dctl[aic_netif->port].tx_buff[index] = p;
        }else{
            dctl[aic_netif->port].tx_buff[index] = NULL;
        }

        /* flush data cache */
        if (p_type == PBUF_POOL){
            aicmac_dcache_clean((uintptr_t)q->payload, q->len);
        }else{
            aicos_dcache_clean_range((unsigned long *)q->payload, q->len);
        }

        /* Set Buffer1 address pointer */
        pdesc->buff1_addr =
            (uint32_t)(unsigned long)(q->payload);
        /* Set frame size */
        pdesc->buff_size = (q->len & ETH_DMATxDesc_TBS1);
        /* after write: flush cache */
        aicmac_dcache_clean((uintptr_t)&pdesc->buff_size, 2*sizeof(uint32_t));

        /*set LAST and FIRST segment */
        tmpreg =  ETH_DMATxDesc_TCH;
        if (i == 0)
            tmpreg |= ETH_DMATxDesc_FS;
        if (i == (p_cnt-1))
            tmpreg |= ETH_DMATxDesc_LS | ETH_DMATxDesc_IC;
        /* TCP/IP Tx Checksum Insertion */
        if (mac_config[aic_netif->port].coe_tx)
            tmpreg |= ETH_DMATxDesc_CIC_TCPUDPICMP_Full;
        /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
        tmpreg |= ETH_DMATxDesc_OWN;
        pdesc->control = tmpreg;
        /* after write: flush cache */
        aicmac_dcache_clean((uintptr_t)&pdesc->control, sizeof(uint32_t));

        /* Point to next descriptor */
        pdesc = (aicmac_dma_desc_t *)(unsigned long)(pdesc->buff2_addr);
        q = q->next;
    }

    dctl[aic_netif->port].tx_desc_p = pdesc;

    /* Resume DMA transmission */
    aicmac_resume_dma_tx(aic_netif->port);
#endif

error:
    /* Give semaphore and exit */
    aicos_mutex_give(eth_tx_mutex);

    return ret;
}

看代码,用rtt+lwip,建了两个线程,eth_rx和eth_phy_poll。
大概是这样的:
eth_phy_poll线程,检查phy状态,连上或没连上。个人感觉这里指的不是socket连接状态,可能是网线是否连通。
eth_rx线程,等待网口中断发送来的信号,根据其值,判断是接收中断,还是发送完成中断。然后进行响应处理。

实在想不出,tcp socket的连接状态,由哪里判断的。

#227 Re: 工业芯 匠芯创 » tcp client连接tcp sever,当tcp sever关闭后,tcp client仍能发送成功? » 2024-03-07 14:13:03

本来两个线程,can线程和tcp线程。有时候,会发现tcp线程不再打印信息,感觉像是阻塞了。
用list_sem看,多了个sem87这个信号量,阻塞了tcp线程。但我没建这个信号量啊。

semaphore        v   suspend thread
---------------- --- --------------
sem220           000 1:lwip_test_exampl
sem87            000 1:udp and tcp thre
sem6             000 0
sem3             000 0
can data sem     042 0
rxSem            000 1:canRxThread
can0tl           001 0
shrx             000 0
sem0             000 1:ping_thread
qspi0_s          000 0
heap_cma         001 0
heap_sys         001 0

--------------------------------

https://club.rt-thread.org/ask/question/822103778869d33f.html
在rtt论坛也搜到了类似问题,但没找到解决办法。
貌似就是lwip创建了个信号量,阻塞住了创建socket的这个线程。

#228 Re: 工业芯 匠芯创 » tcp client连接tcp sever,当tcp sever关闭后,tcp client仍能发送成功? » 2024-03-07 13:46:09

海石生风 说:

有可能是tcp server的关闭流程不正确,导致操作系统内核没有将相应的tcp资源释放,此时客户端的send请求依然被操作系统响应了。

板子和pc都连到了局域网内的交换机上。为了验证这种可能性,pc上我关掉tcp server应用程序,板子串口打印tcp client仍能发送。在这种状态下,我拔掉了pc的网线。结果板子打印还是tcp client的send()还是返回发送数据的长度。

应该还是这个板子的问题。

#229 Re: 工业芯 匠芯创 » tcp client连接tcp sever,当tcp sever关闭后,tcp client仍能发送成功? » 2024-03-07 11:18:00

我现在是有两个线程,can定时采集数据,然后发送信号量,通知tcp线程进行数据发送。另还有互斥量,因为can采集数据放到了个全局结构体数组里,而tcp线程发送数据时用到这个结构体数组。

发现tcp server关闭后,板子的tcp send()仍能正常发送,我没法根据返回值判断tcp连接状态。在tcp server关闭后,板子tcp send()发送了大概5分钟以后,终端里不再打印tcp线程的打印信息了。感觉tcp线程被阻塞了。
查看can通知tcp的信号量,一直在增加。

#230 工业芯 匠芯创 » tcp client连接tcp sever,当tcp sever关闭后,tcp client仍能发送成功? » 2024-03-07 10:20:35

Gentlepig
回复: 9

我的板子当tcp client,连接pc上的tcp server。
我是用send()函数的返回值来判断tcp是否连接正常的。当返回值大于0时,这个值是发送的数据长度。
正常情况下,socket断开后,send()返回值是-1.

发现,会出现这种情况,pc端关掉tcp server软件。我的板子这里send()仍能成功,返回仍是数据长度。这是为什么呢?

环境是rtt+lwip。

#231 Re: 司徒开源 » RK3588 开源掌机 16+256 » 2024-03-05 14:50:25

哇,switch-lite,真棒。
刚好看到ns模拟器群里发的消息,yuzu模拟器停更了,作者和任天堂达成和解了。
任天堂下一代主机不知道啥性能。

#232 Re: 工业芯 匠芯创 » 关于GUI工具的选型建议 » 2024-03-04 09:42:15

好奇为啥linux版本的qt支持的是4.8,这个版本有什么特殊的地方吗?
为啥不支持qt5?

#233 Re: ESP32/ESP8266 » 一周时间,制作热成像仪电路+软件调试 » 2024-03-01 16:10:06

这个强。
一周时间完成,很迅速啊。

----------------------------------

原理图里没看到热成像部分,模组是用的什么接口?

#234 Re: Cortex M0/M3/M4/M7 » 基于AT32的电流显示USBhub,终于复核成功 » 2024-02-29 09:16:08

好棒。
不过我更口水合宙那个,ui也更酷炫。

#235 Re: 全志 SOC » 开源 T113-s3 图纸 » 2024-02-27 13:54:02

安心man 说:

为啥内部的DDR给的是1v8电源,手册里面建议是1v5,确定可以吗

t113-s3和d1s,引脚一样,内存电压不一样,估计搞混了。
d1s  1.8V,    T113S3 1.5V.

#236 Re: 工业芯 匠芯创 » D133CBS全外设入门板 » 2024-02-27 10:20:20

emark402631 说:
Gentlepig 说:

楼主电阻屏调通了吗?我校准后总是不符,手画了个圆,结果在屏上却是个斜线。

我的电阻触摸还没调好,就算校准了也是偏差很大。

大概直到电阻触控总是校准不好的原因了。
我基本上是参考官方开发板原理图画的,rtp和ctp用的是同样4根线,官方板把两个接口都保留了。注意,ctp这里其实是i2c信号线,原理图里有4个4.7K的上拉电阻。感觉rtp不需要上拉。
我将这4个上拉电阻去掉了,在屏幕上画图形,不再是缩小或变形的图形了,但是位移很大,应该需要重新校准。
但是我执行test_rtp_draw -c,出现校准光标后,按下屏幕却不再有任何反应,像是卡死了一样...

我看楼主板子上也有这4个上拉电阻,可以考虑去掉试试。

------------------------------------------

最终还是没校准成功,暂时放弃rtp校准。

#237 Re: 全志 SOC » 自制T113-I 核心板一次成功开机 » 2024-02-23 17:31:26

以前在全志开发者在线,注册帐号后,就可以下在t113的sdk。后来发现不能下载了,估计要申请。

#238 Re: 工业芯 匠芯创 » D133CBS全外设入门板 » 2024-02-22 08:31:52

楼主电阻屏调通了吗?我校准后总是不符,手画了个圆,结果在屏上却是个斜线。

#239 Re: 工业芯 匠芯创 » D133CBS 使用QSPI0,烧录不了程序,有人遇到吗? » 2024-02-21 09:29:26

tangloong 说:

@Gentlepig
我建了个群  在https://gitee.com/kasira/luban-lite 这里有,欢迎大家一起交流

搜不到,要么群号写错了,要么,群设置里,还未开启可通过搜索加群这个功能,默认是未开启的,别问我为什么。
好吧,因为我也建立一个Q群,结果搜不到,过了一两天还是搜不到,我以为人太少,把七大姑八大姨都拉进来凑了20人,通过关键词还是搜不到。后来发现需要在群设置里打开允许被搜索功能。

#240 Re: 工业芯 匠芯创 » D133CBS 使用QSPI0,烧录不了程序,有人遇到吗? » 2024-02-20 16:57:50

看到了这个提示:

The flash device manufacturer ID is 0x00, memory type ID is 0x00, capacity ID is 0x00.
Error: Check SFDP signature error. It's must be 50444653h('S' 'F' 'D' 'P').

没认出flash来吧。
不如贴下原理图,说下flash型号。

我也在调d133,交流的人少,也挺痛苦的,官方连个企鹅群都没有。

#241 Re: 工业芯 匠芯创 » 一个人调试太孤单了,终于可以卖4块D133CBS开发板了,公布一下进展,找人一起玩 » 2024-02-20 16:55:49

打算增加cjson软件包,结果pkgs --update报错,甚至执行pkgs --list也报错。
取消勾选cjson软件包,还是一样的报错。

> pkgs --list
Traceback (most recent call last):
  File "F:\MCU\ArtinChip\luban-lite\tools\env\tools\ConEmu\ConEmu\..\..\..\tools\scripts\env.py", line 126, in <module>
    main()
  File "F:\MCU\ArtinChip\luban-lite\tools\env\tools\ConEmu\ConEmu\..\..\..\tools\scripts\env.py", line 122, in main
    args.func(args)
  File "F:\MCU\ArtinChip\luban-lite\tools\env\tools\scripts\cmds\cmd_package\__init__.py", line 45, in run_env_cmd
    list_packages()
  File "F:\MCU\ArtinChip\luban-lite\tools\env\tools\scripts\cmds\cmd_package\cmd_package_list.py", line 59, in list_packages
    pkg_path = pkg['path']
KeyError: 'path'

看了下,是littlefs相关。是去env目录下找这个目录了,而实际目录是在sdk根目录下的/packages/third-party目录下。

请教下,这个问题该如何解决?

另,还是想找个linux下的烧录工具,不想在win下办公了。

#242 Xilinx/Altera/FPGA/CPLD/Verilog » FPGA为什么这么贵?相较于MCU或MPU。 » 2024-02-19 08:45:16

Gentlepig
回复: 2

没怎么接触过fpga,看到了周立功的M7015,核心板要999,底板要799.
就拿核心板来说吧,核心板大约是性能相似配置相似的MPU核心板的几倍。
为什么这么贵呢?贵在哪里?
FPGA应用主要应用在哪些场合呢?

#243 Re: 全志 SOC » 求指导,T113-S3 tinasdk如何配置板子启动后以太网自动启动和获取Ip » 2024-02-06 08:53:26

@海石生风

感谢,不过想知道具体怎么用?
S20network start?
S20network static?

是在哪里调用?
开机时会自动执行/etc/init.d/里的K和S开头的脚本吧,但是这个脚本里有多条命令,什么情况下执行的是start?什么情况下执行的是static?

#244 Re: 工业芯 匠芯创 » 请问有D13X的usermanual吗? » 2024-02-05 13:33:24

gitee上有个d13x-doc,下载下来是网页文件,也能看。

#245 Re: 全志 SOC » 求指导,T113-S3 tinasdk如何配置板子启动后以太网自动启动和获取Ip » 2024-02-05 09:55:57

我是在/etc/profile 最后面加了句udhcpc &
不过貌似不应该加在这里,应该加载rc/Sxx里,但是我没看明白怎么加。

#246 Re: 工业芯 匠芯创 » 入坑D133 » 2024-02-02 08:50:59

sjshe3326 说:

@Gentlepig
一条斜线问题 我开始也遇到了,是x y 坐标反了造成的。我在rtp里面把 xy交换就可以了

是指x-plate值吗?我搜了下,说是电阻屏x方向上的电阻值。文档里给了个800*480电阻屏的这两个值,235、902,我试过并对换过这两个值,都没成功。
好一点的时候,是在屏幕上画个大圆,屏幕上隐约能显示出个极小的类似圆的轨迹点。

  ┌──────────────────────────────────────────── RTP touch panel options ────────────────────────────────────────────┐
  │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty submenus ----).  Highlighted letters    │
  │  are hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?>    │
  │  for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable                  │
  │                                                                                                                 │
  │ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
  │ │                   [*] Using touch panel RTP                                                                 │ │
  │ │                   (15)  The sample period of RTP(in cycle mode)                                             │ │
  │ │                   (800) The pressure threshold of RTP                                                       │ │
  │ │                   (235) The x-plate value of RTP touchscreen                                                │ │
  │ │                   (0)   The Y-plate value of RTP touchscreen                                                │ │
  │ │                   (0xffffffff) The press detect enable debounce                                             │ │
  │ │                   (0x4f00004f) The precharge delay of RTP                                                   │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │
  ├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
  │                            <Select>    < Exit >    < Help >    < Save >    < Load >                             │
  └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

#247 Re: 工业芯 匠芯创 » 入坑D133 » 2024-02-01 10:21:05

又遇到了两个问题。

连接网络后,ping局域网地址成功,ping域名失败,打开了dns功能,同样失败。这是为什么呢?

  │ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
  │ │                   --- LwIP: light weight TCP/IP stack                                                       │ │
  │ │                         lwIP version (lwIP v2.1.3)  --->                                                    │ │
  │ │                   [ ]   IPV6 protocol                                                                       │ │
  │ │                   [*]   LwIP Examples                                                                       │ │
  │ │                   [ ]   IGMP protocol                                                                       │ │
  │ │                   -*-   ICMP protocol                                                                       │ │
  │ │                   [ ]   SNMP protocol                                                                       │ │
  │ │                   [*]   Enble DNS for name resolution                                                       │ │
  │ │                   [*]   Enable alloc ip address through DHCP                                                │ │
  │ │                   (1)     SOF broadcast                                                                     │ │
  │ │                   (1)     SOF broadcast recv                                                                │ │
  │ │                   -*-   UDP protocol                                                                        │ │
  │ │                   [*]   TCP protocol                                                                        │ │
  │ └───────────────────↓(+)──────────────────────────────────────────────────────────────────────────────────────┘ │
aic /> ping www.baidu.com
Ping request could not find host www.baidu.com. Please check the name and try again
aic />

luban-lite sdk, 在ubuntu下,执行了tools/onestep.sh命令,有个ab的命令,可以直接增加个自定义的配置。
在win下,用了win_env.bat,无法执行tools/onestep.sh命令,也没有ab这个命令了,如何新增自定义配置呢?

---------------------------------

win下试了git bash,可以运行onestep.sh然后ab新增个配置。

----------------------------------

win_env.bat环境里,用scons -h可以查看更多命令,里面又--addboard命令。

-----------------------------------

用scons --add-board命令遇到了个坑,之前sdk有个这样的目录:
luban-lite\application\os\helloworld
更新又,这里变成了:
luban-lite\application\rt-thread\helloworld
luban-lite\application\freertos\helloworld
tools/scripts/aic_build.py里有个命令复制应用文件目录,就报错找不到之前的os目录。修改该.py文件,将app_os由'os'改为'rt-thread',就能正常添加自定义配置了。

----------------------------------

新增了个自定义配置后,同时打开lvgl例程和lwip例程,结果下载到板子上跳不到app。

Pre-Boot Program ... (24-01-26 17:26 a87e5e1 dirty)
SPINOR
cs=0, phase=2
cs=1, phase=1
Psram_init done.
goto run SPL

tinySPL [Built on Feb  1 2024 07:52:04]
[W] usbh_get_connect_id()107 usb 0 port change wait failed.
[E] main()133 Not find udisk.
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
qspi0 freq ( bus ): 100000000Hz
Selecting default config 'Luban-lite firmware'
spl read: 750332 byte, 15396 us -> 47592 KB/s
 151172 : Run APP

关掉lvgl例程后,lwip例程才正常。
这是ram不够?或flash不够?编译时,没注意到有什么 提示。

#249 Re: 工业芯 匠芯创 » 淘宝有D121了 有人用了么 » 2024-01-31 14:24:47

tangloong 说:

D121bav d121bbv

晕,我糊涂了。
d12x, d13x,我记错了...

我的d133板子调试遇到了问题,给点建议吧,不知道怎么搞了。
rtp屏幕校准后,画线没有跟手指。
网口部分,总是ping不通pc。

aic /> ping 192.168.1.69
aic /> ip4_output_if: ai0
IP header:
+-------------------------------+
| 4 | 5 |  0x00 |        60     | (v, hl, tos, len)
+-------------------------------+
|        0      |000|       0   | (id, flags, offset)
+-------------------------------+
|  255  |    1  |    0x3763     | (ttl, proto, chksum)
+-------------------------------+
|  192  |  168  |    1  |  200  | (src)
+-------------------------------+
|  192  |  168  |    1  |   69  | (dest)
+-------------------------------+
ip4_output_if: call netif->output()
[D] low_level_output()191 low_level_output
[D] low_level_output()191 low_level_output
Request timed out

---------------------------------

网口问题解决了,ping通了。
问题比较低级,rtl8201的rxdv管脚,是选焊拉高或拉低,我这里两个都焊接了,结果没配置成rmii模式。

#250 Re: 工业芯 匠芯创 » 淘宝有D121了 有人用了么 » 2024-01-31 10:27:42

d112吧?
gitee上的sdk也更新了,添加了d112的。

d112  68pin;
d113  88pin;
d21x  100pin。

目前感觉是这样的...

#251 Re: 工业芯 匠芯创 » D133CBS全外设入门板 » 2024-01-31 09:43:24

d133的rgb支持整组调换的,可以搞成bgr顺序。

#252 Re: 工业芯 匠芯创 » 入坑D133 » 2024-01-30 09:59:12

test_rtp.c里,打开rtp这里,从中断方式改成轮询方式,就可以正常运行校准程序了。

        // ret = rt_device_open(g_rtp_dev, RT_DEVICE_FLAG_INT_RX);
        ret = rt_device_open(g_rtp_dev, RT_DEVICE_FLAG_RDONLY);

但是还有问题,较准时,会有这么个提示:

The RTP parameter (press detect enable debounce) is inaccurate

我将滤波时间改小了,可以完成校准设置,但是执行test_rtp_draw -d,画线时,屏幕上只在一条斜线上描点。
设置还是有问题。

-----------------------------------------

看test_rtp.c程序,应该是按中断方式设计的,设置中断回调函数。就是不知道为什么我这里设置为中断方式,总是卡死。
没看到要开adc中断啥的...

-----------------------------------------

rt-thread设置里,device driver里,使能touce device driver,并且,不要使能touch irq use pin irq。这样,编译后,test_rtp.c的device_open就正常了。

但是校准完,有个文件打不开的提示,而且,校准完画线,还是只在一条斜线上显示。

aic /> test_rtp_draw -c
[I] rtp_get_fb_info()98 Screen width: 800, height: 480
g_opened aic-rtp device
rtp calibrate start.
Top left : X =   50 Y =   50
01-01 08:00:56 I/RTP: PDEB should be configured as 0xff57ff57

Calibration: X = 463, Y = 320
Top right : X =  750 Y =   50
01-01 08:00:58 I/RTP: PDEB should be configured as 0xff57ff57

Calibration: X = 446, Y = 91
Bot right : X =  750 Y =  430
01-01 08:00:59 I/RTP: PDEB should be configured as 0xff57ff57

Calibration: X = 92, Y = 26
Bot left : X =   50 Y =  430
01-01 08:01:00 I/RTP: PDEB should be configured as 0xff57ff57

Calibration: X = 47, Y = 226
Center : X =  400 Y =  240
01-01 08:01:01 I/RTP: PDEB should be configured as 0xff57ff57

Calibration: X = 259, Y = 196
open file failed!
aic /> Try to read 1000 points from RTP ...
01-01 08:01:02 I/RTP: PDEB should be configured as 0xff57ff57

#253 Re: 工业芯 匠芯创 » 入坑D133 » 2024-01-29 11:32:21

sjshe3326 说:

@Gentlepig
另外要看下 好像官方SDK默认是LVDS还是mipi 没有把RGB管脚全部配成RGB模式功能 需要自己加一下

屏幕点亮了。
spi flash的问题,通过将spi flash的状态寄存器清零也解决了。

rtp触摸屏没搞定,同事运行test_rtp_draw和lvgl程序,界面会闪。
然后关掉lvgl,调用test_rtp_draw -c,出现类似ts_calibrate的界面,有个小光标,但是点击没反应,调试口貌似也卡住了。

aic /> test_rtp_draw
Usage: test_rtp_draw [options]
         -c, --calibrate        Platform the screen calibration
         -p, --points           Set the points for drawing, defalut is 1000
         -d, --draw             Draw the shape
         -h, --help

Example: test_rtp_draw -c
aic /> test_rtp_draw -h
[I] rtp_get_fb_info()98 Screen width: 800, height: 480

运行rtp_status应该是正常:

aic /> rtp_status
In RTP controller V1.00:
Mode hw 2/ sw 2, RTP enale 1, Press detect enable 1
Pressure enable 1, max 800, x-plate 235, y-plate 902
Sample period: 15 ms, Fuzz: 0
aic />

-----------------------------------------

应该是rtp设备打开这里出了问题,一直卡在这里。

    if (!g_opened) {
        ret = rt_device_open(g_rtp_dev, RT_DEVICE_FLAG_INT_RX);
        if (ret != RT_EOK) {
            rt_kprintf("Failed to open %s device\n", AIC_RTP_NAME);
            return;
        }
        g_opened = 1;
        rt_kprintf("g_opened %s device\n", AIC_RTP_NAME);
    }

用list_devices命令,可以看到有aic_rtp设备的,不知道为什么会卡在rt_device_open(aic_rtp, xxx)这里。
而且,虽然卡在这里了,我在后面添加的rt_kprint语句,都不能打印出来,但是屏幕绘制还是能执行的,挺奇怪的,屏幕绘制十字光标或栅格,都是在这个rt_device_open()语句后边才开始调用的。

#254 Re: 工业芯 匠芯创 » 入坑D133 » 2024-01-27 16:51:10

发现昆仑派这个板子用的是rgb接口,就编译了这个配置,下载倒板子上,屏幕有图像,就是乱的。找商家要了屏幕的资料,确定了front-porch, back-porch, sync_len这些参数,修改menuconfig里de选项的分辨率以及这些参数。屏幕显示正常了。

这里好奇,为什么之前用tina linux,uboot及内核设备树里的这些参数,和我从厂家要的都不一样,但是却能正常驱动这个屏幕?

我又按这些参数,修改nor-rtt这个配置,结果编译后,屏幕还是没有输出,rgb的clk也没信号。
我试过将昆仑派的配置参数,复制到nor-rtt这个配置里,结果问题依旧。

-------------------------------------------------

对比了下target目录下的两个配置目录下的pinmux.c文件。发现nor-rtt这边没有AIC_PRGB_16BIT_LD这个宏定义,另一边多出来些引脚配置。这些,看样子是需要自己添加了。

target目录下,分几个子目录,其实是两种,一种是官方299的那个开发板,另一个就是139的昆仑派。
299板子有lvds接口,没rgb接口,故除了target/kunlun88-nor这个目录下的pinmux.c里有rgb引脚配置,其他几个目录下的pinmux.c没有rgb引脚配置。即使在menuconfie里配置了rgb功能,而因为实际上没有初始化rgb引脚,故屏幕始终点不亮。

另今天lubanlite更新了,有了68脚的配置了,还有d12x的配置。
看了target目录下68脚的pinmux.c,里边还是比较全的,rgb24bit,rgb16bit都有。而d13x的还是之前那样...

#255 Re: 工业芯 匠芯创 » 烧录失败问题 » 2024-01-26 16:31:28

示波器测量spi的cs管脚,发现一直有波形,而另一块板子,spc_cs一直是高电平的。
之前下载的是nor_xip程序?

------------------------------------

发现另一块可以正常烧录程序的板子,spi flash状态寄存器是:0x00

aic /> sf probe qspi01
01-01 08:01:09 I/SFUD: Flash ID: 0xef4018
01-01 08:01:09 I/SFUD: Find a Winbond flash chip. Size is 16777216 bytes.
01-01 08:01:09 I/SFUD: sf_cmd flash device is initialize success.
01-01 08:01:09 I/SFUD: Probe SPI flash sf_cmd by SPI device qspi01 success.
16 MB sf_cmd is current selected device.
aic /> sf status
The sf_cmd flash status register current value is 0x00.
aic />

通过sf status 0 0这个命令,将问题板的spi flash状态寄存器也修改为0x00,就可以继续烧录了。
问题原因不明,rtt环境下可以通过这个方法解决。裸机环境下就不知道怎么解决了。

#256 Re: 工业芯 匠芯创 » 烧录失败问题 » 2024-01-26 15:09:24

既然这个板子无法烧录成功,就打算用rtt的sf命令擦除flash。结果没成功:

aic /> sf bench yes
Erasing the sf_cmd 16777216 bytes data, waiting...
Erase benchmark success, total time: 0.000S.
Writing the sf_cmd 16777216 bytes data, waiting...
Write benchmark success, total time: 5.279S.
Reading the sf_cmd 16777216 bytes data, waiting...
Data check ERROR! Please check you flash by other command.
Read sf_cmd failed, already rd for 0 bytes, read 256 each time
Read benchmark has an error. Error code: 3.
This flash operate has an error. Error code: 3.
aic />

查看flash状态寄存器:

aic /> sf status
The sf_cmd flash status register current value is 0xFC.
aic />

查手册,倒数第二位是写保护位,目前是0,未开启写保护。

通过sf read可以读flash内容:

Read the sf_cmd flash data success. Start from 0x00000000, size is 1000. The data is:
Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
[00000000] 41 49 43 20 45 3C 01 11 01 00 01 00 10 3B 00 00 AIC E<.......;..
[00000010] 00 00 00 00 00 00 00 00 00 00 10 30 00 01 10 30 ...........0...0
[00000020] 00 00 00 00 00 00 00 00 00 3B 00 00 10 00 00 00 .........;......
[00000030] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[00000040] C0 39 00 00 B0 00 00 00 00 01 00 00 B0 38 00 00 .9...........8..
[00000050] 00 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .<..............
[00000060] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[00000070] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[00000080] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[00000090] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[000000A0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[000000B0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[000000C0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[000000D0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[000000E0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[000000F0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[00000100] 50 42 50 20 98 D1 9D DD 97 02 00 00 93 82 82 0F PBP ............
[00000110] 23 A0 82 00 23 A2 92 00 23 A4 22 01 23 A6 32 01 #...#...#.".#.2.
[00000120] 23 A8 42 01 23 AA 52 01 23 AC 62 01 23 AE 72 01 #.B.#.R.#.b.#.r.
[00000130] 23 A0 82 03 23 A2 92 03 23 A4 A2 03 23 A6 B2 03 #...#...#...#...
[00000140] 23 A8 22 02 23 AA 12 02 23 AC A2 02 23 AE B2 02 #.".#...#...#...

通过sf write写,写0或者写0xff,再读出来,还是上边这些数据。
写不成功,但又没开启写保护,奇怪了。

---------------------------------------------------


有问题的这个板子,通过rtt的sf status命令,可以读spi flash的状态寄存器,是0xFC,而另一个正常的板子,读出来是0x00.
通过sf status 0  0 将状态寄存器也改为0x00,然后就可以正常烧录了。

这是解决办法,问题的原因不明。另,如果烧录的不是rtt版本的程序,不知道该用什么办法来解决了。

#257 Re: 工业芯 匠芯创 » 入坑D133 » 2024-01-26 13:57:41

@sjshe3326

我用的nor-flash-rtt那个,在win下是lunch 6。

找到了t113的tina sdk里的uboot和内核的设备树,看了下800*480屏幕的配置参数。因为t113-s3能点亮这个7寸屏,就参照这个了。

&lcd0 {
	lcd_used            = <1>;

	lcd_driver_name     = "default_lcd";
	lcd_if              = <0>;
	lcd_x               = <800>;
	lcd_y               = <480>;
	lcd_width           = <150>;
	lcd_height          = <94>;
	lcd_dclk_freq       = <48>;

	lcd_pwm_used        = <1>;
	lcd_pwm_ch          = <7>;
	lcd_pwm_freq        = <10000>;
	lcd_pwm_pol         = <1>;

	lcd_hbp             = <55>;
	lcd_ht              = <1240>;
	lcd_hspw            = <20>;
	lcd_vbp             = <35>;
	lcd_vt              = <650>;
	lcd_vspw            = <10>;

	lcd_lvds_if         = <0>;
	lcd_lvds_colordepth = <1>;
	lcd_lvds_mode       = <0>;
	lcd_frm             = <0>;
	lcd_io_phase        = <0x0000>;
	lcd_gamma_en        = <0>;
	lcd_bright_curve_en = <0>;
	lcd_cmap_en         = <0>;

屏幕配置这里,估计裸机和os没区别吧,目前menuconfig里这么配置:

  ┌──────────────────────────────────────── display timing of simple panel ─────────────────────────────────────────┐
  │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty submenus ----).  Highlighted letters    │
  │  are hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?>    │
  │  for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable                  │
  │                                                                                                                 │
  │ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
  │ │                   (48) pixelclock in MHZ                                                                    │ │
  │ │                   (800) hactive                                                                             │ │
  │ │                   (480) vactive                                                                             │ │
  │ │                   (55) hback-porch                                                                          │ │
  │ │                   (1240) hfront-porch                                                                       │ │
  │ │                   (20) hsync-len                                                                            │ │
  │ │                   (35) vback-porch                                                                          │ │
  │ │                   (650) vfront-porch                                                                        │ │
  │ │                   (10) vsync-len                                                                            │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │
  ├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
  │                            <Select>    < Exit >    < Help >    < Save >    < Load >                             │
  └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
  ┌───────────────────────────────────────────── RGB interface options ─────────────────────────────────────────────┐
  │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty submenus ----).  Highlighted letters    │
  │  are hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?>    │
  │  for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable                  │
  │                                                                                                                 │
  │ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
  │ │                       rgb mode (PRGB)  --->                                                                 │ │
  │ │                       interface format (PRGB 24 BIT)  --->                                                  │ │
  │ │                       data order (RGB)  --->                                                                │ │
  │ │                       clock phase select (0 degree)  --->                                                   │ │
  │ │                   [*] data mirror                                                                           │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │
  ├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
  │                            <Select>    < Exit >    < Help >    < Save >    < Load >                             │
  └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
  ┌─────────────────────────────────────────────── Display Parameter ───────────────────────────────────────────────┐
  │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty submenus ----).  Highlighted letters    │
  │  are hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?>    │
  │  for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable                  │
  │                                                                                                                 │
  │ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
  │ │                   [*] Display Support                                                                       │ │
  │ │                       select Display interface (Display RGB interface)  --->                                │ │
  │ │                       RGB interface options  --->                                                           │ │
  │ │                       select framebuffer format (rgb888)  --->                                              │ │
  │ │                   [*] Support double framebuffer                                                            │ │
  │ │                   [*] Display color block                                                                   │ │
  │ │                       framebuffer rotation degree (0)  --->                                                 │ │
  │ │                       Display Panels  --->                                                                  │ │
  │ │                       panel backlight control (gpio)  --->                                                  │ │
  │ │                   (PE.13) panel backlight enable pin                                                        │ │
  │ │                   [ ] panel backlight enable pin low active                                                 │ │
  │ │                                                                                                             │ │
  │ │                                                                                                             │ │
  │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │
  ├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
  │                            <Select>    < Exit >    < Help >    < Save >    < Load >                             │
  └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

通过示波器,测量lcd屏幕的40pin接口,各引脚均无发现变化的波形。据说clk应该有波形才对。

另,我目前更换spi flash的那块板,又出现了2秒烧录的问题了。更换回之前换下的那个spi flash,问题依旧。总不能出现了,就换个新的spi flash。
能否通过QQ请教下?我在群主的别墅群里,也在芒果的群里。

#258 Re: 工业芯 匠芯创 » 烧录失败问题 » 2024-01-26 11:55:32

之前有问题的第一块板,昨天和其他一块单片机板调换了w25q128,调换后,d133可以正常烧录了,另一块单片机板,也可以通过命令读取flash型号,可以擦除flash。
然后这块d133板,昨天又调试lcd和can功能,反复烧录了很多次。今天上午也能烧录来着,临近中午,突然不能烧录了,和之前一样,2秒下载完成,显示成功,实际未烧录进去。
因为之前换下来的那个w25q128可以在其他板子上正常工作,就把该w25q128整片擦除后,又换回到这个板子上了。结果,还是2秒烧录...

------------------------------------------

目前手头两块板,第一块板:来回换过2次w25q128,目前无法正常烧录。
1.2V纹波较大,400mV, 3.3V纹波也比较大,但是看频率没1.2V那么多尖刺。1.8V纹波很小,100mV多些。

第二块板,始终未更换过w25q128,一直可以正常烧录。
3路电压都有较大纹波,大概400mV左右,只是1.2V纹波的尖刺更频繁,1.8V和3.3V尖刺明显少很多。

两块板应该烧录的都是相同的镜像文件。

#259 Re: 工业芯 匠芯创 » 入坑D133 » 2024-01-25 15:59:17

我用的7寸800*480的40pin的rgb屏幕,没点亮,能给点指导吗?背光是亮了。
de里,选了rgb,试过rgb888,rgb565,屏幕都没图像。panel那里改成了800*480.

#260 Re: 工业芯 匠芯创 » 烧录失败问题 » 2024-01-24 15:30:30

记录一下,另一块板子,第一次烧录,用了26秒,烧录时也有上边那两个报错,看样子这两个报错不影响烧录。

[debug] Software Version: "1.3.6"
[debug] Machine Name: "DESKTOP-HQF1R40"
[debug] System Name: "Windows 10 (10.0)"
[debug] CPU Architecture: "x86_64" 

[debug] Parse the image header from "F:/MCU/ArtinChip/luban-lite/output/d13x_demo88-nor_rt-thread_helloworld/images/d13x_demo88-nor_v1.0.0.img"
[debug] Soc type: "d13x"
[debug] Board type: "demo88-nor"
[debug] Image version: "1.0.0"
[debug] Storage type: "spi-nor"
[debug] Storage ID: ""
[debug] Meta count: "5" 

[debug] Refresh the partition tree ...
[debug] Part name: image.target.spl , size: 130320 
[debug] Part name: image.target.os , size: 699868 
[debug] Part name: image.target.rodata , size: 2093056 

[debug] Current connect type: 0
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some device arrival or removed 32768

[debug] WinEvent: Some devnode changed
[debug] No device available
[debug] Current file path: "F:/MCU/ArtinChip/luban-lite/output/d13x_demo88-nor_rt-thread_helloworld/images/d13x_demo88-nor_v1.0.0.img"
[debug] Parse the image header from "F:/MCU/ArtinChip/luban-lite/output/d13x_demo88-nor_rt-thread_helloworld/images/d13x_demo88-nor_v1.0.0.img"
[debug] Soc type: "d13x"
[debug] Board type: "demo88-nor"
[debug] Image version: "1.0.0"
[debug] Storage type: "spi-nor"
[debug] Storage ID: ""
[debug] Meta count: "5" 

[debug] Refresh the partition tree ...
[debug] Part name: image.target.spl , size: 130320 
[debug] Part name: image.target.os , size: 699740 
[debug] Part name: image.target.rodata , size: 2093056 


[debug] WinEvent: Some devnode changed
[debug] There are "1" device available

[debug] Try to connect the ArtInChip device "1:3-2" ...
[debug] Try to get Usb device hd info...

[debug] WinEvent: Some devnode changed
[debug] There are "1" device available
[debug] Get Usb device hd info success
[debug] The status of ArtInChip device: true
[debug] Start burn online ...
[debug] Progress range: 0 ~ 3055616

[debug] Burn Image file "F:/MCU/ArtinChip/luban-lite/output/d13x_demo88-nor_rt-thread_helloworld/images/d13x_demo88-nor_v1.0.0.img" ... 

[debug] Meta 0 image.updater.spl , size 130320 ...
[debug] Blocksize 4 , chunk 1048576 * 0 , rest 130320
[debug] Offset: 4608 Size: 130320
[debug] Dev "1:3-2" Send the rest data 130320
[error] aicupg_trans_recv_pkt()208: CSW size 0, Pipe error(-9)
[error] aicupg_cmd_send_fwc_data_final()777: Recv resp failed, expect 16, got 0
[debug] Don't check the result of image.updater.spl

[debug] Meta 1 image.info , size 2048 ...
[error] aicupg_trans_send_pkt()80: CBW tag 0x51, size 0, Pipe error(-9)
[error] aicupg_cmd_get_hwinfo()106: Send command failed. ret = 0, siz = 16
[debug] Wait to reconnect dev "1:3-2"

[debug] WinEvent: Some devnode changed
[debug] QTime("07:28:38.930") Wait for Dev "1:3-2" ready

[debug] WinEvent: Some devnode changed

[debug] WinEvent: Some devnode changed
[warn ] Set upg work mode: 0
[debug] Blocksize 1 , chunk 1048576 * 0 , rest 2048
[debug] Offset: 0 Size: 2048
[debug] Dev "1:3-2" Send the rest data 2048

[debug] Meta 2 image.target.spl , size 130320 ...
[debug] Blocksize 2048 , chunk 1048576 * 0 , rest 130320
[debug] Offset: 135680 Size: 130320
[debug] Dev "1:3-2" Send the rest data 130320

[debug] Meta 3 image.target.os , size 699740 ...
[debug] Blocksize 2048 , chunk 1048576 * 0 , rest 699740
[debug] Offset: 266752 Size: 699740
[debug] Dev "1:3-2" Send the rest data 699740

[debug] Meta 4 image.target.rodata , size 2093056 ...
[debug] Blocksize 2048 , chunk 1048576 * 1 , rest 1044480
[debug] Offset: 967168 Size: 2093056
[debug] Dev "1:3-2" Send chunk 0 ...
[debug] Dev "1:3-2" Send the rest data 1044480
[error] aicupg_trans_send_pkt()104: CSW tag 0xaa, size 0, Pipe error(-9)
[error] aicupg_cmd_send_fwc_data_update()741: Send out data length is not expected. ret = 0
[error] Dev "1:3-2" Failed to send data 1044480
[error] Dev "1:3-2" Failed to send 1044480
[debug] Update "fail_cnt" of "2024-01-24"

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

-----------------------------------------

第一次下载的程序里,main函数里我加入了while循环里面定时打印信息,在串口可以看到。
修改了程序,把这部分注释掉,编译,再次下载,花费了38秒,显示烧录成功。
但是调试口这里,启动后,无法输入命令。

烧录信息:

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] There are "1" device available

[debug] Try to connect the ArtInChip device "1:3-2" ...
[debug] Try to get Usb device hd info...
[debug] Get Usb device hd info success
[debug] The status of ArtInChip device: true

[debug] WinEvent: Some devnode changed
[debug] There are "1" device available
[debug] Start burn online ...
[debug] Progress range: 0 ~ 3055616

[debug] Burn Image file "F:/MCU/ArtinChip/luban-lite/output/d13x_demo88-nor_rt-thread_helloworld/images/d13x_demo88-nor_v1.0.0.img" ... 

[debug] Meta 0 image.updater.spl , size 130320 ...
[debug] Blocksize 4 , chunk 1048576 * 0 , rest 130320
[debug] Offset: 4608 Size: 130320
[debug] Dev "1:3-2" Send the rest data 130320
[error] aicupg_trans_recv_pkt()208: CSW size 0, Pipe error(-9)
[error] aicupg_cmd_send_fwc_data_final()777: Recv resp failed, expect 16, got 0
[debug] Don't check the result of image.updater.spl

[debug] Meta 1 image.info , size 2048 ...
[error] aicupg_trans_send_pkt()80: CBW tag 0xfc, size 0, Pipe error(-9)
[error] aicupg_cmd_get_hwinfo()106: Send command failed. ret = 0, siz = 16
[debug] Wait to reconnect dev "1:3-2"
[debug] QTime("07:34:42.769") Wait for Dev "1:3-2" ready

[debug] WinEvent: Some devnode changed

[debug] WinEvent: Some devnode changed

[debug] WinEvent: Some devnode changed
[warn ] Set upg work mode: 0
[debug] Blocksize 1 , chunk 1048576 * 0 , rest 2048
[debug] Offset: 0 Size: 2048
[debug] Dev "1:3-2" Send the rest data 2048

[debug] Meta 2 image.target.spl , size 130320 ...
[debug] Blocksize 2048 , chunk 1048576 * 0 , rest 130320
[debug] Offset: 135680 Size: 130320
[debug] Dev "1:3-2" Send the rest data 130320

[debug] Meta 3 image.target.os , size 699804 ...
[debug] Blocksize 2048 , chunk 1048576 * 0 , rest 699804
[debug] Offset: 266752 Size: 699804
[debug] Dev "1:3-2" Send the rest data 699804

[debug] Meta 4 image.target.rodata , size 2093056 ...
[debug] Blocksize 2048 , chunk 1048576 * 1 , rest 1044480
[debug] Offset: 967168 Size: 2093056
[debug] Dev "1:3-2" Send chunk 0 ...
[debug] Dev "1:3-2" Send the rest data 1044480

[debug] Burn online successfully!
[debug] Update "success_cnt" of "2024-01-24"
[debug] Reboot the device ...

[debug] WinEvent: Some devnode changed
[debug] No device available
[error] aicupg_trans_send_pkt()104: CSW tag 0x169, size 0, Pipe error(-9)

启动信息:

Pre-Boot Program ... (2023-11-14 13:46:14)
                                          SPINOR

tinySPL [Built on Jan 24 2024 07:25:45]
[W] usbh_get_connect_id()107 usb 0 port change wait failed.
[E] main()137 Not find udisk.
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
qspi0 freq ( bus ): 100000000Hz
Selecting default config 'Luban-lite firmware'
spl read: 699248 byte, 32788 us -> 20826 KB/s
 151691 : Run APP

     _         _   ___        ___ _     _
    / \   _ __| |_|_ _|_ __  / __| |__ (_)_ __
   / _ \ | '__| __|| || '_ \| |  | '_ \| | '_ \
  / ___ \| |  | |_ | || | | | |__| | | | | |_) |
 /_/   \_\_|   \__|___|_| |_|\___|_| |_|_| .__/
                                         |_|

Welcome to ArtInChip Luban-Lite 1.0 [Built on Jan 24 2024 07:26:41]
qspi0 freq (input): 1000000Hz
qspi0 freq ( bus ): 50000000Hz
01-01 08:05:25 I/SFUD: Flash ID: 0xef4018
01-01 08:05:25 I/SFUD: Find a Winbond flash chip. Size is 16777216 bytes.
qspi0 freq (input): 1000000Hz
qspi0 freq ( bus ): 1000000Hz
01-01 08:05:25 I/SFUD: norflash0 flash device is initialize success.
01-01 08:05:25 I/SFUD: Probe SPI flash norflash0 by SPI device qspi01 success.
[I] aic_find_panel()56 find panel driver : panel-lvds
[I] aicfb_probe()809 fb0 allocated at 0x40010360
[I] hal_ge_init()320 cmd queue hal, cmdq buffer size = 2048
[I] hal_ge_init()377 dither line phys :0X040268c00
[I] hal_ge_init()385 hal_ge_init() end
[I] aic_sdmc_clk_init()543 SDMC1 sclk: 49500 KHz, parent clk 792000 KHz
01-01 08:05:25 I/SDMC: SDMC1 BW 1, sclk 49500 KHz, clk 400 KHz(399 KHz), div 2-62

[I] aic_sdmc_probe()636 SDMC1 driver loaded
01-01 08:05:25 I/WDT: ArtInChip WDT loaded
packages\third-party\littlefs\lfs.c:1210:error: Corrupted dir pair at {0x0, 0x1}
01-01 08:05:25 E/DFS: mount fs[lfs] on /data failed.

01-01 08:05:25 E/DFS: mount fs[elm] on /sdcard failed.

01-01 08:05:25 E/DFS: mount fs[elm] on /sdcard failed.

Reboot action: Warm-Reset, reason: External-Reset

Startup time: 0.366 sec
info: cmd ring buf size:1920
info: cmd ring buf size:1920
can't find device:gt911
aic /> 01-01 08:05:25 I/SDMC: SDMC1 BW 1, sclk 49500 KHz, clk 400 KHz(399 KHz), div 2-62

-----------------------------------

又反复烧录了几次,这个第二块板,均能正常烧录,烧录时间一般在38秒左右。
板子有3路dc/dc供电,boot及app配置里,均关掉了ldo1x和ldo18的输出。
usb供电,测量3.3V,1.8V, 1.1V,纹波都有点大,在400mV左右,这次画板dc/dc电路部分没处理好。

--------------------------------------

第一块板,更换两个w25q128,又可以正常烧录了,反复烧录了几个img文件,都能成功每次烧录也大都时30多秒。
不知道之前失败的原因了。
换下来的w25q128, 换到了个另一个单片机板上,可以正常擦除。

还有个问题,我用putty连的板子的调试口,如果打开putty串口的情况下,重启板子,比如reboot命令,或烧写程序,有很大机率putty串口无法输入。重新插拔usb转ttl则大概率变回可能输入的状态。而且,当插拔usb转ttl时,aiburn调试记录有信息:

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some device arrival or removed 32772

[debug] WinEvent: Some device arrival or removed 32772

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some device arrival or removed 32768

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some device arrival or removed 32768

#261 Re: 工业芯 匠芯创 » 烧录失败问题 » 2024-01-24 10:25:22

我将1.1V dc/dc的使能管脚的电阻去掉,此时dc/dc应该不工作了,测量1.1V这里,测试出1.2V电压,但是不稳定,应该是启动后按配置关闭ldo1x输出,然后反复重启。
让芯片进入boot状态,此时1.2V稳定了,那么怀疑是boot状态,默认ldo1x输出1.2V。而我的dc/dc供电是1.1V,这样上电时,dc/dc输出有1.2V电压,让dc/dc没稳定工作,造成了很大的纹波?

另,几个默认配置,都是关闭LDO1X,打开LDO18,而且LDO18配置为7,查手册,7对应是1.92V,3才是1.80V。
另,虽然LDO1X默认没打开,但是打开后,默认配置为6,6对应1.20V, 4才对应1.10V.

猜测,boot状态下,ldo1x和ldo18都是打开的,而且电压是1.20V和1.92V,都比推荐的外部供电电压值高。

----------------------------------------------------------

我将dc/dc1.1V使能,更改电阻使输出变为1.2V。结果上电后,虽然能进系统,但是示波器测量1.2V还是有很大的纹波。
烧录功能虽然显示success,但实际运行的还是之前的程序。

------------------------------------------------------

3.3V  纹波410mV
1.8V 纹波170mV
1.2V 纹波410mV

dc/dc电路布局有问题?我测量了下之前画的t113-s3板子,3路dc/dc电路输出纹波大概在130mV左右。都没这么高。
两个板子的dc/dc部分,都是用的sy8088,布局基本没变。

以上情况,是两个板子都用同一个usb供电时测得的。

#262 Re: 工业芯 匠芯创 » 烧录失败问题 » 2024-01-23 17:03:32

tangloong 说:

@Gentlepig
不知道我买的SY8088iaac 有问题还是怎么的 有两片1.8V有问题,之前3.3V 好好的,也坏掉了

均出现烧录失败的问题 都是供电导致的

你遇到的烧录失败,是烧录时就提示失败?还是烧录提示成功,运行其实还是之前程序?

我用的也是sy8088,嘉立创贴的。我这部分dc/dc电路,和其他板子上的布局差不多。其他板子都能正常运行的。
这个d133板子到手后,我也是先测量了各路电压正常后,才开始烧录程序的。

---------------------------------------

用示波器测量了下,dc/dc 1.1V纹波相当的大,是负载太重或者太轻?。目前关闭了芯片自身的ldo18和ldo1x输出。

#263 Re: 工业芯 匠芯创 » 烧录失败问题 » 2024-01-23 14:40:04

usb烧录时,会有这两个报错:

[debug] Meta 0 image.updater.spl , size 130320 ...
[debug] Blocksize 4 , chunk 1048576 * 0 , rest 130320
[debug] Offset: 4608 Size: 130320
[debug] Dev "1:3-1" Send the rest data 130320
[error] aicupg_trans_recv_pkt()208: CSW size 0, Pipe error(-9)
[error] aicupg_cmd_send_fwc_data_final()777: Recv resp failed, expect 16, got 0
[debug] Don't check the result of image.updater.spl

[debug] Meta 1 image.info , size 2048 ...
[error] aicupg_trans_send_pkt()80: CBW tag 0x654, size 0, Pipe error(-9)
[error] aicupg_cmd_get_hwinfo()106: Send command failed. ret = 0, siz = 16
[debug] Wait to reconnect dev "1:3-1"
[debug] QTime("06:35:22.073") Wait for Dev "1:3-1" ready

-------------------------------

怀疑是spi的问题。

看了下,spi0的cs,wp,hold三个管脚各接10k电阻上拉到3.3V。spi线没有走灯长,不过spi flash离d133很近,线走的不长。
我以为是spi0设置速度的问题,看了下,默认是100M最大速度,我修改成了1M最大速度,没效果。

-------------------------------

怀疑是ldo电压的问题。

又看论坛其他网友又通过配置ldo1x和ldo18解决的,看了下默认配置,默认打开ldo18(7)关闭ldo1x的。
修改为,打开ldo1x(4),打开ldo18(3),没效果。
修改为,关闭ldo1x,打开ldo18(3),没效果。
修改为,关闭ldo1x,关闭ldo18,无没效果。
我板子是有独立的dc/dc电路提供1.8V和1.1V的,基本是参考官方的那个图纸画的。

#264 Re: 工业芯 匠芯创 » 第一块D133CBS 烧录并运行成功 » 2024-01-23 13:42:52

sjshe3326 说:

@Gentlepig
我前面也遇到同样问题,换了一篇SPI FLSHA就正常了。后来使用新的下载软件,没有再出现。

软件我用的gitee上最新的1.36。
既然你遇到了,我也遇到了,说明问题还是容易出现的,换flash不是解决办法啊。
spi flash电路有问题?

-----------------------------------------------

想问下,你更换新的flash后,烧录一次需要多久时间?

#265 Re: 工业芯 匠芯创 » 烧录失败问题 » 2024-01-23 11:37:23

我也遇到了类似问题,gitee上下载的1.36,板子是d133cbs, w25q128, 编译时,lunch 4, m, lunch6, m.

第一次烧录需要39s。
现在每次烧录是2s,显示成功了,但是我修改源码,在application/os/helloword/main.c,加入了while(1)循环,里面加了些rt_kprintf()语句,然后调用rt_thread_delay(1000),觉得应该是每秒打印信息,结果烧录后却没有。
感觉只是执行了第一次烧录的程序,后来的烧录显示成功,但实际上没烧录进去...

int main(void)
{
#ifdef AIC_AB_SYSTEM_INTERFACE
    char target[32] = { 0 };

    aic_ota_status_update();
    aic_get_rodata_to_mount(target);
    printf("Mount APP in blk %s\n", target);

    if (dfs_mount(target, "/rodata", "elm", 0, 0) < 0)
        printf("Failed to mount elm\n");
#endif
    while(1)
    {
        // rt_kprintf("-------------------");
        // rt_kprintf("app started.");
        // rt_kprintf("-------------------");
        printf("-------------------");
        printf("app started.");
        printf("-------------------");
        rt_thread_delay(1000);
        rt_thread_delay(1000);
    }
    return 0;
}

ps显示线程列表,看到有gt911和alarmsvc线程,找到这两个的启动相关注释掉:

// INIT_DEVICE_EXPORT(rt_hw_gt911_port);
// INIT_PREV_EXPORT(rt_alarm_system_init);

结果烧录后,ps里还能看到这两个.

启动信息如下:

tinySPL [Built on Jan 22 2024 08:57:26]
[W] usbh_get_connect_id()107 usb 0 port change wait failed.
[E] main()137 Not find udisk.
Reboot action: Warm-Reset, reason: External-Reset
Firmware Component:
    name:      image.info
    partition:
    attr:      required
    Media:     RAM(0)
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
qspi0 freq ( bus ): 100000000Hz
Firmware Component:
    name:      image.target.spl
    partition: spl
    attr:      mtd;required
    Media:     SPI_NOR(3)
Firmware Component:
    name:      image.target.os
    partition: os
    attr:      mtd;required
    Media:     SPI_NOR(3)
Firmware Component:
    name:      image.target.rodata
    partition: rodata
    attr:      mtd;optional
    Media:     SPI_NOR(3)
Going to reboot ...

Pre-Boot Program ... (2023-11-14 13:46:14)
                                          SPINOR

tinySPL [Built on Jan 20 2024 14:53:02]
[W] usbh_get_connect_id()107 usb 0 port change wait failed.
[E] main()137 Not find udisk.
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
qspi0 freq ( bus ): 100000000Hz
Selecting default config 'Luban-lite firmware'
spl read: 691324 byte, 32423 us -> 20822 KB/s
 153713 : Run APP

     _         _   ___        ___ _     _
    / \   _ __| |_|_ _|_ __  / __| |__ (_)_ __
   / _ \ | '__| __|| || '_ \| |  | '_ \| | '_ \
  / ___ \| |  | |_ | || | | | |__| | | | | |_) |
 /_/   \_\_|   \__|___|_| |_|\___|_| |_|_| .__/
                                         |_|

Welcome to ArtInChip Luban-Lite 1.0 [Built on Jan 20 2024 14:53:25]
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
01-01 09:03:50 I/SFUD: Flash ID: 0xef4018
01-01 09:03:50 I/SFUD: Find a Winbond flash chip. Size is 16777216 bytes.
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 100000000Hz
01-01 09:03:50 I/SFUD: norflash0 flash device is initialize success.
01-01 09:03:50 I/SFUD: Probe SPI flash norflash0 by SPI device qspi01 success.
01-01 09:03:50 I/touch: rt_touch init success
01-01 09:03:50 I/gt911: touch device gt911 init success
[I] aic_find_panel()56 find panel driver : panel-lvds
[I] aicfb_probe()809 fb0 allocated at 0x40010360
[I] hal_ge_init()320 cmd queue hal, cmdq buffer size = 2048
[I] hal_ge_init()377 dither line phys :0X040268c00
[I] hal_ge_init()385 hal_ge_init() end
[I] aic_sdmc_clk_init()543 SDMC1 sclk: 49500 KHz, parent clk 792000 KHz
01-01 09:03:50 I/SDMC: SDMC1 BW 1, sclk 49500 KHz, clk 400 KHz(399 KHz), div 2-62

[I] aic_sdmc_probe()636 SDMC1 driver loaded
01-01 09:03:50 I/WDT: ArtInChip WDT loaded
packages/third-party/littlefs/lfs.c:1210:error: Corrupted dir pair at {0x0, 0x1}
01-01 09:03:50 E/DFS: mount fs[lfs] on /data failed.

01-01 09:03:50 E/DFS: mount fs[elm] on /sdcard failed.

01-01 09:03:50 E/DFS: mount fs[elm] on /sdcard failed.

Reboot action: Watchdog-Reset, reason: Command-Reboot

Startup time: 0.442 sec
info: cmd ring buf size:1920
info: cmd ring buf size:1920
01-01 09:03:50 E/gt911: read id failed
id = GT526753
01-01 09:03:50 E/gt911: read info failed
range_x = 0
range_y = 0
point_num = 101
aic /> 01-01 09:03:50 I/SDMC: SDMC1 BW 1, sclk 49500 KHz, clk 400 KHz(399 KHz), div 2-62

01-01 09:03:51 E/gt911: read info failed

aic /> ps
thread           pri  status      sp     stack size max used left tick  error
---------------- ---  ------- ---------- ----------  ------  ---------- ---
gt911             25  suspend 0x000001d8 0x00001000    17%   0x00000004 OK
LVGL              20  ready   0x000003a8 0x00008000    09%   0xfffff88f OK
tshell            20  running 0x000003b8 0x00001000    23%   0x00000009 OK
mmcsd_detect      22  suspend 0x00000218 0x00002000    10%   0x0000000d OK
alarmsvc          10  suspend 0x000001d8 0x00000800    23%   0x00000005 OK
tidle0            31  ready   0x000001b8 0x00000400    46%   0x00000002 OK
timer              4  suspend 0x00000198 0x00000200    79%   0x00000008 OK
aic />
RT-Thread shell commands:
list_fd          - list file descriptor
ulog_filter      - Show ulog filter settings
ulog_kw          - Set ulog global filter keyword
ulog_tag         - Set ulog global filter tag
ulog_lvl         - Set ulog global filter level.
ulog_tag_lvl     - Set ulog filter level by different tag.
ulog_be_lvl      - Set ulog filter level by different backend.
sensor           - sensor test function
sensor_polling   - Sensor polling mode test function
sensor_int       - Sensor interrupt mode test function
sensor_fifo      - Sensor fifo mode test function
fal              - FAL (Flash Abstraction Layer) operate.
tail             - print the last N - lines data of the given file
echo             - echo string to file
df               - disk free
umount           - Unmount device from file system
mount            - mount <device> <mountpoint> <fstype>
mkfs             - format disk with file system
mkdir            - Create the DIRECTORY.
pwd              - Print the name of the current working directory.
cd               - Change the shell working directory.
rm               - Remove(unlink) the FILE(s).
cat              - Concatenate FILE(s)
mv               - Rename SOURCE to DEST.
cp               - Copy SOURCE to DEST.
ls               - List information about the FILEs.
free             - Show the memory usage in the system.
ps               - List threads in the system.
help             - RT-Thread shell help.
list             - list objects
list_device      - list device in system
list_timer       - list timer in system
list_mempool     - list memory pool in system
list_memheap     - list memory heap in system
list_msgqueue    - list message queue in system
list_mailbox     - list mail box in system
list_mutex       - list mutex in system
list_event       - list event in system
list_sem         - list semaphore in system
list_thread      - list thread
version          - show RT-Thread version information
clear            - clear the terminal screen
mem_test         - memory test: mem_test address_hex size_hex
reboot           - Reboot the system
f                - run a function
m                - modify memory
p                - print memory
arecord          - record voice to a wav file
aplay            - play wav file
top              - cpu usage
dma_dump         - Dump DMA register. Argument: channel_num
efuse            - efuse command
wdt_status       - Show the status of Watchdog
aicupg           - Reboot to the upgrade mode
list_irq         - list system irq
adc              - adc [option]
pin              - pin [option]
pwm              - pwm [option]
lptimer_dump     - soft lptimer dump
pm_dump          - dump power management status
pm_run           - switch power management run mode
pm_module_delay  - module request delay sleep
pm_module_reques - request power management mode
pm_module_releas - release power management mode count
pm_module_releas - release module power mode
pm_request       - request power management mode
pm_release_all   - release power management mode count
pm_release       - release power management mode
list_alarm       - list alarm info
date             - get date and time or set (local timezone) [year month day hour min sec]
sf               - SPI Flash operate
ge_format        - ge format test
ge_fill          - ge fill test
ge_bitblt        - ge bitblit test
ge_rotate        - ge rotate test
pic_test         - picture decode test
ge_dither        - ge dithe test
ge_scan_order    - ge scan test
ge_alpha_blendin - ge alpha test
ge_scale         - ge scale test
pic_crop_test    - pic crop test

aic /> 

烧录信息如下:

[debug] Software Version: "1.3.6"
[debug] Machine Name: "DESKTOP-HQF1R40"
[debug] System Name: "Windows 10 (10.0)"
[debug] CPU Architecture: "x86_64" 

[debug] Parse the image header from "F:/MCU/ArtinChip/luban-lite/output/d13x_demo88-nor_rt-thread_helloworld/images/d13x_demo88-nor_v1.0.0.img"
[debug] Soc type: "d13x"
[debug] Board type: "demo88-nor"
[debug] Image version: "1.0.0"
[debug] Storage type: "spi-nor"
[debug] Storage ID: ""
[debug] Meta count: "5" 

[debug] Refresh the partition tree ...
[debug] Part name: image.target.spl , size: 130320 
[debug] Part name: image.target.os , size: 698716 
[debug] Part name: image.target.rodata , size: 2093056 

[debug] Current connect type: 0
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] There are "1" device available

[debug] Try to connect the ArtInChip device "1:3-1" ...

[debug] WinEvent: Some devnode changed
[debug] There are "1" device available
[debug] Try to get Usb device hd info...
[debug] Get Usb device hd info success
[debug] The status of ArtInChip device: true
[debug] Start burn online ...
[debug] Progress range: 0 ~ 3055616

[debug] Burn Image file "F:/MCU/ArtinChip/luban-lite/output/d13x_demo88-nor_rt-thread_helloworld/images/d13x_demo88-nor_v1.0.0.img" ... 

[debug] Meta 0 image.updater.spl , size 130320 ...
[debug] Blocksize 4 , chunk 1048576 * 0 , rest 130320
[debug] Offset: 4608 Size: 130320
[debug] Dev "1:3-1" Send the rest data 130320
[error] aicupg_trans_recv_pkt()208: CSW size 0, Pipe error(-9)
[error] aicupg_cmd_send_fwc_data_final()777: Recv resp failed, expect 16, got 0
[debug] Don't check the result of image.updater.spl

[debug] Meta 1 image.info , size 2048 ...
[error] aicupg_trans_send_pkt()80: CBW tag 0x51, size 0, Pipe error(-9)
[error] aicupg_cmd_get_hwinfo()106: Send command failed. ret = 0, siz = 16
[debug] Wait to reconnect dev "1:3-1"
[debug] QTime("02:21:30.613") Wait for Dev "1:3-1" ready

[debug] WinEvent: Some devnode changed

[debug] WinEvent: Some devnode changed

[debug] WinEvent: Some devnode changed
[warn ] Set upg work mode: 0
[debug] Blocksize 1 , chunk 1048576 * 0 , rest 2048
[debug] Offset: 0 Size: 2048
[debug] Dev "1:3-1" Send the rest data 2048

[debug] Meta 2 image.target.spl , size 130320 ...
[debug] Blocksize 2048 , chunk 1048576 * 0 , rest 130320
[debug] Offset: 135680 Size: 130320
[debug] Dev "1:3-1" Send the rest data 130320

[debug] Meta 3 image.target.os , size 698716 ...
[debug] Blocksize 2048 , chunk 1048576 * 0 , rest 698716
[debug] Offset: 266752 Size: 698716
[debug] Dev "1:3-1" Send the rest data 698716

[debug] Meta 4 image.target.rodata , size 2093056 ...
[debug] Blocksize 2048 , chunk 1048576 * 1 , rest 1044480
[debug] Offset: 967168 Size: 2093056
[debug] Dev "1:3-1" Send chunk 0 ...
[debug] Dev "1:3-1" Send the rest data 1044480

[debug] Burn online successfully!
[debug] Insert statistic of "2024-01-23"
[debug] Reboot the device ...
[error] aicupg_trans_send_pkt()104: CSW tag 0xbe, size 0, Pipe error(-9)

[debug] WinEvent: Some devnode changed
[debug] No device available

#266 Re: 工业芯 匠芯创 » 第一块D133CBS 烧录并运行成功 » 2024-01-23 10:38:13

d133cbs + w25q128.
忘了第一次烧录需要多久时间了,现在每次烧录是2s,显示成功了,但是我修改源码,在application/os/helloword/main.c,加入了while(1)循环,里面加了些rt_kprintf()语句,然后调用rt_thread_delay(1000),觉得应该是每秒打印信息,结果烧录后却没有。

int main(void)
{
#ifdef AIC_AB_SYSTEM_INTERFACE
    char target[32] = { 0 };

    aic_ota_status_update();
    aic_get_rodata_to_mount(target);
    printf("Mount APP in blk %s\n", target);

    if (dfs_mount(target, "/rodata", "elm", 0, 0) < 0)
        printf("Failed to mount elm\n");
#endif
    while(1)
    {
        // rt_kprintf("-------------------");
        // rt_kprintf("app started.");
        // rt_kprintf("-------------------");
        printf("-------------------");
        printf("app started.");
        printf("-------------------");
        rt_thread_delay(1000);
        rt_thread_delay(1000);
    }
    return 0;
}

ps显示线程列表,看到有gt911和alarmsvc线程,找到这两个的启动相关注释掉:

// INIT_DEVICE_EXPORT(rt_hw_gt911_port);
// INIT_PREV_EXPORT(rt_alarm_system_init);

结果烧录后,ps里还能看到这两个.

启动信息如下:

tinySPL [Built on Jan 22 2024 08:57:26]
[W] usbh_get_connect_id()107 usb 0 port change wait failed.
[E] main()137 Not find udisk.
Reboot action: Warm-Reset, reason: External-Reset
Firmware Component:
    name:      image.info
    partition:
    attr:      required
    Media:     RAM(0)
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
qspi0 freq ( bus ): 100000000Hz
Firmware Component:
    name:      image.target.spl
    partition: spl
    attr:      mtd;required
    Media:     SPI_NOR(3)
Firmware Component:
    name:      image.target.os
    partition: os
    attr:      mtd;required
    Media:     SPI_NOR(3)
Firmware Component:
    name:      image.target.rodata
    partition: rodata
    attr:      mtd;optional
    Media:     SPI_NOR(3)
Going to reboot ...

Pre-Boot Program ... (2023-11-14 13:46:14)
                                          SPINOR

tinySPL [Built on Jan 20 2024 14:53:02]
[W] usbh_get_connect_id()107 usb 0 port change wait failed.
[E] main()137 Not find udisk.
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
qspi0 freq ( bus ): 100000000Hz
Selecting default config 'Luban-lite firmware'
spl read: 691324 byte, 32423 us -> 20822 KB/s
 153713 : Run APP

     _         _   ___        ___ _     _
    / \   _ __| |_|_ _|_ __  / __| |__ (_)_ __
   / _ \ | '__| __|| || '_ \| |  | '_ \| | '_ \
  / ___ \| |  | |_ | || | | | |__| | | | | |_) |
 /_/   \_\_|   \__|___|_| |_|\___|_| |_|_| .__/
                                         |_|

Welcome to ArtInChip Luban-Lite 1.0 [Built on Jan 20 2024 14:53:25]
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
01-01 09:03:50 I/SFUD: Flash ID: 0xef4018
01-01 09:03:50 I/SFUD: Find a Winbond flash chip. Size is 16777216 bytes.
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 100000000Hz
01-01 09:03:50 I/SFUD: norflash0 flash device is initialize success.
01-01 09:03:50 I/SFUD: Probe SPI flash norflash0 by SPI device qspi01 success.
01-01 09:03:50 I/touch: rt_touch init success
01-01 09:03:50 I/gt911: touch device gt911 init success
[I] aic_find_panel()56 find panel driver : panel-lvds
[I] aicfb_probe()809 fb0 allocated at 0x40010360
[I] hal_ge_init()320 cmd queue hal, cmdq buffer size = 2048
[I] hal_ge_init()377 dither line phys :0X040268c00
[I] hal_ge_init()385 hal_ge_init() end
[I] aic_sdmc_clk_init()543 SDMC1 sclk: 49500 KHz, parent clk 792000 KHz
01-01 09:03:50 I/SDMC: SDMC1 BW 1, sclk 49500 KHz, clk 400 KHz(399 KHz), div 2-62

[I] aic_sdmc_probe()636 SDMC1 driver loaded
01-01 09:03:50 I/WDT: ArtInChip WDT loaded
packages/third-party/littlefs/lfs.c:1210:error: Corrupted dir pair at {0x0, 0x1}
01-01 09:03:50 E/DFS: mount fs[lfs] on /data failed.

01-01 09:03:50 E/DFS: mount fs[elm] on /sdcard failed.

01-01 09:03:50 E/DFS: mount fs[elm] on /sdcard failed.

Reboot action: Watchdog-Reset, reason: Command-Reboot

Startup time: 0.442 sec
info: cmd ring buf size:1920
info: cmd ring buf size:1920
01-01 09:03:50 E/gt911: read id failed
id = GT526753
01-01 09:03:50 E/gt911: read info failed
range_x = 0
range_y = 0
point_num = 101
aic /> 01-01 09:03:50 I/SDMC: SDMC1 BW 1, sclk 49500 KHz, clk 400 KHz(399 KHz), div 2-62

01-01 09:03:51 E/gt911: read info failed

aic /> ps
thread           pri  status      sp     stack size max used left tick  error
---------------- ---  ------- ---------- ----------  ------  ---------- ---
gt911             25  suspend 0x000001d8 0x00001000    17%   0x00000004 OK
LVGL              20  ready   0x000003a8 0x00008000    09%   0xfffff88f OK
tshell            20  running 0x000003b8 0x00001000    23%   0x00000009 OK
mmcsd_detect      22  suspend 0x00000218 0x00002000    10%   0x0000000d OK
alarmsvc          10  suspend 0x000001d8 0x00000800    23%   0x00000005 OK
tidle0            31  ready   0x000001b8 0x00000400    46%   0x00000002 OK
timer              4  suspend 0x00000198 0x00000200    79%   0x00000008 OK
aic />
RT-Thread shell commands:
list_fd          - list file descriptor
ulog_filter      - Show ulog filter settings
ulog_kw          - Set ulog global filter keyword
ulog_tag         - Set ulog global filter tag
ulog_lvl         - Set ulog global filter level.
ulog_tag_lvl     - Set ulog filter level by different tag.
ulog_be_lvl      - Set ulog filter level by different backend.
sensor           - sensor test function
sensor_polling   - Sensor polling mode test function
sensor_int       - Sensor interrupt mode test function
sensor_fifo      - Sensor fifo mode test function
fal              - FAL (Flash Abstraction Layer) operate.
tail             - print the last N - lines data of the given file
echo             - echo string to file
df               - disk free
umount           - Unmount device from file system
mount            - mount <device> <mountpoint> <fstype>
mkfs             - format disk with file system
mkdir            - Create the DIRECTORY.
pwd              - Print the name of the current working directory.
cd               - Change the shell working directory.
rm               - Remove(unlink) the FILE(s).
cat              - Concatenate FILE(s)
mv               - Rename SOURCE to DEST.
cp               - Copy SOURCE to DEST.
ls               - List information about the FILEs.
free             - Show the memory usage in the system.
ps               - List threads in the system.
help             - RT-Thread shell help.
list             - list objects
list_device      - list device in system
list_timer       - list timer in system
list_mempool     - list memory pool in system
list_memheap     - list memory heap in system
list_msgqueue    - list message queue in system
list_mailbox     - list mail box in system
list_mutex       - list mutex in system
list_event       - list event in system
list_sem         - list semaphore in system
list_thread      - list thread
version          - show RT-Thread version information
clear            - clear the terminal screen
mem_test         - memory test: mem_test address_hex size_hex
reboot           - Reboot the system
f                - run a function
m                - modify memory
p                - print memory
arecord          - record voice to a wav file
aplay            - play wav file
top              - cpu usage
dma_dump         - Dump DMA register. Argument: channel_num
efuse            - efuse command
wdt_status       - Show the status of Watchdog
aicupg           - Reboot to the upgrade mode
list_irq         - list system irq
adc              - adc [option]
pin              - pin [option]
pwm              - pwm [option]
lptimer_dump     - soft lptimer dump
pm_dump          - dump power management status
pm_run           - switch power management run mode
pm_module_delay  - module request delay sleep
pm_module_reques - request power management mode
pm_module_releas - release power management mode count
pm_module_releas - release module power mode
pm_request       - request power management mode
pm_release_all   - release power management mode count
pm_release       - release power management mode
list_alarm       - list alarm info
date             - get date and time or set (local timezone) [year month day hour min sec]
sf               - SPI Flash operate
ge_format        - ge format test
ge_fill          - ge fill test
ge_bitblt        - ge bitblit test
ge_rotate        - ge rotate test
pic_test         - picture decode test
ge_dither        - ge dithe test
ge_scan_order    - ge scan test
ge_alpha_blendin - ge alpha test
ge_scale         - ge scale test
pic_crop_test    - pic crop test

aic /> 

烧录信息如下:

[debug] Software Version: "1.3.6"
[debug] Machine Name: "DESKTOP-HQF1R40"
[debug] System Name: "Windows 10 (10.0)"
[debug] CPU Architecture: "x86_64" 

[debug] Parse the image header from "F:/MCU/ArtinChip/luban-lite/output/d13x_demo88-nor_rt-thread_helloworld/images/d13x_demo88-nor_v1.0.0.img"
[debug] Soc type: "d13x"
[debug] Board type: "demo88-nor"
[debug] Image version: "1.0.0"
[debug] Storage type: "spi-nor"
[debug] Storage ID: ""
[debug] Meta count: "5" 

[debug] Refresh the partition tree ...
[debug] Part name: image.target.spl , size: 130320 
[debug] Part name: image.target.os , size: 698716 
[debug] Part name: image.target.rodata , size: 2093056 

[debug] Current connect type: 0
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] No device available

[debug] WinEvent: Some devnode changed
[debug] There are "1" device available

[debug] Try to connect the ArtInChip device "1:3-1" ...

[debug] WinEvent: Some devnode changed
[debug] There are "1" device available
[debug] Try to get Usb device hd info...
[debug] Get Usb device hd info success
[debug] The status of ArtInChip device: true
[debug] Start burn online ...
[debug] Progress range: 0 ~ 3055616

[debug] Burn Image file "F:/MCU/ArtinChip/luban-lite/output/d13x_demo88-nor_rt-thread_helloworld/images/d13x_demo88-nor_v1.0.0.img" ... 

[debug] Meta 0 image.updater.spl , size 130320 ...
[debug] Blocksize 4 , chunk 1048576 * 0 , rest 130320
[debug] Offset: 4608 Size: 130320
[debug] Dev "1:3-1" Send the rest data 130320
[error] aicupg_trans_recv_pkt()208: CSW size 0, Pipe error(-9)
[error] aicupg_cmd_send_fwc_data_final()777: Recv resp failed, expect 16, got 0
[debug] Don't check the result of image.updater.spl

[debug] Meta 1 image.info , size 2048 ...
[error] aicupg_trans_send_pkt()80: CBW tag 0x51, size 0, Pipe error(-9)
[error] aicupg_cmd_get_hwinfo()106: Send command failed. ret = 0, siz = 16
[debug] Wait to reconnect dev "1:3-1"
[debug] QTime("02:21:30.613") Wait for Dev "1:3-1" ready

[debug] WinEvent: Some devnode changed

[debug] WinEvent: Some devnode changed

[debug] WinEvent: Some devnode changed
[warn ] Set upg work mode: 0
[debug] Blocksize 1 , chunk 1048576 * 0 , rest 2048
[debug] Offset: 0 Size: 2048
[debug] Dev "1:3-1" Send the rest data 2048

[debug] Meta 2 image.target.spl , size 130320 ...
[debug] Blocksize 2048 , chunk 1048576 * 0 , rest 130320
[debug] Offset: 135680 Size: 130320
[debug] Dev "1:3-1" Send the rest data 130320

[debug] Meta 3 image.target.os , size 698716 ...
[debug] Blocksize 2048 , chunk 1048576 * 0 , rest 698716
[debug] Offset: 266752 Size: 698716
[debug] Dev "1:3-1" Send the rest data 698716

[debug] Meta 4 image.target.rodata , size 2093056 ...
[debug] Blocksize 2048 , chunk 1048576 * 1 , rest 1044480
[debug] Offset: 967168 Size: 2093056
[debug] Dev "1:3-1" Send chunk 0 ...
[debug] Dev "1:3-1" Send the rest data 1044480

[debug] Burn online successfully!
[debug] Insert statistic of "2024-01-23"
[debug] Reboot the device ...
[error] aicupg_trans_send_pkt()104: CSW tag 0xbe, size 0, Pipe error(-9)

[debug] WinEvent: Some devnode changed
[debug] No device available

------------------------------------

找到第一次烧写的截图了,39s。现在每次烧录都是2s,我怀疑我是不是只有第一次烧录成功了...
后来烧写显示成功了,但是仍执行的第一次烧写的程序...

#267 Re: 工业芯 匠芯创 » 一个人调试太孤单了,终于可以卖4块D133CBS开发板了,公布一下进展,找人一起玩 » 2024-01-22 09:31:44

ubuntu22.04下,用python3.10,执行onesetp.sh后,打算用addboard新增加个设置,结果报错:

 addboard 0
scons: Reading SConscript files ...
Chip list:
  0: d13x
  1: d21x
NameError: name 'raw_input' is not defined:
  File "/home/any/Mcu/artinchip/luban-lite/SConstruct", line 12:
    PRJ_CHIP,PRJ_BOARD,PRJ_KERNEL,PRJ_APP,PRJ_DEFCONFIG_NAME,PRJ_CUSTOM_LDS,MKIMAGE_POST_ACTION = get_prj_config(AIC_ROOT)
  File "/home/any/Mcu/artinchip/luban-lite/tools/scripts/aic_build.py", line 1135:
    add_board_cmd(aic_root, PRJ_CHIP, PRJ_BOARD, PRJ_KERNEL, PRJ_APP, PRJ_DEFCONFIG_NAME)
  File "/home/any/Mcu/artinchip/luban-lite/tools/scripts/aic_build.py", line 247:
    i = raw_input("Select chip for new board(number):")

搜了下,raw_input是python2语法,python3改成Input了。但看文档里介绍,luban-lite是支持python3的吧?
-----------------------------------------------------------------
将对应pyton文件里的raw_input,全部改成input,ab命令通过。

不过有个疑问,app工程是如何指定bootloader版本的?靠名称前缀?

#268 Re: 全志 SOC » d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用? » 2024-01-20 14:25:49

目前是这么解决的:

在没打开g2d功能时,ts_calibrate -r 2,旋转tslib并校准,保留此时的校准文件。
然后烧录打开g2d的镜像,写入之前的这个校准文件。

#269 Re: 全志 SOC » d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用? » 2024-01-20 11:07:44

触控这里,是使用原先非旋转情况下的坐标吗?

我现在g2d旋转成功了,qt5界面旋转了180度。想用ts_calibrate校准,结果显示不出界面来,这里估计也得修改tslib源码吧?

--------------------------------------------

#export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=$QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS:rotate=180
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=180 

尝试了以上两句,都没效果,现在触控和画面是差180度的。

/etc/ts.conf  中加入module linear rot=2
也没效果。

#270 Re: 工业芯 匠芯创 » D133EBS烧录失败问题 » 2024-01-19 15:24:43

@ArtInChip

onestep.sh只是编译功能吧,不含烧写功能。
aiburn有没有ubuntu版?或者在linux下有命令行烧写功能也行。

#271 Re: 全志 SOC » d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用? » 2024-01-19 11:53:23

@wwwlll

感谢,我还看到个,按qt5.4的一个patch,修改qt的framebuffer插件的源码,使其支持旋转功能。
https://blog.csdn.net/qq_15725099/article/details/102717970

另,为什么方法2  cpu占用率高?
我试过方法2,没效果:

export QT_QPA_PLATFORM=linuxfb:rotation=180

-------------------------------------------------------------

仔细看了下,
qt源码打patch,这种,也是修改qtbase/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp这个文件,需要添加的内容稍多些,但是不用打开内核的g2d功能了。

那么现在可行的方案就两种:
1,内核打开g2d,修改qlinuxfbscreen.cpp,增加某个接口函数。
2,内核不动,修改qlinuxfbscreen.cpp,修改部分函数,增加旋转部分。

这两种都需要重新编译qt源码,头疼...

#272 Re: 全志 SOC » d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用? » 2024-01-18 17:43:27

如果想用纯软件旋转的话,qt5又该如何设置环境变量呢?搜了下,有说qt5不支持fb旋转。

我试了
QWS_DISPLAY=Transformed:Rot180

export QT_QPA_EVDEV_ROTATION=180

都没有效果。

#273 全志 SOC » d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用? » 2024-01-18 17:05:08

Gentlepig
回复: 15

【FAQ】全志F133(D1s)芯片 如何在Tina下进行显示旋转?
https://bbs.aw-ol.com/topic/2600


想将t113-s3的屏幕旋转180度,搜了下,大都是这个帖子的内容。启动g2d功能,设备树里设置下旋转方向。
然后lvgl里手动调用某个函数。

5.旋转后framebuffer编程是需要注意,旋转后的buffer不会直接显示到屏幕上, 需要在应用刷屏的地方调用FBIOPAN_DISPLAY接口.同步旋转后的buffer到LCD上.

但是我想用的是qt,在qt程序中的什么位值调用这个函数呢?

#274 Re: 全志 SOC » T113 RS485的方向如何控制 » 2024-01-18 08:57:31

在aw-ol论坛上看到过,好像默认是用某个流控管脚控制收发的,但是有问题,那个帖子里给出了修改后的驱动函数,可以自己指定管脚。

--------------------------------------------

https://bbs.aw-ol.com/topic/2290/t113%E4%B8%8Auart%E8%BD%AC485%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0/4?lang=zh-CN

#275 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,局域网内,嵌入式llinxu设备,如何向pc上位机传送数据? » 2024-01-17 14:04:24

@wxws

感谢分享经验,目前我是在设备系统目录里放了个json文件,里变有个描述设备名称的字符串。

#276 Re: 工业芯 匠芯创 » D133 QFN88 官方参考图纸 » 2024-01-17 09:30:15

昆仑派的图纸有没有啊?想看看和贵的开发板原理图上有什么变化。

#277 Re: 全志 SOC » F1C100S 请问 硬件设计上为什么大家都把 RGB设计成 BGR呢?是有什么讲究么? » 2024-01-15 09:54:37

不光f1c100是bgr这样排列的,v3s, d1s,都是这样排列,好奇,bgr排列的屏,比rgb排列的,更常见吗?

#278 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,局域网内,嵌入式llinxu设备,如何向pc上位机传送数据? » 2024-01-12 17:02:29

目前的实现是,嵌入式linux上电后发送下udp广播,表明自己是tcp client,pc收到后自动返回udp信息,表明自己是tcp server,此时双方都知道了对方的ip地址。然后就开始tcp连接。当嵌入式板发现tcp断开时,启动个定时器,定时再发送udp广播信息。

但又遇到了个问题,现场最后是一台pc多个嵌入式linux设备,如何区分这几个嵌入式linux设备呢?
pc端可以用ip地址来区分,但是实际嵌入式设备是哪个地址,可能不好看出来。
想实现的是,设备区分为 01, 02, 03....这样的若干个设备。
但是,这样问题就又来了,如何配置设备的名称?

之前这么实现过,pc向t113-s3的usb的虚拟串口,发送个固定格式的数据,t113-s3这里,写个串口接收处理程序,将收到的数据存为一个配置文件。

不过觉得也不是很方便,t113-s3的usb口一般用来烧录程序,或adb push文件。

有什么更好的办法吗?求推荐。

#279 Re: Cortex M0/M3/M4/M7 » 请教,daplink如何解除M3单片机的写保护? » 2024-01-12 16:29:39

tomzbj 说:

@Gentlepig  既然是gd32, 也可以用gdlink的命令行操作啊. gdlink实际上也就是个daplink.

可能实际烧录的对象,不一定是gd32,也有可能是stm32,也有可能是at32,也有可能是air32。
想找个利用daplink解除cortex m3芯片的通用一点的方法。

#280 Re: Cortex M0/M3/M4/M7 » 请教,daplink如何解除M3单片机的写保护? » 2024-01-12 15:05:08

今天又遇到这个问题,用daplink给一个gd32f103单片机烧录程序,总是少些不成功,卡了半个多小时才想起来,原程序里有读写保护设置。
翻出stlink来,用mdk,还是没找到解除读写保护的功能,又得去打开stlink utility。

求推荐个daplink解除读写保护的工具。

#282 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 请教,qt程序,qtablewidget添加大量数据相当耗时,界面卡顿。 » 2024-01-11 10:50:01

Gentlepig
回复: 2

子线程里进行了socketcan收发,想将收和发的can数据都显示在界面上,于是发送数据后,将数据当作信号的参数发送给主线程。主线程里用了qtablewidget,然后将数据插入新行里。

发送时,现在是定时一次行发送200多条can数据,结果现在的现象是,进行can发送时,gui界面就卡住了。
我试着注释了主线程里的qtablewdiget插入新行的语句,则界面不会卡顿。

请教,如果避免这种卡顿呢?

#284 Re: 全志 SOC » ★★★全志科技 V853 H133 D1S T113-S3 F133-A 开发板 » 2024-01-09 09:39:36

板子做的真漂亮。
想问下,T113, H133, V853这三个都是cortex a7,有什么区别呢?
t113不带npu,另两个的区别呢?

#285 Re: 全志 SOC » T113-s3使用Tina SDK编译Qt5.12.9失败 » 2024-01-09 08:55:22

changge 说:

请问楼主前辈,这个问题解决了吗?我卡在这步好多天了,不知道怎么生成qmake。请教!sudo make的结果如下https://whycan.com/files/members/13702/1704720427244.png

可以考虑单独编译qt,自带的那个不好搞。

#286 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 同一个pro文件,编译arm版时需要连接额外的库,如何在不来回修改pro文件的前提下,可以切换编译两个版本的qt程序? » 2024-01-06 13:35:04

现在工程目录是这样的:
can2socket.pro   和 src 目录 同级,src目录下有有个src.pro。

现在在can2socket.pro里,DEFINES+=t113,结果传递不到src.pro文件里...

我是想定义两个顶层pro文件,编译时用顶层pro文件分别编译出pc版和arm版。

#289 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 同一个pro文件,编译arm版时需要连接额外的库,如何在不来回修改pro文件的前提下,可以切换编译两个版本的qt程序? » 2024-01-06 08:47:06

感谢两位,我没用qt creator,而是直接qmake  xxx.pro,然后再make的。

所以这个额外的参数,DEFINES+=arm或QT_ARCH+=arm,如何在qmake或make时指定?

#290 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 同一个pro文件,编译arm版时需要连接额外的库,如何在不来回修改pro文件的前提下,可以切换编译两个版本的qt程序? » 2024-01-05 17:47:00

Gentlepig
回复: 7

在编写arm版上运行的qt程序,当然也想在pc上运行下看看。

但是arm版需要个单独的ssl库,而pc版不需要加入这个库。这该怎么搞呢?

搜了下,可以通CONFIG或DEFINES。比如
DEFINES += XXX
contains(DEFINES, XXX) {
    include xxx
    LIBS += xxx
}

但是这样,我还是需要来回注释或取消注释掉 DEFINES += XXX这一行。
能不能qmake或make时,指定个条件来满足?不想来回修改pro文件。

pc环境是ubuntu,所以不能用win、unix来分辨。

#291 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 40pin rgb屏和50pin rgb接口有什么区别呢?比如都是7寸800x480。增加问题,背光led电流控制在多少合适? » 2024-01-05 16:27:14

Gentlepig
回复: 4

以前一直以为信号线都一样呢。
今天才知道不一样。50pin有vcom, vgh, vgl信号。
40pin一般有rtp信号,50pin的好像没见到。

有人能科普下这两种接口屏的区别吗?各有什么优劣?

----------------------------------------------------------------------

感谢各位i科普,额外再问个屏幕背光的问题。
请问,一般背光电流控制在多少合适?我买的一个7寸800*480的屏,查了下资料,是7串3并。目前背光驱动部分控制在了60mA,也就是每个二极管是20mA。

#292 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,socketcan接收,用哪种方案好呢?子线程不停读?用QSocketNotifier?epoll? » 2024-01-03 14:55:18

带NAPI的中断轮询数据接收模式

    中断接收数据模式在数据频繁情况下,中断触发负载过大,系统性能受到影响,为此基于轮询的接收模式被开发,称为New API,即NAPI。

    NAPI仍然需要首次数据包接收中断来触发poll过程,第一次接收中断发生后,中断处理程序禁止设备的接收中断,通过poll方式读取设备的接收缓冲区后,再次使能中断。

https://www.cnblogs.com/tureno/articles/6350137.html
搜到了这个。

既然用qt,那我就尽量用QSocketNotifier吧。

---------------------------------------------------------------

发现,如果用qt5的can类的话,已经有个收到can数据这个信号了:

    connect(m_canDevice.get(), &QCanBusDevice::framesReceived,
            this, &MainWindow::processReceivedFrames);

#293 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,socketcan接收,用哪种方案好呢?子线程不停读?用QSocketNotifier?epoll? » 2024-01-03 10:54:30

Gentlepig
回复: 2

之前编写过一个t113-s3的qt程序,当时用到了can部分。
当时是这么实现的,将socketcan接收部分放到了一个线程里,收到数据后,通过信号将数据发送出去。没收到数据,则继续不停的接收。

现在gpt不是方便了么,问了gpt,结果给的例子是,利用QSocketNotifier:

 QSocketNotifier notifier(s, QSocketNotifier::Read);
 QObject::connect(&notifier, &QSocketNotifier::activated, &receiveCanData);

这样貌似一旦收到数据后,就会触发 QSocketNotifier::activated信号,这样,貌似就不用线程了。

群里问了网友,又给了另一个方案,用poll, epoll, select。网上搜了下,这种貌似是在c++下的处理办法。

这下晕头了,不知道该怎么搞好了。求大家给意见。

另,我好奇,socketcan是如何知道收到数据了呢?
对于单片机来说,一般是打开can接收中断。而嵌入式linux这里是怎么知道收到数据了呢?
因为不明白这里,所以我之前用子线程不停的读这种方案,觉得也很合理。
但是QSocketNotifier和poll,感觉都是知道收到数据才去处理...

----------------------------------------------------------------------------------------

看了下can驱动文件,有中断函数...

#294 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,局域网内,嵌入式llinxu设备,如何向pc上位机传送数据? » 2024-01-01 18:13:01

踩姑娘的小蘑菇 说:

@Gentlepig
传文件没有必要造轮子,直接用ftp就好,主机装一个ftp server,从机连接并使用ftp上传文件
或者使用ssh承载的sftp也可以

想定时传json数据,也许十秒就传一次。
FTP一半是传文件吧?我10秒传一个文件,ftp服务器收到后删除文件?

另http方式怎么样?

#295 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,局域网内,嵌入式llinxu设备,如何向pc上位机传送数据? » 2023-12-29 15:50:31

再请教下各位,目前通过udp广播,可以获取tcp server的地址了。然后通过tcp client连接tcp server后,可以互发数据。但有个新问题了,tcpsocket传输文件时,接收方不知道什么时候文件传输结束了,这该怎么解决好呢?
网上搜了下,简单的解决办法是,发送方,先发送4个字节表明接下来文件的长度,然后再发文件。
还有朋友说用http通讯。

该怎么解决这个问题好呢?

#296 Re: 工业芯 匠芯创 » d133 RGB888 图形显示测试 » 2023-12-23 09:09:09

tangloong 说:
642242855 说:

boot 按键? 两路电源? rst 按键跟排针有阻碍

那个sot23-3的估计是个ldo。

好奇J13是什么?

另,群友画的几个板子,都没有看到引出网口的...

#297 Re: 工业芯 匠芯创 » 一个人调试太孤单了,终于可以卖4块D133CBS开发板了,公布一下进展,找人一起玩 » 2023-12-22 16:33:16

@tangloong

请教下楼主,我看你发布的原理图,40pin rgb接口中r和b是调换的。那么,d133支持整组互换吗?

#298 Re: 工业芯 匠芯创 » D133 QFN88 官方参考图纸 » 2023-12-22 08:49:26

感谢分享,昨天刚想找D133原厂设计,就看到楼主发出来了。
借楼把从群里下载的D213原厂设计参考也放上来。
匠心创D213原厂硬件设计参考.zip
这两个板子,就是官方的两个开发板。应该都是candence设计的,然后又转出了ad和pads格式的。
两个板子布局很相似,都没引出rgb接口,而引出了lvds接口。

#299 Re: 工业芯 匠芯创 » 入坑D133 » 2023-12-21 15:11:07

ArtInChip 说:

欢迎欢迎,我们目前技术支持还需要大牛帮我们分担,以后个人开发者会越来越多。

d13x有没有原厂设计供参考啊?

#300 Re: 工业芯 匠芯创 » 第一块D133CBS 烧录并运行成功 » 2023-12-21 14:03:03

lcfmax 说:

板子接口稍微有点少,我画的板子,基本接口都接出来了。
https://whycan.com/files/members/739/D133CBS.png

这个芯片不支持电阻屏吧?没看到你板子上放电容触控接口。
-------------------------------------------------------------------------------------------------
下载手册看了下,集成rtp的,PA8-11。

#301 Re: 全志 SOC » T113-S3无法下载烧录到SPI NAND » 2023-12-20 09:08:55

论坛里下载文件要扣积分的。
你不如直接把图片嵌入到帖子里。

#302 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,局域网内,嵌入式llinxu设备,如何向pc上位机传送数据? » 2023-12-19 08:48:18

kin 说:
Gentlepig 说:

@Meekdai
感谢。
意思是,client把局域网所有ip都列出来,然后挨个去尝试连接?

client先在局域网发一个UDP广播包,server收到后直接应答回去,这时client就拿到server的ip地址了,就可以与server建立连接

感谢。

#304 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,局域网内,嵌入式llinxu设备,如何向pc上位机传送数据? » 2023-12-18 13:41:20

Meekdai 说:

@Gentlepig
不需要知道,只要PC和多个嵌入式设备都在同一网段就行了。比如server为[192.168.1.10],client为[192.168.1.55]和[192.168.1.86]等等,这样一般服务器起来后,client会自动连接到server

https://blog.csdn.net/weixin_45062087/article/details/118946561
对于APUE网络socket,我们需要了解就是server和client之间的通信建立过程。首先我们需要知道两台不同网段的pc是怎么通信的,当一台pc通过应用程序发一段消息过来给另一台pc时,pc获取到数据包之后就行拆包解析,这些都是操作系统内核的工作,对于server而言,需要告诉内核使用什么ip和端口来建立起服务,当有client接入时,内核先进行解析,得到client的ip和访问端口之后再给server(对应的应用程序),最后完成通信建立;对于client而言,需要知道server的ip和端口,获取ip来源主要是通过dns解析和人为获取,然后通过获取的ip和端口进行发送连接请求,最后完成通信。

我搜到的这个文章,我的理解是client连接server,需要知道对方地址。

#305 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,局域网内,嵌入式llinxu设备,如何向pc上位机传送数据? » 2023-12-18 10:05:36

山羊胡子 说:

不写代码,直接mount pc的共享文件夹,往里面存文件

感觉一次性写入的话,可以考虑。但是如果想每隔几十秒传一次数据呢?

#306 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,局域网内,嵌入式llinxu设备,如何向pc上位机传送数据? » 2023-12-18 09:44:58

Meekdai 说:

PC上位机起一个socketserver,t113上起一个socketclient就可以,使用起来确实和串口很像,但是速率和稳定性要比串口好不少的。

那么,再请教下,socket通讯的话,需要pc和嵌入式linux互相知道对方的局域网地址吧,这个需要手动输入了吧?有没有简单的办法判别?实际应用中是一个PC,和多个嵌入式linux设备进行局域网通讯。

#307 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,局域网内,嵌入式llinxu设备,如何向pc上位机传送数据? » 2023-12-18 09:05:22

Gentlepig
回复: 23

想用t113-s3做个设备,收集老化台上can设备总线的数据,存起来,或者定时发送给局域网的pc。
请教,该怎么实现呢?
同事建议嵌入式linux设备上开个ftp服务器,pc上位机定时读取文件。
问了下gpt,说是sockete通信,于是搜了下,这类似串口发送接受?

请大家给点意见,怎么搞才好?

#308 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 下载了一些开源飞控源码看,为何用freertos的这么少。 » 2023-12-11 15:49:20

海石生风 说:

不要以自己的立场感受为常识。比如,从事Linux底层的人对nuttx就会很熟悉并觉得freertos功能太少。
像小米就选nuttx作为他们产品的RTOS,明显是因为他们的团队以前是搞手机系统的,众所周知,手机系统内核是Linux。

确实,自己了解的还是太少太片面了。nuttx之前只是见到过这个名字,chibios是第一次见到...


是不是不少rtos也兼容posix?  rtt好像支持吧,微软的threadx是不是也兼容呢?

------------------------------------------------------------

搜到了这个:

为什么选择NuttX?
市场上开源或商业的RTOS非常多,为什么我们最终选择NuttX作为Xiaomi Vela的基础?主要有以下几个原因:

    NuttX对POSIX标准有原生兼容:NuttX是可商用化RTOS中唯一一个对POSIX API有原生支持的实时操作系统,所以很多Linux社区的开源软件可以很方便的移植到NuttX上,这样可以极大的简化开源软件移植,方便代码复用,降低学习曲线,其它RTOS需要适配层把POSIX API转成内部API,而且通常只兼容一小部分的POSIX接口。
    完成度高:NuttX集成了文件系统、网络协议栈、图形库和驱动框架,减少开发成本。
    模块化设计:所有组件甚至组件内部特性,都可以通过配置Kconfig来调整或关闭,可按需对系统进行裁剪,适用于不同产品形态。
    代码精简:所有组件都是从头编码,专门对代码和数据做了优化设计。
    轻量级:虽然NuttX实现了传统操作系统的所有功能,但是最终生成的代码尺寸还是可以很小(最小配置不到32KB,最大配置不超过256KB)。
    和Linux系统的兼容性:因为NuttX整体设计、代码组织,编译过程和Linux非常接近,将会极大地降低Android/Linux开发者的迁移成本。
    活跃开放的社区:很多厂商(比如小米、Sony,乐鑫、NXP等)和开源爱好者都在积极回馈社区。

#309 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 下载了一些开源飞控源码看,为何用freertos的这么少。 » 2023-12-11 15:32:17

APM:裸奔
Pixhawk:Nuttx
MWC/Naze32:裸奔
Openpilot:PIOS
Autoquad:CoOS (an embedded real-time multi-task OS specially for ARM Cortex M series)
Paparazzi:ChibiOS匿名飞控:
RT-Thread(国产飞控+国产RTOS)
Crazyflie:FreeOS

https://www.zhihu.com/question/28981423/answer/51314550

知乎上看到的。

另,遥控器,有哪些开源硬件?指的是pcb及原理图也公开了的。

#310 Re: Cortex M0/M3/M4/M7 » STM32G030F6P6这个mcu有用过的吗, ADC是不是很拉跨? » 2023-12-11 15:17:23

发现又出了个stm32c0系列单片机。这样0尾缀就有C0, F0, G0三个系列了。

#313 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 下载了一些开源飞控源码看,为何用freertos的这么少。 » 2023-12-09 10:02:54

Gentlepig
回复: 24

betaflig/inva/cleanflight,没用rtos,但是有任务及任务调度,好奇为何不用freertos。

px4用的nuttx,看不懂,也不想学,放弃...

有的飞控好像用了chibios

正点原子提供的atkflight,用了freertos.

好奇,觉得freertos应用比较广了吧,为何这么多飞控用freertos的这么少。

#314 Re: Cortex M0/M3/M4/M7 » STM32G030F6P6这个mcu有用过的吗, ADC是不是很拉跨? » 2023-12-09 08:48:11

我好像看到有说法是stm32g系列的adc要比stm32f103系列列的好。

#316 Re: Cortex M0/M3/M4/M7 » 请教,单片机如何将程序存到外部flash里并运行? » 2023-12-06 14:17:02

参考单片机iap升级,可以通过程序,将外部flash里的程序,搬运到内部flash里,设置SCB-VTOR
但是,这样就相当于,每次启动程序就擦写一次内部flash了。
而且,如果程序比较大呢,内部flash里本来就装不下呢。

#317 Cortex M0/M3/M4/M7 » 请教,单片机如何将程序存到外部flash里并运行? » 2023-12-06 13:54:40

Gentlepig
回复: 7

比如stm32f103或国产兼容型号,外挂个spi flash。

实际应用中还没遇到这种情况,但是万一有这种需求的话,该怎么实现呢?
更细一点的话,其实是不知道编译的程序,怎么就被执行了...

#318 Re: 全志 SOC » 自制F1C200S 小板上电不启动 求大佬们帮忙看看 :( » 2023-12-01 09:32:13

dykxjh 说:

先测3.3/1.2/2.5V/2.8四路电压是否正常。如果电压正常再测晶振是否启振

2.8V是干什么用的?

建议换成功率电感。
还有就是芯片底部热焊盘是否真的焊接上去了。

#320 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请问,现在很多soc有算力,比如0.5T或者1T,这样的片子具体应用在哪些场合呢? » 2023-11-27 16:06:16

ubuntu 说:

能用的场合很多,需要识别的场合都能用。我的一个朋友都躺平了,用上自动识别游戏人物,自己打游戏,自动赚钱了。

喷了,这算高级外挂?

#321 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请问,现在很多soc有算力,比如0.5T或者1T,这样的片子具体应用在哪些场合呢? » 2023-11-27 15:19:46

Gentlepig
回复: 4

之前Q群里问过,有网友解答过,忘了,再问一遍。
t113-s3貌似没算力。
v851/853好像是有算力。
rv1103/1106也有算力。
匠芯创的D21X貌似也有算力。

据说算力最强的是rk3588s。
rk3588应该可以当个小电脑用了吧,应用场合肯定很广,总会有需要算力的地方吧。那么这些0.5T,1T的soc,他们的算力应用场合有哪些呢?

#322 Re: 全志 SOC » t113 udhcpc问题 » 2023-11-27 09:58:47

启动udhcpc前加个延时?

#323 Re: RISC-V » 性能最强的 RISC-V 内核单片机:HPM6750 » 2023-11-25 11:50:40

http://science.china.com.cn/2023-11/24/content_42608233.htm
今天看到这个消息,来转发一下。
hp5301, 8元,300M,没can,16位adc,开发板40元。

看了下sdk,gitee上有,rtos开发。

#324 Cortex M0/M3/M4/M7 » 常见单片机用的文件系统有哪些?各有什么优劣呢?比如fatfs,spiffs。 » 2023-11-23 09:08:18

Gentlepig
回复: 0

第一次见到单片机用的文件系统,是fatfs,当时买了个sipeed的longan开发板,有个例程是播放bad apple,通过spi读取tf卡内容,将一帧帧画面输出到spi lcd上。
常见fatfs貌似是存储sd卡这类介质,好像也直接操作spi flash。

看air32f103官方工程,也有fatfs例程,不过是操控sdio外设。

看esp教程,才知道还有个spiffs。

于是就想知道,对于单片机来说,如果用spi nor flash作为存储介质,有哪些常见的文件系统?各有什么优劣?

#325 Re: 硬件设计 KiCAD/Protel/DXP/PADS/ORCAD/EAGLE » 求助:在Linux系统下安装和使用Allegro的教程 » 2023-11-17 09:01:57

觉得pads挺好的,之前win下有pads精简版,可惜没有linux版本。
不喜欢lceda,虽然进步挺快的。kicad相对那三个,感觉还是差点意思。

个人喜好而已,我现在也想尽量在ubuntu下办公,尤其是有了kicad,qq for linux后。
现在就单片机编译我还是要切换到win下用mdk。gcc编译单片机程序还没搞懂。

#326 Re: 工业芯 匠芯创 » 评估板和样片购买方式说明,匠芯创ArtInChip » 2023-11-14 17:12:23

感觉不便宜啊。
d21x的开发板399。

---------------------------

额,看错,是带屏的价格,价格稍合理些。

#327 Re: 全志 SOC » 小智科技V853 / V853S 开发板 » 2023-11-08 09:10:27

问个问题,为什么摄像头板里有两个摄像头呢?

#328 Re: Cortex M0/M3/M4/M7 » 请教,daplink如何解除M3单片机的写保护? » 2023-11-02 09:18:42

好像openocd可以用daplink擦除读写保护,但在win下想找个图形界面的工具。

#329 Cortex M0/M3/M4/M7 » 请教,daplink如何解除M3单片机的写保护? » 2023-11-01 16:25:53

Gentlepig
回复: 7

程序里加了写保护设置语句,之前用stlink+stlink utiltiy工具,可以解除单片机的读写保护。
现在用daplink,下载、仿真,感觉还是挺方便的,但是不知道该如何解除单片机读写保护了。

#330 Re: Cortex M0/M3/M4/M7 » 函数里将一个错误的指针,指向的变量,改变了,结果执行完该函数后,直接退出该函数的上一层函数了,没有执行接下来的语句。 » 2023-10-28 08:48:22

演技担当黄晓明 说:

老哥你发现了异常回滚的逻辑了?恭喜了

Try
{
}
catch(Exception &ex)
{
}

可是,c语言没有try catch啊。

#332 Cortex M0/M3/M4/M7 » 函数里将一个错误的指针,指向的变量,改变了,结果执行完该函数后,直接退出该函数的上一层函数了,没有执行接下来的语句。 » 2023-10-25 16:07:03

Gentlepig
回复: 5

这个函数的作用是,将表示四则运算的中缀表达式,变成后缀表达式。

void infixToPostfix(char* infix, char* postfix)
{
    Stack s;
    initStack(&s);

    char* p = infix;
    char* q = postfix;

    while(*p != '\0')
    {
        ...
    }
    while (!isEmpty(&s))
    {
       ...
    }
    *(q - 1) = '\0';
}

infix字符串数组,如果给正确的字符串表达式,则程序运行正常。
可有的时候,没有给infix字符串数组赋值,结果全是0x00,结果运行这个函数后,跟紧该函数的其他语句,都没有执行,直接跳出上一层函数了。

想了想,估计问题是出在函数结尾这个*(q-1) = '\0',本来q指向postfix数组的开头,结果,因为给的infix里没有找到字符串或运算符,直接执行这一句了,那么就是将postfi数组的上一个地址里的数据赋值为0x00了。

我好奇的是,为什么造成的结果是跳过接下来的语句,直接返回上一层的函数了呢?

#333 Re: NXP i.MX6UL/6ULL » 如何彻底擦除emmc上的Boot分区? » 2023-10-25 15:57:52

我不知啊,买了野火的imx6ull mini板,就刚买时玩了玩,想在ubuntu下实现烧录,搜到了uuu这个工具,后来忘了咋样了,最后就是扔一边吃灰去了...
嵌入式linux 编译烧录这方面,没继续琢磨...

#336 Re: Cortex M0/M3/M4/M7 » 求助,定时器中断,实现1s led反转,-o3优化正常,其他优化均不正常。程序占用ram rom过大的原因? » 2023-10-21 15:05:56

问题找到了,在一个函数中,给某个数组赋值时,访问越界,比如int arr[8],结果我给arr[9]赋值了,于是进入hardfault_handler了。
更详细一点就是,本来NUMBER定义的比较小,这次我改大了,没注意到有个数组赋值时用到了这个宏定义。

//#define NUMBER 16
#define NUMBER 32
uint8_t arr[32];
for(u8 i = 0; i < 16+i+NUMBER; i++)
{
    arr[i] = 1;
}

而这个函数里,还调用了spi_flash_write(),于是我就以为是spi_flash操作引起了错误。

这能解释-o0会进入hardfault_hander(),但是为什么-o3优化能正常运行?
-o1,o2 led狂闪?

#337 Re: Cortex M0/M3/M4/M7 » 求助,定时器中断,实现1s led反转,-o3优化正常,其他优化均不正常。程序占用ram rom过大的原因? » 2023-10-21 11:56:30

有群友说,spi flash擦写比较耗时,然后我定时器中断比较频繁,我是用的10ms定时器。spi_flash_write()执行时,频繁中断耗尽了堆空间。
不过我还是不太明白...

#338 Re: Cortex M0/M3/M4/M7 » 求助,定时器中断,实现1s led反转,-o3优化正常,其他优化均不正常。程序占用ram rom过大的原因? » 2023-10-21 10:10:26

硬件仿真,对比-o1情况下定时器的寄存器情况,前20面正常时和后来狂闪时,发现定时器的重载定时器和控制器寄存器1没有变化。
-o0情况下,程序运行20秒后卡死,发现尽到了HardFault_Handler()。
根据https://blog.csdn.net/electrocrazy/article/details/78173558
定位到是spi_flash_write()函数。

挨个注释main主循环里的函数,发现注释掉保存数据到spiflash这个函数后,程序正常运行。那么,问题应该就是出在spi_ flash_ write这个函数了,但是我看网上大部分教程,原子、野火,大都是这么写的:

void SPI_FLASH_Write ( u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite )
{
    u32 secpos;
    u16 secoff;
    u16 secremain;
    u16 i;

    secpos = WriteAddr / 4096;
    secoff = WriteAddr % 4096;
    secremain = 4096 - secoff;

    if ( NumByteToWrite <= secremain )
        secremain = NumByteToWrite;

    while ( 1 )
    {
        SPI_FLASH_BufferRead ( spiFlashBuff, secpos * 4096, 4096 );
        for ( i = 0; i < secremain; i++ )
        {
            if ( spiFlashBuff[secoff+i] != 0xFF )
                break;
        }
        if ( i < secremain )
        {
            SPI_FLASH_SectorErase ( secpos * 4096 );
            for ( i = 0; i < secremain; i++ )
                spiFlashBuff[i+secoff] = pBuffer[i];
            SPI_FLASH_BufferWrite ( spiFlashBuff, secpos * 4096, 4096 );
        }
        else
            SPI_FLASH_BufferWrite ( pBuffer, WriteAddr, secremain );
        if ( NumByteToWrite == secremain )
            break;
        else
        {
            secpos++;
            secoff = 0;
            pBuffer += secremain;
            NumByteToWrite -= secremain;
            if ( NumByteToWrite > 4096 )
                secremain = 4096;
            else
                secremain = NumByteToWrite;
        }
    }
}

而且,为何优化等级不同,结果却不同?

#340 Cortex M0/M3/M4/M7 » 求助,定时器中断,实现1s led反转,-o3优化正常,其他优化均不正常。程序占用ram rom过大的原因? » 2023-10-20 17:08:58

Gentlepig
回复: 5

gd32f103,定时器10ms一中断,让一变量自增,其他函数里根据这个变量计数100次后置位1秒标值。main函数主循环里判断该标志位是否置位,是1的话,让led反转,并清该标志位。

mdk工程,之前是-o3优化等级,运行后正常。硬件仿真时,我改成了-o1优化,发现运行大概20秒后,led就不正常反转了。

-o3优化:led每秒反转,正常;
-o2优化,前20秒led能每秒反转,然后就变成很快的频率闪烁了;
-o1优化,前20秒led能每秒反转,然后就变成很快的频率闪烁了;
-o0优化,前20秒led能每秒反转,然后就变成很快常亮了;

程序比较大,有modbus数据区,占几k字节。编译后也比较占资源。

-o3:
Program Size: Code=31348 RO-data=1104 RW-data=504 ZI-data=24368 

-o2:
Program Size: Code=31408 RO-data=1104 RW-data=504 ZI-data=24368 

-o1:
Program Size: Code=33712 RO-data=1204 RW-data=504 ZI-data=24368 

-o0:
Program Size: Code=41236 RO-data=1204 RW-data=536 ZI-data=28656 

看了下-o3和-o2,应该是rom只差1k左右。

芯片是gd32f105vc,我查gd32f103vc是48k ram, 256k rom.

10ms定时器中断里自增的变量是volatile类型的,该变量整除100时置位的bool类型变量,也是声明成volatile类型的。

#342 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现? » 2023-10-16 09:17:01

@kin

这是专门为了我的需求写了个程序?太感谢了。

-----------------------------------

因为没有注释,有不少地方没看明白,比如各函数的用途,rpnbuf[ ]数组的用途。

reverse_polish_nnotatio_append_char()这个函数,
如果给的是'(',则压入stk里;
如果是')',则从stk里取出数据放到rpnbuf里;
如果是'&'或者'|',如果栈里没数据,则入栈,如果有数据,取栈顶数据,如果是'(',则将符号入栈,否则,将栈顶字符串出栈,存到rpnbuf数组里,不知道这里为什么要存到rpnbuf里。
如果是字符1-8,则直接存到rpnbuf里。

感觉rpnbuf像是完成后缀表达式的存放位置,但不确定。


run_exp( )函数里也有不明白的地方:
while((chr = exp[0])){...}这里只是判断下表达式的第一个字符吗?(这个明白了,while循环里有exp+=2,这样就会遍历整个输入字符串了)
那么这个while循环里,就会把输入表达式里的‘0-9, & , | ( )'分别代入到reverse_polish_notatio_append_chr( )函数里去处理
根据我在上一段落分析,‘0-9’是存到rpnbuf数组里的,‘(xxxx)'括号里的内容,也会存到rpnbuf里。
我的理解是,rpnbuf数组存放的是后缀表达式,但没看明白什么时候把逻辑符号放进去的。而stk是中缀转后缀时存放临时数据的,比如有括号情况下,将左括号及数据先放到stk里,如果再遇到右括号,则将数据从stk里取出来放到rpnbuf数组里。

#343 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现? » 2023-10-14 14:59:41

https://blog.csdn.net/crr411422/article/details/130306750

按这个文章里的代码抄了一遍,没用malloc申请栈空间,而是用了固定数组,把浮点数变量改成了uint8类型,在pc上gcc编译后,可以运行进行整数四则运算。
又将里边的“+-*/”改成了“&|”,可以进行逻辑运算。

$ ./test5
Enter an infix expression: 1&1
infix notation: 1&1
Postfix notation: 1 1 &
Result: 1
$ ./test5
Enter an infix expression: 1&(0|1)
infix notation: 1&(0|1)
Postfix notation: 1 0 1 | &
Result: 1
$ ./test5
Enter an infix expression: (1|1)&(0|1)
infix notation: (1|1)&(0|1)
Postfix notation: 1 1 | 0 1 | &
Result: 1
$ ./test5
Enter an infix expression: (0|1)&(1&0)
infix notation: (0|1)&(1&0)
Postfix notation: 0 1 | 1 0 & &
Result: 0
$ ./test5
Enter an infix expression: (0|1)&(1|0)
infix notation: (0|1)&(1|0)
Postfix notation: 0 1 | 1 0 | &
Result: 1

#344 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现? » 2023-10-13 15:10:55

4610 说:

@Gentlepig
不需要map,普通的线性表,数组表示
3in:map[8]
8in:map[256]

明白了,感谢。

@skrlaoshiren @小智
感谢。

#345 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现? » 2023-10-13 12:11:41

小智 说:

可以通过多维数字实现,定义一个多维数组uint32 map[2][2][2][2][2][2][2][2];上位机生成遍历数值,不就行了,8路输入,依次填入下标,输出值完成,最多是1K的真值表,搞定

看不懂这个map[2][2][2][2][2][2][2][2],每一个[2]对应一个输入的0和1两种状态吗?

依次填入下标,这句话也没看明白。是将遍历输入值,代入逻辑表达式吗?

#346 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现? » 2023-10-12 19:14:17

@4610
可是,单片机c语言没有map这种数据结构啊...

另外的问题就是,上位机如何根据输入逻辑关系,计算出真值表来...

-------------------------------------

好像有一点明白了,这是上位机计算真值表的方式,上位机枚举出256种组合,然后代入到表达式里看结果。

#347 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现? » 2023-10-12 17:29:26

@Gentlepig

才发现gpt给的真值表不对...
(x1|x2)&(x3|x4),就是1和2中有一个输入有效,且3和4中有一个输入有效,则满足条件。
结果发现2、3、4行,x1和x2都是零的情况下,out为1了...

#348 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现? » 2023-10-12 14:48:25

对于方法3,别墅业主群里很多群友推荐了。其中有朋友推荐了c4.c,我看到简介里写的c in four function。我以为是四则运算呢?结果晚上刷知乎搜c4.c才知道是实现了编译器...虽然里边也有四则运算符,也有与或逻辑运算符,但是我觉得对于我来说内容有深度了...
搜  使用栈完成算术表达式  搜到这么一篇文章,觉得不多:
https://www.cnblogs.com/inghzhang/p/3901334.html
还没仔细看。

#349 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现? » 2023-10-12 14:35:44

4610 说:
Gentlepig 说:
4610 说:

传真值表呗,
8in 8out 也就256字节

输入是8个,输出不确定,可能更多。

线性的,不是指数关系
32个输出  表1kb

没明白这里为啥是1kb?
输入的每种逻辑关系,只对应一种输出形式。所以表应该还是按输入的数量8来决定大小吧?输出只是一个4字节变量来控制32个输出,这样?

#350 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现? » 2023-10-12 14:07:08

感谢各位。

关于1里的真值表,我是没搞明白的,分别用1和0表示输入信号的有无,8个输入信号的话,组合就是2^8=256种。那么需要上位机算出这种比如(x1||x2)&&(x3||x4)这种情况下,对应的8个输入有那几种组合,如何输入满足的话,就控制输出。
问了gpt,列出来上式的真值表:

x1 | x2 | x3 | x4 | Output
---------------------------
 0  |  0  |  0  |  0  |   0
 0  |  0  |  0  |  1  |   1
 0  |  0  |  1  |  0  |   1
 0  |  0  |  1  |  1  |   1
 0  |  1  |  0  |  0  |   0
 0  |  1  |  0  |  1  |   1
 0  |  1  |  1  |  0  |   1
 0  |  1  |  1  |  1  |   1
 1  |  0  |  0  |  0  |   0
 1  |  0  |  0  |  1  |   1
 1  |  0  |  1  |  0  |   1
 1  |  0  |  1  |  1  |   1
 1  |  1  |  0  |  0  |   1
 1  |  1  |  0  |  1  |   1
 1  |  1  |  1  |  0  |   1
 1  |  1  |  1  |  1  |   1

可以看到output是1的就有13项,那么我需要判断输入信号是否是这13项里的其中一个,是的话,就满足。

这种方法的话,需要上位机计算出真值表里output为1的项目,把对应的输入状态,发给单片机吧?比如上式,就需要将

x1 | x2 | x3 | x4 | Output
---------------------------
 0  |  0  |  0  |  1  |   1
 0  |  0  |  1  |  0  |   1
 0  |  0  |  1  |  1  |   1
 0  |  1  |  0  |  1  |   1
 0  |  1  |  1  |  0  |   1
 0  |  1  |  1  |  1  |   1
 1  |  0  |  0  |  1  |   1
 1  |  0  |  1  |  0  |   1
 1  |  0  |  1  |  1  |   1
 1  |  1  |  0  |  0  |   1
 1  |  1  |  0  |  1  |   1
 1  |  1  |  1  |  0  |   1
 1  |  1  |  1  |  1  |   1

这些发给单片机去进行判断吧?
这样倒是简单些,但是实际应该把8个输入都考虑进去,这样最后就是就是一种输出结果可能对应着非常多的输入情况,比如几十个。

又想了想,应该真值表里的256项都写入单片机。单片机里利用switch()判断输入是否在真值表里对应的output是否为1,为1的话,说明输入满足逻辑关系。

#352 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现? » 2023-10-11 13:56:19

Gentlepig
回复: 28

单片机板有8个输入信号以及若干个输出信号。客户提出要求,希望能通过上位机来配置这8个信号的逻辑关系实现与或操作。头大,不知道该怎么实现。想过如下办法:
1,上位机传递输入信号的序号,然后将所有逻辑关系按序号排出来,将逻辑关系序号也发给单片机,单片机按需要去反推逻辑关系。但是可能的逻辑关系也太多了...
因为只有与和或两种逻辑关系,有群友指出有2^8种排列。
2,上位机发送输入信号的序号,然后再发送几组数据,每组数据包含两个参与操作的信号打序号,再包含一个逻辑关系。这样的话,需要上位机先推算出运算打先后顺序。上位机这里有点麻烦。
3,上位机直接将逻辑运算发送给单片机,包括括号以及运算符,这样上位机就简单了,但是单片机这里就很难了。
如果单片机收到的是类似“x1 && (x2 || x3)"这样的字符串,能否直接转化为可执行语句来执行?

请大家给个思路。

#353 Re: 全志 SOC » 嵌入式Linux是否适合做io控制来代替单片机板? » 2023-10-08 14:42:47

@DDER
还可以啊,检测下按键输入、控制继电器输出,能接受。

#354 Re: 全志 SOC » 嵌入式Linux是否适合做io控制来代替单片机板? » 2023-10-08 11:30:54

3050311118 说:
hotkey 说:

可以的,没啥问题,如果IO不够还可以用芯片外扩。注意下ESD防护。

我觉得实时性和安全性有要求的场合还是单片机合适点

想知道实时性能有多大差距?

#355 Re: 全志 SOC » 嵌入式Linux是否适合做io控制来代替单片机板? » 2023-10-08 11:29:37

dykxjh 说:

肯定可以啊,不跑系统的时候就是个大号的单片机。

问题是,想跑嵌入式linux。

#356 全志 SOC » 嵌入式Linux是否适合做io控制来代替单片机板? » 2023-10-08 08:50:20

Gentlepig
回复: 14

用t113-s3,tinasdk,做了个板,本来是打算收集单片机板发过来的can信息,然后发送到mqtt服务器上。
现在考虑,是否能把单片机板的功能也在t113-s3上实现,主要是检测多个按键输入,并控制多个继电器输出。
另,如果想给客户做二次开发,python或lua能否直接控制外设比如can。

#357 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » qt程序,想在循环里不停的进行modbusrtu读操作,结果串口只能发送出第一个字节来。 » 2023-09-15 11:51:48

达克罗德 说:

跨线程操作UI会出问题
QCoreApplication::processEvents();
跨线程signal应该也不工作了

其实这次没用到ui,不确定processEvents()有没有用。
跨线程信号和槽是可以用的,connect有第五个参数可以设置。

connect(modbusMaster->modbusProc, &ModbusProc::dataPointToSend, mqttClient, &MqttClient::updateDataPoint, Qt::QueuedConnection);

#358 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » qt程序,想在循环里不停的进行modbusrtu读操作,结果串口只能发送出第一个字节来。 » 2023-09-14 16:12:21

目前的程序是这样的:

void ModbusProc::modbusPoll()
{
    while (true)
    {
        foreach (int index, readList)
        {
            uint8_t funcR = dataPoint[index].funcR;
            uint16_t addr = dataPoint[index].addr;
            uint8_t dataLen = dataPoint[index].dataLen;
            uint8_t slave = dataPoint[index].slave;
            if (dataLen == 0)
                dataLen = 1;
            if (slave == 0)
                slave = 1;
            if (funcR == 1 || funcR == 2 || funcR == 3 || funcR == 4)
            {
                uint8_t readType;
                if (funcR == 1)
                    readType = QModbusDataUnit::Coils;
                else if (funcR == 2)
                    readType = QModbusDataUnit::DiscreteInputs;
                else if (funcR == 3)
                    readType = QModbusDataUnit::HoldingRegisters;
                else if (funcR == 4)
                    readType = QModbusDataUnit::InputRegisters;
                else
                {
                    continue;
                }
                QModbusDataUnit readData((QModbusDataUnit::RegisterType)readType, addr, dataLen);
                QModbusReply *reply = modbusDevice->sendReadRequest(readData, slave);
                if (reply)
                {
                    if (!reply->isFinished())
                    {
                        qDebug() << "modbus reply is not finished." << endl;
                        QEventLoop loop;
                        QObject::connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
                        loop.exec();
                    }
                    if (reply->error() == QModbusDevice::NoError)
                    {
                        qDebug() << "modbus reply is finished." << endl;
                        currentIndex = index;
                        delete reply;
                    }
                }
                else
                {
                    qDebug() << "Read request failed";
                    delete reply;
                }
            }
            QCoreApplication::processEvents();
            QThread::msleep(10);
        }
        QCoreApplication::processEvents();
        QThread::msleep(10);
    }
}

现在设置的modbus的超时时间是50ms,每发送一次后有个线程的延时10ms,算下来应该是60ms一帧数据。实际pc端收到的数据,大概是110ms左右。
一帧8个字节。

设置超时时间为100ms,结果pc端收到数据的间隔,大概是160ms左右。

#359 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » qt程序,想在循环里不停的进行modbusrtu读操作,结果串口只能发送出第一个字节来。 » 2023-09-14 15:54:37

按以上的方法,在循环里,QModbusRtuSerialMaster的sendReadRequest()后,用事件循环等待QModbusReply的finished信号。
一开始,QModbusRtuSerialMaster的超时时间timeout设置为10ms,结果串口数据大约是1秒发送一次。修改timeout为100ms后,串口发数频率才正常。尝试了多个数据后发现,50ms以上正常,50ms以下,就变成了1秒发一帧。不知道这是为什么。

#360 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » qt程序,想在循环里不停的进行modbusrtu读操作,结果串口只能发送出第一个字节来。 » 2023-09-13 16:58:28

Gentlepig
回复: 5

用的qt的Modbus库,想在子线程里不停地进行modbus读操作,写了这么个函数。
如果只执行一次的话,串口能输出正确的数据,或者用定时器定时调用这个函数,串口也能不停地输出数据。
但是如果在while循环里不停的调用这个函数的话,则串口只会输出第一个字节。

void ModbusProc::modbusPoll()
{
    while (true)
    {
        readDataPoint();
        QCoreApplication::processEvents();
        QThread::msleep(1000);
    }   
}   
void ModbusProc::readDataPoint()
{
    if (!modbusDevice)
        return;
    QModbusDataUnit readData(QModbusDataUnit::InputRegisters, 10, 2);
    QModbusReply *reply = modbusDevice->sendReadRequest(readData, 01);
    if (reply){
        if (!reply->isFinished())
        {
            qDebug() << "modbus reply is finished." << endl;
            // delete reply;
        }
        else
        {
            qDebug() << "modbus reply is not finished." << endl;
            delete reply;
        }
    }
    else
    {
        qDebug() << "read request failed" << endl;
    }
    QThread::msleep(100);
}

按gpt的回答,加了QEventLoop事件循环,算是死等发送完成,可以正常工作了。

void ModbusProc::readDataPoint()
{
    if (!modbusDevice)
        return;
    QModbusDataUnit readData(QModbusDataUnit::InputRegisters, 10, 2);
    QModbusReply *reply = modbusDevice->sendReadRequest(readData, 01);
    if (reply){
        if (!reply->isFinished())
        {
            qDebug() << "modbus reply is finished." << endl;
            // delete reply;
            QEventLoop loop;
            QObject::connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
            loop.exec();
        }
        else
        {
            qDebug() << "modbus reply is not finished." << endl;
            delete reply;
        }
    }
    else
    {
        qDebug() << "read request failed" << endl;
    }
    QThread::msleep(100);
}

请教,单次执行时不需要死等,为什么连续循环就需要死等?除此之外还有其他办法吗?

#361 Re: 全志 SOC » 请问大侠,我这个是什么型号啊? » 2023-09-08 11:56:12

看到了friendly,就去友善搜了下,貌似是H5。
http://friendlyelec.com.cn/nanopi-neo-plus2.asp
-----------------------------------------------------------------------------
看错了,多了网口,usb也变成2个了。

#362 Re: 全志 SOC » 【T113】nandspi可以烧录,但是Linux系统启动到init时卡死 » 2023-09-07 13:47:20

@sunblackshine

我也是两层板,不过走线尽量走顶层,底层有大面积地。看你原理图上画的是w25q256,这个是16M的 spi nor flash吧?你确定和参考的板子一样?

#363 Re: 全志 SOC » 【T113】nandspi可以烧录,但是Linux系统启动到init时卡死 » 2023-09-07 08:55:23

spi.png
spi1.png
spi2.png
soc.png
这部分我是照抄的mq_r的。
我这里确实也有这个33R电阻,其他的区别,就是我接了那3个10K上拉电阻。我这里是可以正常烧录的,我用的w25n01。我都没走等长线...

你原理图上是spi nor flash,是不是需要修改启动配置?
mosi和miso这里是不是需要设置下启动配置?还有,我记得tina sdk里有个fex文件里,也有启动选项配置。

或者,你找个其他的镜像烧写下试试。

想了想,你这都能烧写了,也能启动了,不一定是硬件问题吧?

#364 Re: 全志 SOC » V3S采用BSP方案, 启动后free显示总内存只有38M... » 2023-09-06 16:26:22

v3s是固定64M内存吧,好像内核会占用一部分内存,所以total小于实际物理内存。

#367 Re: 全志 SOC » 【T113】nandspi可以烧录,但是Linux系统启动到init时卡死 » 2023-09-06 08:45:52

我参考的mango的mq_r的板子,spi nand的1、3、7脚有10k上拉电阻。

2、5脚也有上下拉电阻进行启动配置。

6脚你这里串了个电阻,不知道是多大的,我参考的貌似没见过这个电阻。

----------------------------------------

看错,pcb中有向右侧引出这些线。

#368 Re: 华芯微特 » 基于华芯SWM341+PhoenixUI的屏幕 » 2023-09-06 08:41:38

搜PhoenixUI搜到几个相关的,有react的,有jave的...

#369 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » 请教:新唐的NUC970系列好兆易GD32H7系列做HMI开发组太屏,哪个更合适 » 2023-08-31 15:05:29

t113-s3挺好,价格降到30.9元了,lqfp封装,128M内存,有双can,有网口,我觉得挺香。

-----------------------------------------------------------------

发完回帖才看到不要linux...

#370 Re: 全志 SOC » 做了5块板子,有一块板子用udhcpc获取ip地址总是不成功。 » 2023-08-23 10:55:55

汇报下今天的进展。
感谢坑网群里的吴师、周师两位群友,给了我很多指导。

在次把吴师在群里的部分回复汇总下。
1. 可以看到灯亮! tx, rx , 25M 不用看;
2. 可以抓到芯片 mdc, mdio 不用看;
3. 所以只要看  rmii  的 txd, rxd, txen , rxdv , clk;
   工作正常! mdc, mdio 可以读寄存器, rst 不用看;

1. pc 和 版子 都设置固定 ip;
2. 使用 版子来 ping pc 的 ip , 此时在 pc 端,打 arp;
3. 再反向,pc 去 ping 版子,板子打 arp ,看看有没有 pc 的 mac 地址
若是有一边有! 一边没有,那就只要解决 tx 或 rx 即可;
例如! pc 看不到版子的 mac , 但是板子可以看到 pc 的!
这样就是 rx 是正常的! 只要解决 tx 的就行!

经测试,pc ping arm板,arm板可看到pc地址,反之不行。结论,arm板rmii发送有问题,集中在了txd0、txd1、txen三条线上。
用示波器测量,发现txd0、txd1上有波形,txen一直低电平。所以是txen有问题,可能和想临的焊盘短路了。暂时还未确定是哪个位置。

#371 Re: 全志 SOC » 做了5块板子,有一块板子用udhcpc获取ip地址总是不成功。 » 2023-08-23 08:53:14

wupaul2001 说:

查查MDIO和MDC, init error是这两没通信正常

对换sr8201后,没有这个init hardware error了,但是仍无法获取ip。

#372 Re: 全志 SOC » 做了5块板子,有一块板子用udhcpc获取ip地址总是不成功。 » 2023-08-23 08:51:49

memory 说:

@Gentlepig
board.dts 里面可以改一下 phy 的 tx 和 rx 参数,改大或者改小试一试。

是修改phy收发管脚的驱动能力吗?问题是其他四块板正常。

#373 Re: 全志 SOC » 做了5块板子,有一块板子用udhcpc获取ip地址总是不成功。 » 2023-08-22 15:33:14

memory 说:

中间打了过孔吗?

我去,回复真快啊。以前发个帖子上午发帖下午才审核通过...

打孔指的是t113和sr8201的gnd焊盘吗?
t113-s3在底部打了个很大直径的过孔,焊接时灌锡。8201这里是在底部gnd焊盘上打了9个0.3mm直径的过孔。吹下来8201时测量过,这个焊盘和底部gnd是通的。

#374 全志 SOC » 做了5块板子,有一块板子用udhcpc获取ip地址总是不成功。 » 2023-08-22 15:18:48

Gentlepig
回复: 8

t113-s3 + sr8201,网口部分抄的jlc上开源的的板子。总共做了5块,4块网络正常,就1块网络总是连不同。
一开始是网口灯都不亮,后来发现25M晶振有个管脚和外壳GND连了。重新焊接晶振后,有25M晶振波形了,网口link灯能闪烁。
但是如果执行udhcpc,则报错:

sunxi-gmac 4500000.eth eth0: Initialize hardware error

然后linkled灯就停止闪烁了。

以为是sr8201坏了,然后手头也没多余的8201了,就和另一块位网络正常的板子,对掉了sr8201。
结果对掉后,原来网络正常的板子,网络还是正常。
而这块有问题的板子,执行udhcpc后,不再报哪个错误了,linkled灯也始终保持闪烁。但是就是获取不了ip。

root@TinaLinux:/# udhcpc
udhcpc: started, v1.27.2
[  502.500278] libphy: 4500000.eth: probed
[  502.504630] sunxi-gmac 4500000.eth eth0: eth0: Type(7) PHY ID 001cc816 at 0 IRQ poll (4500000.eth-0:00)
udhcpc: sending discover
udhcpc: sending discover
[  506.766651] sunxi-gmac 4500000.eth eth0: Link is Up - 100Mbps/Full - flow control off
[  506.775419] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
udhcpc: sending discover

依照群友的建议,用ifconfig直接设置ip,然后和pc互ping,pc找不到arm板,arm板也ping连接不上。

8201的1脚RSET管脚应该接2.49K电阻,手头没有,之前是并联了4.7K和5.1K,算了下大约2.45K。怀疑是这个电阻阻值的问题,直接并联了4个10K电阻,应该是2.5K左右了。但问题依旧。
测量了1.0V输出,有1.1V左右电压。也是正常的。

可能的原因:
1,  sr8201焊接问题,但是吹下来过三次了...  不过还是这个问题最大,因为对掉过一次8201后,不再出现“Initialize hardware error”这个错误了。
2,  sr8201坏了?对掉过一次8201,以为有问题的8201焊接换到其他板子上能正常工作联网。
3,  t113-s3 坏了?
4,  晶振坏了?目前测试有25M波形。
5,  网络端口坏了?用的是HR913129AE,看到的例子是911105A,不过库房里有这个就用了,其他还有两块也是用的这个型号,网络正常。 而且查拔网线有link is down或link is up提示。
6,  周边阻容虚焊?在不通电的情况下测试了周围的电阻组织,主要是4.7K和1.5K,都正常,2.5K也近似。而且,也手动重新焊了一边阻容两端。

1_20230822-1522.png
2_20230822-1522.png
3_20230822-1522.png

#376 Re: 全志 SOC » 貌似 MDK 真的不能调 Cortex-A7 内核的 V3s » 2023-08-19 13:58:14

dykonka 说:

新唐MA35D1能用MDK吗

能买到芯片了?

#378 Re: 全志 SOC » 想用qtcreator通过ssh调试板子上运行的qt程序,结果总是通不过。 » 2023-08-16 17:44:14

想改为rsync方式,结果下载rsync源码下来,configure --host=arm-linux CC=XXX,结果有4个库文件及头文件找不到,ssl,lbmz4等。也不知道该怎么指定,暂时放弃rsync方式。

尝试板子运行gdbserver,pc运行gdb,然后target remote=xxx,可以运行及调试,就是不知道如何设置断点。可以break main,在main函数处设置了断点,但是想在main.cpp其他行设置断点,break main.cpp:43,结果报错,找不到main.cpp。

qtcrator可以通过remote方式连上板子运行程序,就是设置的断点无法停止。

#379 Re: 全志 SOC » 想用qtcreator通过ssh调试板子上运行的qt程序,结果总是通不过。 » 2023-08-15 10:31:43

kit构建套件里,设备类型选为 remote linux device的话,如果编译器这里选交叉编译器,则pro文件就不能正常打开,出现qmake_cxx找不到compile_macros定义。
但是,保持设备类型不变,改为pc上用的gcc和gc++,则就能正常打开工程。

于是怀疑是交叉编译器的问题,就又建立个kit,设备类型选为 桌面,仍用交叉编译器,结果pro文件可以正常打开,可以构建生成可执行文件。

------------------------------------------------------------

run选项里有个build device,这里应该选local pc,我之前选的是remote linux devce。改了这里后就没那三个报错了。

我看的是原子的教程,到这里后,该通过ssh和scp命令往板子里拷贝程序,是在qtcreator里的自定义的部署命令里实现的:

ssh -p %{Device:SshPort} %{Device:UserName}@%{Device:H
ostAddress} 'mkdir -p %{CurrentRun:Executable:Path}'

可是qtcreator里没有CurrentRun这个参数,所以又卡到这里了。

------------------------------------------------------------

记录以下qtcreator使用gdb遇到的问题,pc上的gdb和板子上的gdbserver是用同一份原文件编译出来的。结果qtcreator里按f10进入单步调试,提示gdb不支持python脚本。网上搜了说编译时要加--with-python,结果编译时报错,make distclean后,又删了gdb/cache啥的,报错改变了,找不到python,我板子上python默认时python2,改为指向python3后,报错又变了,提示有些python库快要遗弃了,然后又报错找不到python。继续搜,说要安装python-dev。现在用的是python3.10,就安装了python3.10-dev。通过编译了。然后make install。
但是qtcreator里无论用f5还是f10,貌似都不在设置的断点地方停下来...

#380 Re: 全志 SOC » 想用qtcreator通过ssh调试板子上运行的qt程序,结果总是通不过。 » 2023-08-14 09:04:32

现在先用的是qt的一个例程,modbus master例程。如果kit套件里,不选择为远程linux设备,而选择本地编译,仍选择交叉编译的gcc,则可以生成可执行文件,拷贝到arm上可以运行。

kit套件里,设置为远程linux设备,则应该是无法正常打开工程,左侧工程列表里只有pro文件,而看不到头文件、源文件等。

-----------------------------------------

arm板子启动sshd时有这个警告:

/sshd start                                        
root@TinaLinux:/etc/init.d# /etc/rc.common: line 128: procd_add_mdns: not found

不过pc上用ssh可以登陆这个板子。

----------------------------------------

qtcreator里设备这里点击测试,有如下:

Sending echo to device...
Device replied to echo with expected contents.

Checking kernel version...
Linux 5.4.61 armv7l

检查指定端口是否可用...
所有指定的端口都可用。

Checking whether "sftp" works...
"sftp" failed with exit code 255: 
Connection closed.  
Connection closed


Checking whether "rsync" works...
"rsync" failed with exit code 127: ash: rsync: not found
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: remote command not found (code 127) at io.c(231) [Receiver=3.2.7]


Deployment to this device will not work out of the box.

设备测试失败。

虽然有stfp和rsync报错,但是没打算用这两个。

show running process也可以显示板子上运行的进程。
open remote shell也可以打开终端并链接。

-------------------------------------------------------

板子上没装gdb server,pc上也没有交叉编译的gdb。正在装。

-------------------------------------------------------

tina sdk里勾选了gdb和gdb server,编译后也生成了对应的程序。不过不知道怎么用,现在qt creator还是提示原来的错误。

-------------------------------------------------------

其实板子上只用gdb server就行了。我之前以为pc上需要用到交叉编译的gdb,其实是不行的,得用pc版的gdb。我尝试用ubuntu自带的gdb,结果版本太高,链接后,出现了个too long的错误。在pc上重新源码编译gdb,让gdb和gdbserver用的是同一份源码,就没那个问题了。
arm板上:gdbserver :1234 ./test
pc端:arm-linux-gdb ./test    注意这个arm-linux-gdb只是个名字,并不表示这是交叉编译出来的gdb。
然后gdb命令行中,target remote 192.168.1.xxx:1234 
开始执行程序后,按c是直接运行程序了。其他还在研究。

而帖子里一开始的报错,和gdb貌似无关。现在还没解决。

#381 Re: 全志 SOC » 想用qtcreator通过ssh调试板子上运行的qt程序,结果总是通不过。 » 2023-08-14 08:48:20

海石生风 说:

编译器是MSVC吧?换用GCC编译器,Windows版的叫MinGW
PS:现在的新手在提问时老是只给出少得可怜的相关信息,别人看了也懒得追问,于是没人鸟。

感谢回复。
PC环境是ubuntu22.04, gcc11。

之所以想用qtcreator+ssh调试板子上运行的程序,是因为编译的程序在板子上运行后卡死,通过adb shell进入后top发现,该程序进程CPU占用率50%,另50%是adb shell占用。
Q群里请教了调试方法,有网友指明可以qtcreator+ssh调试,可以打断点。

#382 全志 SOC » 想用qtcreator通过ssh调试板子上运行的qt程序,结果总是通不过。 » 2023-08-11 17:42:47

Gentlepig
回复: 5

板子已经打开sshd服务了,pc上终端可以通过ssh登陆板子了。
qtcreator打开选项-设备,选择remote linux设备,输入ip地址相关,旁边有个按钮,可以打开shell登陆板子。说明这部分没问题。
但是kid设置后,工程里,选择run,结果总是报错。

/xxx/AllWinner/t113s3/qt-everywhere-opensource-src-5.12.9/t113-qt/mkspecs/features/toolchain.prf:76: error: Variable QMAKE_CXX.COMPILER_MACROS is not defined.
:-1: error: Project ERROR: failed to parse default search paths from compiler output
/XXX/Qt5/t113-s3/modbusmaster/master.pro:-1: error: 分析文件/XXX/Qt5/t113-s3/modbusmaster/master.pro时发生错误,放弃中。

#383 Re: 哇酷地摊(跳蚤市场) » 求购一个stm32开发板 » 2023-08-11 13:43:28

合宙9.9元的air32f103开发板,买两个,一个当daplink给另一个板子下载程序用。

#385 全志 SOC » 请教,交叉编译个源码工程,报错找不到FILE结构体定义。 » 2023-08-10 10:09:17

Gentlepig
回复: 0

请教个问题,交叉编译个源码工程,报错找不到FILE结构体定义。
搜了下,说这个一般是需要#include <stdio.h>
看了下ubuntu系统里的/usr/include/stdio.h,里面是包含了多个bit/目录下的头文件,其中就有types/FILE.h。

我在t113-s3的tina sdk里搜FILE.h,只在两个risv目录下搜到了,但是prebuild/gcc/的arm目录下没有。

tinasdkv21/tina-d1-h$ find . -name FILE.h
./lichee/brandy-2.0/tools/toolchain/riscv64-linux-x86_64-20200528/sysroot/usr/include/bits/types/FILE.h
./prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/sysroot/usr/include/bits/types/FILE.h

搜到的两个,都是在sysroot目录下,但是arm工具链目录下没sysroot目录。

#386 Re: Cortex M0/M3/M4/M7 » 灵动微 MCU 开发板赠送活动 » 2023-08-08 08:53:49

我觉得合宙一直搞的9.9元各种开发板挺好的,还可以当daplink用。

别免费送,价格低一点,量大一点,活动持久一点。

#387 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,mqtt程序连上服务器后,拔掉网线,如何检测mqtt是否断线? » 2023-08-07 10:26:13

wonderxue 说:

@Gentlepig
我看mqtt不是有报文pingreq和pingresp吗
你发送pingreq,没接收到pingresp就判断网络有问题。

谢谢,确实有pingresp信号,不过本来设计的是三五分钟通讯一次,这样的话,就变成比较频繁的通讯了。
暂时放弃了led指示mqtt连接状态的想法。

#388 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,mqtt程序连上服务器后,拔掉网线,如何检测mqtt是否断线? » 2023-08-05 09:24:01

用的emqx的qmqtt程序,setKeepAlive(30),这样算是设置成30秒心跳包了吧?
我是在定时器里每5秒调用isConnectedToHost()函数。
测试结果,有时候拔掉网线后,四五十秒左右返回false,有时候则不行,过了几分钟仍返回true。

-------------------------------------------

如果放的足够久,还是可以返回false的,就是太久了,好几分钟...
感觉是不是我心跳包没设置好?

#389 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 请教,mqtt程序连上服务器后,拔掉网线,如何检测mqtt是否断线? » 2023-08-04 17:06:40

Gentlepig
回复: 4

项目中用到mqtt,有个led灯想指示下mqtt的连接状态。

qt5+qmqtt库,连上网络后拔掉网线,没有触发disconnect和error信号,isConnectedToHost()返回的也是true。
先拔掉网线再运行程序,就可以触发error()信号,isConnectedToHost()返回也是false。

请教,如何检测mqtt的连接状态?

#390 Re: 全志 SOC » V3s真的停产了吗? » 2023-08-02 09:07:15

V3S有can接口吗?有的话,v3s比t113-s3价格更合适啊。

#391 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 请教,交叉编译qt源码时,configure参数里的-rpath和是指的动态链接库的路径还是静态链接库的路径? » 2023-07-31 15:39:43

想将usb口模拟串口使用。
内核配置里选了usb gadaget support里的serial gadaget,配置成了M动态加载驱动。make后usb/gadget目录下有3个.ko文件,g_serial.ko和两个usb相关的.ko。
复制到板子上,执行insmod xxx.ko,结果g_serial.ko报错。原来是adb和usb serial不能同时用。adb功能是根文件系统里配置的,本想去关掉,群友说用setusbconfig none命令即可。

#392 Re: 全志 SOC » T113-S3 一个很奇怪的USB问题 » 2023-07-31 09:26:27

警告信息如下:

[   12.136914] sunxi_vbus_det_work()3493 WARN: get power supply failed
[   12.196217] sunxi_set_cur_vol_work()489 WARN: get power supply failed

#393 Re: 全志 SOC » T113-S3 一个很奇怪的USB问题 » 2023-07-29 14:24:02

wupaul2001 说:
Winston 说:
wupaul2001 说:

电源问题,换个好点的电源就没事了,我的产品也遇到

ok谢谢!目前也是打算换电源.

最近又遇到了,把设备树usb_otg设为disabled好了

没找到usb_otg这个变量,在内核设备树里关于usb0的是这样的,usb_port_type = 0已经算是device了,但调适口还是有那些信息。

   0     &usbc0 {                                                                                            │  sys_config.fex*
   1     device_type = "usbc0";                                                                          │  sys_partition.fex*
   2     usb_port_type = <0x0>;                                                                          │  uboot-board.dts*            
   3     usb_detect_type = <0x0>;                                                                        │~                             
   4 /*  usb_detect_mode = <0>;                                                                          │~                             
   5     usb_id_gpio = <&pio PB 8 GPIO_ACTIVE_HIGH>;                                                     │~                             
   6     enable-active-high;                                                                             │~                             
   7     usb_det_vbus_gpio = <&pio PB 9 GPIO_ACTIVE_HIGH>; */                                            │~                             
   8     usb_wakeup_suspend = <0>;                                                                       │~                             
   9     usb_serial_unique = <0>;                                                                        │~                             
  10     usb_serial_number = "20080411";                                                                 │~                             
  11     rndis_wceis = <1>;                                                                              │~                             
  12     status = "okay";                                                                                │~                             
  13 };          

#394 Re: RK3288/RK3399/RK1108 » RV1103/RV1106 裸奔日记 » 2023-07-26 17:33:53

Timaker 说:
xboot 说:

这个芯片比F133/D1S/T113便宜,有价格优势

好像含税25左右,等大佬出板子

现在淘宝上搜到的是40。

#397 Re: 全志 SOC » t113-s3打开can失败,感觉象是没打开can时钟? » 2023-07-20 15:20:15

linux-5.4/drivers/clk/sunxi-ng/ccu-sun8iw20.c
该文件里, 缺少这几行:

static SUNXI_CCU_GATE(bus_can0_clk, "bus-can0", "apb1", 0x92c, BIT(0), 0);
static SUNXI_CCU_GATE(bus_can1_clk, "bus-can1", "apb1", 0x92c, BIT(1), 0);
  &bus_can0_clk.common,
  &bus_can1_clk.common,

在mango sdk里,是默认就有这些的。
注意,修改后,再mp,结果还是会报同样的错误,但是在linux目录下make clean后,然后顶层目录下mp就没事了。

#398 全志 SOC » t113-s3打开can失败,感觉象是没打开can时钟? » 2023-07-19 09:10:11

Gentlepig
回复: 1

按aw-ol的这个帖子修改的。
之前用的mango sdk,也是按这个修改后,can功能可以正常使用。这次用了tina linux 2.1,结果按帖子配置后,配置can波特率失败。
https://bbs.aw-ol.com/topic/1383/t113-s3-can%E6%A8%A1%E5%9D%97%E4%BD%BF%E7%94%A8%E7%9A%84%E5%85%A8%E9%83%A8%E4%BF%A1%E6%81%AF

root@TinaLinux:/# ip link set can0 type can bitrate 100000                      
[77081.499110] sunxi_can 2504400.can can0: 0-3343301252-0                       
[77081.504850] sunxi_can 2504400.can can0: bitrate error 100.0% too high        
RTNETLINK answers: Domain error 

在drive/net/can/dev.c里的
static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt, const struct can_bittiming_const *btc)
函数里找到了对应报错信息:

188      if (bitrate_error > CAN_CALC_MAX_ERROR) {
   1       netdev_err(dev, "%u-%u-%u\n", bitrate, bt-bitrate, priv->clock.freq); //any
   2       netdev_err(dev,
   3            "bitrate error %d.%d%% too high\n",
   4            bitrate_error / 10, bitrate_error % 10);
   5       return -EDOM;
   6     }

结果priv->clock.freq是0.
我觉得可能是没打开can时钟,那么,在哪里打开呢?

#399 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 请教,交叉编译qt源码时,configure参数里的-rpath和是指的动态链接库的路径还是静态链接库的路径? » 2023-07-14 10:04:28

哇酷小二 说:

建议用 buildroot。

硬件是t113-s3,用的tina sdk。2.0时,有qt选项,但是默认配置编译通不过,按群友的文件修改makefile去掉gpu相关,可以编译了,就是qmake有问题。
这次用了tina sdk 2.1,默认没有qt,只好搜网上教程手动移植。

#400 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 请教,交叉编译qt源码时,configure参数里的-rpath和是指的动态链接库的路径还是静态链接库的路径? » 2023-07-14 08:58:26

Gentlepig
回复: 8

交叉编译qt源码时,增加了openssl选项,结果报错。
我选的时-openssl-linked,这是静态连接openssl吧?报错找不到libcrypto.so,提示用-rpath或-rpath-link。
我直接用了-R 库路径,竟然通过编译了。于是好奇 -rpath, -rpath-link, -R的作用。
configure -h时发现有-rpath和-R的选项,看描述,两者相似。没找到-rpath-link描述。
而看描述,前两者是用来制定动态链接库的路径的,而我这里是静态连接库,为何也能其作用?

qt  warning: libcrypto.so.1.1, not found (try using -rpath or -rpath-link)
 -R <string> .......... Add an explicit runtime library path to the Qt
                         libraries. Supports paths relative to LIBDIR.
  -rpath ............... Link Qt libraries and executables using the library
                         install path as a runtime library path. Similar to
                         -R LIBDIR. On Apple platforms, disabling this implies
                         using absolute install names (based in LIBDIR) for
                         dynamic libraries and frameworks. [auto]

#401 全志 SOC » 嵌入式linux板,如果做产品的话,是不是就不该留调试接口? » 2023-07-10 09:39:06

Gentlepig
回复: 7

如果保留的话,别人通过调试口就能把应用程序读出来了。

1,内核里关闭调试串口功能,关闭adb功能。
2,保留调试口,设置登陆账户及密码。
3,其他没想到,群友有说禁用外部读写功能(还没去搜如何实现)。

#402 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-07-07 17:35:45

tina sdk 2.1不带qt了,需要自己单独编译。之前2.0时默认带的是qt5.12.9。这次想尝试下qt5.15.10。
由于gcc版本过高,之前编译qt5.12源码时,需要在几个文件里手动加#include <limts>,否则有几个std::报错。
而qt5.15就没这个问题。但是,尝试加openssl时,报错了,最后看config.log才发现,qt5.15支持的openssl版本是1.1.1,而sdk带的是1.1.0。
sdk默认make menuconfig里openssl基本没勾选子项目,需要勾选一些。

#403 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-07-05 09:42:07

加了个新的硬盘,在新硬盘上重新安装了ubuntu22.04,尝试官方的tina sdk 2.1版本。
从aw-ol上下载了t113的补丁。
https://bbs.aw-ol.com/topic/2027/%E4%B8%80%E4%B8%AA%E8%A1%A5%E4%B8%81-%E8%AE%A9d1-h%E7%9A%84sdk%E6%94%AF%E6%8C%81t113%E8%8A%AF%E7%89%87
https://github.com/YuzukiHD/TinaAddons
这样d1-h的sdk就支持t113-s3了。make时报错,c-stack错误,搜了下,说要升级m4版本,或者打补丁。
https://bbs.aw-ol.com/topic/171/%E6%9E% … 8518359186

遇到个问题,在这里反馈一下。在ubuntu22.04上,m4编译会报一个错:
c-stack.c:55:26: error: missing binary operator before token "("
55 | #elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384
|
这里可以去https://toolchains.bootlin.com/downloads/releases/sources/m4-1.4.18/ 下载0003-c-stack-stop-using-SIGSTKSZ.patch
然后拷贝package/m4目录下重新编译即可。

补丁放到了out/compile/xxx/m4目录下,执行patch -p1 < xxx.patch。则该问题解决。

------------------------------------------------------

https://blog.csdn.net/bbssuiji2/article/details/124426318

#404 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-06-29 11:45:29

再记录一下,qt程序modbus做从机,设置数据点,一种类型只能设置一次,多次设置的话只有最后一次有效。比如定义04功能码读输入寄存器,如果地址不连续,有4300, 5300两个地址,那么不能设置两次,只能设置一次,设初始地址为4300,数量为1000个。

---------------------------------------------------------------------------

上个楼层里说的那个加延时,也是没必要的。尝试把延时去掉了,modbus超时时间设为最小的50ms,重试次数设为0,也就是只发一次,波特率9600的情况下,收发正常。如果超时时间设为100ms, 9600波特率下,大该两次正常通讯后就有一次通讯超时,500ms,大部分情况下出错,应该是发送被分帧了。还没明白其中原因。

---------------------------------------------------------------------------

在reply收到数据后,调用下一次poll前,加的这个延时,尝试减小,由50ms减小到了5ms,只要这个延时存在,超时时间设大也没事,设置成500ms超时,重试2次,仍能正常通讯。但是这个延时时间再小,就又出现通讯错误了。是不是需要等待发送完成,发送目前的8个字节需要一定时间?有这个可能,9600波特率下发送一个字节大该833us,8个字节大该是6.6ms。如果是这样的话,那发送数据较长时,这个延时也该变化,不好整啊。

--------------------------------------------------------------------------

群里一位朋友解释了,modbusrtu通讯本身就需要发送间隔大于3.5个字符间隔。9600波特率下对应差不多4ms。这么说,应该是发送粘包了...

#406 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-06-27 17:22:17

这阵子在用qt的modbus库,记录一下。
modbusdevice有两个设置,超时时间和重试次数。超时时间最小值是50,如果小于这个值,可能会按一个比较大的值处理。
另,发送时间,需要大于处理时间,最好是考虑到设备未返回数据的情况,也就是发送周期间隔,最好大与超时时间*重试次数,否则reply还未delete就会重新创建,内存占用会越来越大。
我是在子程序里进行modbus读写处理的,在收到返回数据后,reply->deleteLater(),然后再重新下个读写。发现经常出现超时的情况。加了个QThread::msleep(50),则不会出现读取超时了。尝试小于50的值,也是会出现读取超时的问题。观测slave端,感觉想是slave收到的数据被分成了两帧,所以没有返回,然后就超时了。感觉还是reply处理影响了串口发送?

#407 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » arm linux, qt linuxfb, 虚拟键盘无法显示出来。 » 2023-06-20 09:34:41

Gentlepig
回复: 0

qt有个virtualkeyboard库,编译后,pro文件里加:

static {                      
    QT += svg                             
    QTPLUGIN += qtvirtualkeyboardplugin  
}   

main.cpp里加:

    qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));   

编译pc版,可以运行。

交叉编译产生库,然后交叉编译个应用程序,烧到板子上,结果没反应。

嵌入式板里也设置了环境变量:

export QT_IM_MODULE=qtvirtualkeyboard

但,无效果。

#408 Re: 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 坑网的优势是F1C100S裸跑资源丰富 » 2023-06-15 08:48:51

nishiwodea 说:

希望全志可以出更好的片子吧,F1C感觉性能和外设上差那么一点点。

觉得t113-s3挺好,就是有点贵,目前39,再降10元就好了。:D

#409 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-06-14 17:35:21

程序里调用这句配置can:

system("ip link set can0 type can bitrate 250000");

程序可正常运行,can通讯正常。但是如果设程序开机后后台运行,则会报错:

ip:either "dev" is duplicate, or "type" is garbage 

--------------------------------------------------------------------------

之前程序开机启动放在/etc/init.d/S99xx里面。后来放在/etc/profile的最后一行,可以了。感觉配置can时需要甬道的ip(ip router2)命令,可能在执行完/etc/profile后才有效,也不知道为什么。

#410 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-06-14 10:23:18

alien75 说:

t113-s3有uart0,所以uart3才是对应的/dev/ttyS3,uart4(pb2/3)对应的是/dev/ttyS4。难道是在dts中把uart4的uart4_port改成了3,强行把uart4映射为/dev/ttyS3?这种方式我原来有试过,导致类似问题出现

谢谢,我写错了。
目前打开了uart1,3,4,5,对应的ttys1, s3, s4, s5都能找到。
我用板上串口发送,确实是用的s4。

昨天一位朋友帮我试了,同样在mq_r的sdk上修改,他将s4作为了调试口,用的PG2,PG3,有调试信息...

我比对了下我的board.dts和sun8iw20p1.dtsi,已经将can部分全部注释掉了。结果仍是不行。
在make kernel_menuconfig里将can部分关掉。结果仍是不行。
将sunxi-uart.c还原成不带485控制的版本。结果仍是不行。

-----------------------------------------------------------------------------------------

问题找到了,设备树里pinctrl-names少写了个s。

-----------------------------------------------------------------------------------------

本来PB2/3 4/5为can0, can1管脚。
现在将PB2/3设为uart4,同时打开can1功能,结果进入系统后ifconfig -a发现打开的是can0。
感觉can1自动变成can0了...

-----------------------------------------------------------------------------------------

设备树里就按can1设置打开PB4/5管脚,进系统后显示是can0,程序按can0处理,竟然可以通讯。

#411 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-06-13 17:23:29

在设备树里设置pb2/3为uart4的管脚,编译并烧录后,可以找到/dev/ttyS3了,但是用qt的serial例程通过ttyS3发送数据,在PB2管脚上并没有测量到波形。改设备树pg2/3为uart4管脚,同样测量不出波形。
qt例程没问题,通过/dev/ttyS1发送数据,在对应管脚上可以测到波形。
目前打开了uart1,uart3,uart4.uart3作为调试口。

PB2/3 4/5同时作为了can0,1的管脚,我打开了can1功能,can通讯正常。
为了排除can功能的影响,将can0, 1都关闭,结果仍是在PB2上测不到波形。
将PB4/5设为uart5管脚,运行程序后发现PB4上,有非常小的凹陷,不确定是不是波形。

在设备树里搜索PB2/3,发现PB2/3还作为电容屏的RST及中断管脚,注释掉这两句,结果依旧。
PB2/3也是rgb24的信号管脚,但是我没用rgb24,用的是rgb16。

#412 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-06-06 10:21:55

rgb红蓝对调:
内核设备树:
fb0_formate = <1>,则红蓝对调,但是看注释里的描述,这个变量不是管这个功能的啊。
uboot设备树:
lcd_rb_swap = <1>,红蓝对调,但是uboot红蓝对掉后,进内核后则又变为不对调了...

--------------------------------------------------------

恢复内核设备树,不启动红蓝对掉功能,只保留uboot设备树的红蓝对掉。结果启动后,无论uboot还是内核,都是红蓝对掉了。
看样子,之前是uboot时对掉了一次,内核时又对掉了一次,结果又返回来了。

uboot和内核设备树修改红蓝对掉的方法,竟然不一样!

#413 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-06-05 16:14:28

关于将自己的应用打包的问题:
target/xxxx/busybox-init目录下的文件打包时会覆盖掉rootfs/目录下的文件,所以放到该目录下即可。然后执行mp。
但是mp时发现,我交叉编译的程序,会报错找不到依赖的库。
还有就是,有的我明明复制到该目录了,也通过编译了,但是烧录到板子上有就是没有。
尤其是usr/lib目录下的libQt5DBus.so和libdbus-1.so。

ubuntu下烧录软件是Livesuite,不是phonixsuit了。可以从github上下载。里面主要是个脚本和一些.dll文件。需要先编译awusb,编译会报错,需要修改Makefile文件。我是用的群友提供的。
这样,就不用来回切换ubuntu和win了。

#414 Re: 全志 SOC » 为了V3S不吃灰,移植NES游戏 » 2023-05-31 15:36:44

void InfoNES_LoadFrame()
{
    int x,y, i;
    int line_width;
    WORD wColor;

    //修正 即便没有 LCD 也可以出声
    if(0 < fb_fd)
    {
        for (y = 0; y < lcd_height; y++ )
        {
            line_width = zoom_y_tab[y] * NES_DISP_WIDTH;
            for (x = 0; x < lcd_width; x++ )
            {
                wColor = WorkFrame[line_width  + zoom_x_tab[x]];
                lcd_fb_display_px(wColor, x, y);
                printf("x:%d, y:%d, color:%d, index:%d\r\n", x, y, wColor, line_width + zoom_x_tab[x]);
                // for (i = 0; i < 255; i++)
                // {
                    // printf("%d\r\n", WorkFrame[i]);
                // }
            }
        }
    }
}

InfoNES_LoadFrame()这个函数里,我将每个像素点的wColor打印出来,结果都是0。
甚至将WorkFrame[]数组的前255个成员打印出来,结果也是0。
这是哪里出错了?

#415 Re: 全志 SOC » 编译了fb-test app,下载到板子上运行后屏幕无反应。 » 2023-05-31 11:45:30

哇酷小二 说:
Gentlepig 说:

群里有朋友说全志显示驱动不支持,好坑啊...

不是不支持,可能fb默认是32bit的,但是fbtest只操作了24bit,透明通道值是0,所以就不显示了。

试一试 cat /dev/urandom > /dev/fb0

请问,该如何修改透明通道值呢?

-------------------------------------------------------------

尝试论坛里帖子里讨论的那个nes模拟器,编译后运行也是黑屏,看源码,也是操作/dev/fb0。
网上找来个通过/dev/fb0在屏幕上画圆的程序,编译后在板子上运行,同样是黑屏。
在全志群里问了,群友说是有多个图层的问题。
通过cat /sys/class/disp/disp/attr/sys,可以看到有4个图层,我将前三个enable改为disable,则重启后那些disable对应的行消失了。
但是,运行画圆程序或nes模拟器程序,屏幕仍是黑屏,qt例程正常。

screen 0:
de_rate 300000000 hz, ref_fps:60
mgr0: 800x480 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0] unblank direct_show[false] iommu[1]
dmabuf: cache[0] cache max[0] umap skip[0] umap skip max[12]
        lcd output      backlight( 50)  fps:60.2         800x 480
        err:0   skip:104        irq:106539      vsync:0 vsync_skip:0
   BUF    enable ch[1] lyr[0] z[16] prem[N] a[pixel 255] fmt[  0] fb[ 800, 480; 800, 480; 800, 480] crop[   0,   0, 800, 480] frame[   0depth[ 0]

-----------------------------

确实,写像素点时,抄的程序只有后24bit有数据,前8bit是0x00,现在改为0xffxxxxxx,则屏幕上就有输出了。感谢。

                    *(mem_p + 800*y + x) = 0xFFFFFFFF;

附完整代码:

#include <stdio.h>
#include <math.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <linux/input.h>

#define LCD_PATH "/dev/fb0"

int main()
{
    int midlex = 400;
    int midley = 240;
    int R = 50;
    unsigned int *mem_p;
    int x = 0;
    int y = 0;
    int i = 0;
    int lcd_fd;
    int biaozhix = 1;
    int biaozhiy = 1;
    lcd_fd = open(LCD_PATH, O_RDWR);
    mem_p = (unsigned int*)mmap(NULL, 800*480*480*4,
                                PROT_READ | PROT_WRITE,
                                MAP_SHARED, lcd_fd, 0);

    while (1)
    {
        for (y = 0; y < 480; y++)
        {
            for (x = 0; x < 800; x++)
            {
                i = ((x - midlex) * (x - midlex)) + ((y - midley) * (y - midley));
                if ((i < R * R))
                {
                    *(mem_p + 800*y + x) = 0x00FFFF00;
                }
                else
                {
                    *(mem_p + 800*y + x) = 0xFFFFFFFF;
                }
            }
        }
        if ((midley + R) > 479)
        {
            biaozhiy = 2;
        }
        if ((midlex + R) > 779)
        {
            biaozhix = 2;
        }
        if ((midley - R) < 0)
        {
            biaozhiy = 1;
        }
        if ((midlex - R) < 0)
        {
            biaozhix= 1;
        }

        if (biaozhix == 1)
        {
            midlex++;
        }
        if (biaozhix == 22)
        {
            midlex--;
        }
        if (biaozhiy == 1)
        {
            midley++;
        }
        if (biaozhiy == 2)
        {
            midley--;
        }
    }
    munmap(mem_p, 800*480*4);
    close(lcd_fd);

    return 0;
}

#416 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-30 08:59:46

运行arm-oenwrt-linux-gcc -v,发现configrued with后面跟的很多路径,不是我电脑上的,不知道这个会不会有影响。

$ arm-openwrt-linux-gcc -v
Reading specs from /home/any/MPU/AllWinner/T113-s3/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/../lib/gcc/arm-openwrt-linux-muslgnueabi/6.4.1/specs
COLLECT_GCC=arm-openwrt-linux-muslgnueabi-gcc.bin
COLLECT_LTO_WRAPPER=/home/any/MPU/AllWinner/T113-s3/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/../libexec/gcc/arm-openwrt-linux-muslgnueabi/6.4.1/lto-wrapper
Target: arm-openwrt-linux-muslgnueabi
Configured with: /home/xuqiang/workspace/tina-old/out/v853-perf1/compile_dir/toolchain/gcc-linaro-6.4-2017.11/configure --with-bugurl=https://dev.openwrt.org/ --with-pkgversion='OpenWrt/Linaro GCC 6.4-2017.11 2017-11' --prefix=/home/xuqiang/workspace/tina-old/out/v853-perf1/staging_dir/toolchain --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-openwrt-linux-muslgnueabi --with-gnu-ld --enable-target-optspace --enable-libgomp --disable-libmudflap --disable-multilib --disable-nls --without-isl --without-cloog --with-host-libstdcxx=-lstdc++ --with-gmp=/home/xuqiang/workspace/tina-old/out/host --with-mpfr=/home/xuqiang/workspace/tina-old/out/host --with-mpc=/home/xuqiang/workspace/tina-old/out/host --disable-decimal-float --with-diagnostics-color=auto-if-env --disable-libssp --enable-__cxa_atexit --with-cpu=cortex-a7 --with-fpu=neon --with-float=hard --with-headers=/home/xuqiang/workspace/tina-old/out/v853-perf1/staging_dir/toolchain/include --disable-libsanitizer --enable-languages=c,c++ --enable-shared --enable-threads --with-slibdir=/home/xuqiang/workspace/tina-old/out/v853-perf1/staging_dir/toolchain/lib --enable-lto --with-libelf=/home/xuqiang/workspace/tina-old/out/host
Thread model: posix
gcc version 6.4.1 (OpenWrt/Linaro GCC 6.4-2017.11 2017-11) 

------------------------------------

问题好像解决了。
在autoconfigure.sh里,之前有 -I 头文件路径 -L 库文件路径,现在又加了个-R库文件路径,结果可以通过编译了。
感觉 -L  对应 -linked,  -R 对应-runtime。
搜-R,说是和-rpaht等效。但是之前我是过修改-L 库文件路径  为: -L“库文件路径  Wl,-rpaht=库文件路径",结果报错还是没效果来着...

--------------------------------

感觉理解的还是不对。
libudev.so可能是libQt5SerialPort.so动态引用的。
但是openssl这里我选的是-openssl-linked,这应该是静态链接啊。

#417 Re: 全志 SOC » 开源 T113-s3 图纸 » 2023-05-29 16:37:01

@ssulg
主要是考虑io口耐压的问题,现在看来是可以耐5V电压的。

#418 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-29 10:26:57

修改了autconfigure.sh,make时报错:

Qt error: one or more PCH files were found, but they were invalid

往上搜了下,说有以前配置文件的残留,需要make distclean。

make distclean -j16,结果报错:

/home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile qtimageformats.pro
/home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtdeclarative/.qmake.conf:1: Cannot find feature qt_build_config
Cannot find feature spec_pre.prf
Error processing project file: qtdeclarative.pro
make[1]: *** [Makefile:408:Makefile] 错误 3
make[1]: 离开目录“/home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtdeclarative”
make: *** [Makefile:168:module-qtdeclarative-distclean] 错误 2
make: *** 正在等待未完成的任务....
/home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtimageformats/.qmake.conf:1: Cannot find feature qt_build_config
Cannot find feature spec_pre.prf
Error processing project file: qtimageformats.pro
make[1]: *** [Makefile:354:Makefile] 错误 3
make[1]: 离开目录“/home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtimageformats”
make: *** [Makefile:143:module-qtimageformats-distclean] 错误 2
make[1]: 进入目录“/home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtserialport”
/home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile qtserialport.pro
/home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtserialport/.qmake.conf:1: Cannot find feature qt_build_config
Cannot find feature spec_pre.prf
Error processing project file: qtserialport.pro
make[1]: *** [Makefile:382:Makefile] 错误 3
make[1]: 离开目录“/home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtserialport”
make: *** [Makefile:93:module-qtserialport-distclean] 错误 2

再次make distclean,则报错变成:

/home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile qt.pro -- -prefix ./t113-qt -opensource -confirm-license -release -strip -shared -xplatform linux-arm-gnueabi-g++ -optimized-qmake -c++std c++11 --rpath=no -pch -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtlocation -skip qtmacextras -skip qtnetworkauth -skip qtpurchasing -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtspeech -skip qtsvg -skip qttools -skip qttranslations -skip qtwayland -skip qtwebengine -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns -make libs -make examples -nomake tools -nomake tests -gui -widgets -dbus-runtime --glib=no --iconv=no --pcre=qt --zlib=qt -no-openssl --freetype=qt --harfbuzz=qt -no-opengl -linuxfb --xcb=no -tslib --libpng=qt --libjpeg=qt --sqlite=qt -plugin-sql-sqlite -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/ -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/allwinner/ -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/allwinner/include/ -L/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib/ -recheck-all
Could not find qmake spec ''.
Error processing project file: qt.pro
make: *** [Makefile:652:Makefile] 错误 3

----------------------------------------------------------------

将libudev.so放到了arm-gcc/lib目录下,结果编译通过了。
然后将autoconfigure.sh里的ssl功能打开,改为-openssl-linked,将同样报错找不到的libssl.so,libcrypto.so放到了arm-gcc/lib目录下,编译也通过了。

那么,问题大概有点明白了,autoconfigure.sh里用-I -L指定了第三方库的链接位置,没有起作用。

    -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/ \
    -L/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib/ \

那么,到底该如何引入第三方链接库呢?

#419 Re: 全志 SOC » 为了V3S不吃灰,移植NES游戏 » 2023-05-29 08:45:26

我修改linux目录下的makefile,想在t113-s3板上运行。

# CC = arm-linux-gcc
CC = arm-openwrt-linux-gcc
TARBALL = InfoNES08J

# InfoNES
.CFILES =	./../K6502.cpp \
		./../InfoNES.cpp \
		./../InfoNES_Mapper.cpp \
		./../InfoNES_pAPU.cpp \
		./InfoNES_System_Linux.cpp joypad_input.cpp

.OFILES	=	$(.CFILES:.cpp=.o)

CCFLAGS =  -O2 -fsigned-char -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include
LDFILGS = -lstdc++		# gcc3.x.x

LIBS += -L/home/any/MPU/AllWinner/T113-s3/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-glibc/toolchain/lib -lpthread -lm
LIBS += -L/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib -lasound -lz

all: InfoNES

InfoNES: $(.OFILES)
	$(CC) $(INCLUDES) -o $@ $(.OFILES) $(LDFILGS) $(LIBS)
	# $(CC) $(INCLUDES) -o $@ $(.OFILES) $(LDFILGS) -L/home/any/MPU/AllWinner/T113-s3/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-glibc/toolchain/lib -lm -lpthread -L-L/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib -lz -lasound

.cpp.o:
	$(CC) $(INCLUDES) -c $(CCFLAGS) $*.cpp  -o $@

clean:
	rm -f $(.OFILES) ../*~ ../*/*~ core

cleanall:
	rm -f $(.OFILES) ../*~ ../*/*~ core InfoNES

release: clean all

tar:
	( cd ..; \
	tar cvf $(TARBALL).tar ./*; \
	gzip $(TARBALL).tar \
	)

install:
	install ./InfoNES /usr/local/bin

结果在板子上运行后有如下提示,然后屏幕黑屏。

# ./InfoNES                              
/dev/joypad dev not found                                   
/dev/input/js0 dev not found                                
fb width:800 height:480 

#420 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 交叉编译qt源码,如何指定openssl? » 2023-05-27 16:41:43

晕,发现-openssl-runtime其实可能没成功:

libudev.so.1 not found

make -j4时,出现这个错误编译并没有停下,不容易察觉到。
如果是单make,就容易看到这个了。

------------------------------------------
感觉最后的-L/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib/ \没起作用。

#!/bin/sh
export PATH=$PATH:/home/any/MPU/AllWinner/T113-s3/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/
export STAGING_DIR=/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir
./configure -prefix ./t113-qt \
    -opensource \
    -confirm-license \
    -release \
    -strip \
    -shared \
    -xplatform linux-arm-gnueabi-g++ \
    -optimized-qmake \
    -c++std c++11 \
    -pch \
    -skip qt3d \
    -skip qtactiveqt \
    -skip qtandroidextras \
    -skip qtcanvas3d \
    -skip qtconnectivity \
    -skip qtdatavis3d \
    -skip qtdoc \
    -skip qtgamepad \
    -skip qtlocation \
    -skip qtmacextras \
    -skip qtnetworkauth \
    -skip qtpurchasing \
    -skip qtremoteobjects \
    -skip qtscript \
    -skip qtscxml \
    -skip qtsensors \
    -skip qtspeech \
    -skip qtsvg \
    -skip qttools \
    -skip qttranslations \
    -skip qtwayland \
    -skip qtwebengine \
    -skip qtwebview \
    -skip qtwinextras \
    -skip qtx11extras \
    -skip qtxmlpatterns \
    -make libs \
    -make examples \
    -nomake tools -nomake tests \
    -gui \
    -widgets \
    -dbus-runtime \
    --glib=no \
    --iconv=no \
    --pcre=qt \
    --zlib=qt \
    -ssl \
    -openssl-runtime \
    --freetype=qt \
    --harfbuzz=qt \
    -no-opengl \
    -linuxfb \
    --xcb=no \
    -tslib \
    --libpng=qt \
    --libjpeg=qt \
    --sqlite=qt \
    -plugin-sql-sqlite \
    -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/ \
    -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/allwinner/ \
    -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/allwinner/include \
    -L/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib/ \
    -recheck-all

#421 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 交叉编译qt源码,如何指定openssl? » 2023-05-27 15:59:43

Gentlepig
回复: 3

configure时,除了-ssl,还要选-openssl-runtime或-openssl-linked。

一开始指定了-openssl-runtime,这应该算动态加载openssl库了吧?
编译倒是顺利,然后往上找了几句想输出下qt支持的openssl版本:

    // 查詢Qt支持的版本
        bool bSupp = QSslSocket::supportsSsl();
        QString buildVersion = QSslSocket::sslLibraryBuildVersionString();
        QString version = QSslSocket::sslLibraryVersionString();
        qDebug() << bSupp << buildVersion << version;
    // 查看当前网络请求支持协议
        QNetworkAccessManager *accessManager = new QNetworkAccessManager(this);
        qDebug() << accessManager->supportedSchemes();

结果会提示找不到QSslSocket,虽然#include了,pro文件里也QT+=network了。
然后就在pro文件里用LIBS += -L XXX -lssl -lcrypto指定交叉编译后的openssl库位置。INLUCEPATH+=对应头文件。
结果还是报错:

main.cpp: In function 'int main(int, char**)':
main.cpp:12:18: error: 'QSslSocket' has not been declared
     bool bSupp = QSslSocket::supportsSsl();
                  ^~~~~~~~~~

----------------------------------

尝试用-openssl-linked方式,配置脚本里,-L openssl库路径  -I openssl库头文件路径
结果配置后make时报错:
libssl.so和libcrypto.so找不到。
-L 库路径 后如果直接加 -lssl -lcrypto,则配置脚本时就直接报错,报语法错误。
后看到往上帖子说,配置OPENSSL_LIBS变量,然后-L里加上-Wl,rpaht。

OPENSSL_LIBS='-L/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib -lssl -lcrypto' \
./conigrua  ...
    ...
    -ssl \
    -openssl-linked \
    -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include \
    -L'/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib -Wl,-rpath=home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib' \

改成这样后,最后还是报同样的错误。

#422 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-27 11:13:17

sdk自带qt编译后产生的qmake不能用的问题,还没找到解决办法。目前是用单独编译qt产生的qmake,不过板子上还是用sdk产生的qt库。编译个例程可以通过,下载到板子上运行后板子没反应,以为是环境变量的问题,又折腾了一阵子。后经群友提醒,设置个环境变量,打开了插件加载错误输出功能,这才看到显示没找到libQt5DBus.so,去sdk里搜了下,staging/target/usr/lib目录下是有的,可arm板上确实没有。手动复制过去后,继续报错libdubs-1.so没找到,继续从staging/target/usr/lib目录下复制过去。这次知道为何烧录用的img文件这么小,原来很多库没拷贝进去。

后来需要用到ssl功能,发现sdk里staging/target/usr/lib下也没有libQt5Ssl.so,在qt的makefile里,我设置了-ssl和-openssl,按说应该是默认动态加载openssl库了,但是就是没有产生libQt5Ssl.so,于是我改成-openssl -linked,然后设置了-I -L指定了openssl库路径。结果编译后还是没libQt5Ssl.so。
群友帮搜到这篇文章,需要在makefile里指定depengd依赖。
https://stackoverflow.com/questions/19184631/package-is-missing-dependencies-for-libraries-openwrt
于是我加了+libssl,结果还是原样,报错,QNetWork找不到libssl.so和libcrypto.so。
继续搜。https://blog.csdn.net/hexf9632/article/details/105976747
这里说明了,需要+的名字是make menuconfig里的库名字,在这里应该是+libopenssl。有点坑啊...

define Package/qt5-network                                                                          │~                             
   $(call Package/qt5/Default)                                                                       │~                             
   TITLE+=network                                                                                    │~                             
   DEPENDS+=+qt5-core +libopenssl                                                                    │~                             
endef 

-----------------------------
晕,高兴的早了,虽然编译通过了,但是仍没有libQt5Ssl.so
-----------------------------
哈,本就没这个libQt5Ssl.so。
我现在编译报错,是因为我编译的是sdk自带的qt,而使用的qmake是单独编译的qt且没选ssl。

#423 Re: 全志 SOC » 编译了fb-test app,下载到板子上运行后屏幕无反应。 » 2023-05-26 11:04:43

哇酷小二 说:
Gentlepig 说:

群里有朋友说全志显示驱动不支持,好坑啊...

不是不支持,可能fb默认是32bit的,但是fbtest只操作了24bit,透明通道值是0,所以就不显示了。

试一试 cat /dev/urandom > /dev/fb0

/# cat /dev/urandom > /dev/fb0               
cat: write error: No space left on device

#424 Re: 全志 SOC » 编译了fb-test app,下载到板子上运行后屏幕无反应。 » 2023-05-26 09:31:18

jkl 说:

用全志自带的colorbar呢,效果是一样的

allwinner/libdisplay吗?感谢,知道是驱动的问题就不纠结这个了。

明白了,那天在群里看到群友说的这个命令,这个是可以的:

echo 1 > sys/class/disp/disp/attr/colorbar

#425 Re: 全志 SOC » t113-s3 tina linux tslib触控无反映。 » 2023-05-25 15:36:30

hengjian 说:

@Gentlepig
你问题解决了吗,我也遇到同样的问题了,不知道如何解决

没有解决,估计就是按帖子里改分频参数,给adc频率尽量高些,采样时间尽量短些?

#426 Re: 全志 SOC » 芯片一直进入FEL模式 » 2023-05-25 10:47:51

我经历过这样的问题,t113-s3,板载spi nand。我在win下用phoenixsuit烧录没问题,后来不想来回切换win和ubuntu,就想在ubuntu下烧录,发现xfel可以直接向spi nand读写,就用xfel向spi nand烧录tina linux打包好的img文件,结果发现烧录完成后还是处于fel状态,我当时也是怀疑板子硬件坏了。后来用xfel读取spi nand内容,读出来的和写进去的文件对比了下,是一致的。
又发现切换到win下用phoenixsuit烧录后板子又可以启动起来了,然后再用xfel读出内容来,发现和img文件内容不一致。
才明白phoenixsuit并不是简单的直接将img文件烧录进去了。

#428 全志 SOC » 编译了fb-test app,下载到板子上运行后屏幕无反应。 » 2023-05-24 15:44:41

Gentlepig
回复: 6

我记得运行后,屏幕上应该是分为红蓝绿三块区域,还有交叉白线。
现在运行后屏幕倒是刷了一下,变成全黑。

https://github.com/ponty/fb-test-app

fb-test 1.1.0 (rosetta)
Failed to set graphics mode on tty1
fb res 800x480 virtual 800x480, line_len 3200, bpp 32

#429 Re: 全志 SOC » t113-s3 tina linux tslib触控无反映。 » 2023-05-24 11:20:19

https://blog.csdn.net/sjygqz/article/details/129407477
根据这个帖子,对比了下我使用的sun4i-ts.c和sunxi-ts.c,发现sunxi-ts.c和帖子里的参数比较接近。
于是,就关闭CONFIG_TOUCHSCREEN_SUN4I,保留CONFIG_TOUCHSCREEN_SUNXI。
发现效果好些,但和预想的比还差一点。

#430 全志 SOC » t113-s3 tina linux tslib触控无反映。 » 2023-05-24 09:01:10

Gentlepig
回复: 7

用的mango的sdk,可能默认用的是电容屏,但是我想用电阻屏。做了一下修改:
make kernel_menuconfig里,选了CONFIG_TOUCHSCREEN_SUNXI和CONFIG_TOUSHSCREEN_SUN4I。
以下是设备树,使能了rtp,但是不知道tpadc应该是否也使能。ctp没管,仍处于okay状态。

&rtp {
	allwinner,tp-sensitive-adjust = <0xf>;
	allwinner,filter-type = <0x1>;
	allwinner,ts-attached;
	status = "okay";
};

&tpadc {
	key_cnt = <5>;
	key1 = <420 115>;
	key2 = <870 114>;
	key3 = <1290 119>;
	key4 = <1630 373>;
	key5 = <1950 28>;
	status = "disabled";
};

&gpadc {
	channel_num = <1>;
	channel_select = <0x01>;
	channel_data_select = <0>;
	channel_compare_select = <0x01>;
	channel_cld_select = <0x01>;
	channel_chd_select = <0>;
	channel0_compare_lowdata = <1600000>;
	channel0_compare_higdata = <1200000>;
	channel1_compare_lowdata = <460000>;
	channel1_compare_higdata = <1200000>;
	key_cnt = <5>;
	key0_vol = <210>;
	key0_val = <0x19c>;
	key1_vol = <410>;
	key1_val = <0x197>;
	key2_vol = <590>;
	key2_val = <158>;
	key3_vol = <750>;
	key3_val = <28>;
	key4_vol = <880>;
	key4_val = <28>;
	status = "disabled";
	wakeup-source;
};

现象就是运行ts_calibrate后,点击屏幕无反映,不停的随即点击屏幕,偶尔会成功一次,非常小的概率。

/etc/profile里,做的如下设置:

export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
# getevent
add device 1: /dev/input/event1
  name:     "audiocodec sunxi Audio Jack"
add device 2: /dev/input/event0
  name:     "2009c00.rtp"

才发现,不是点击失灵,是点击后维持几秒以后才能松开,这时点击才有效果...

#431 Re: 全志 SOC » 芯片一直进入FEL模式 » 2023-05-24 08:37:01

估计是没烧录成功吧,或固件有问题起不来?

#433 Re: 哇酷地摊(跳蚤市场) » 28人民币淘的行车记录仪拆解 » 2023-05-22 09:53:28

可以考虑根据晶振引脚和常用单片机引脚对比下,看是否符合。
好奇只焊接了32768晶振,没焊接另一个...

我看360猴王摄像头和这个外形差不多,但是看拆解里面要比这个复杂多了,这个更像是单片机?
像360猴王有wifi功能,也有更多按键实现比较多的设置功能。

还有,比如论坛里常见的f1c100s这类芯片,供电至少有3路,3.3V, 1.8/1.5V, 0.9V。
这个只看到了1个较大的功率电感。不过也没准呢,看到板子上有3.3V,2.8V,1.2V丝印。

不过你这个电池外形怎么这么大?

https://post.smzdm.com/p/a997pe2e/

#434 Re: 全志 SOC » 背光电路参数不当,造成该部分冒烟,soc不能正常工作,可能是什么原因呢? » 2023-05-20 08:59:20

查了下芯片手册,OV管脚的存在使输出电压最大不超过28V。
二极管采用的是sd103肖特极二极管,40V耐压350mA电流。

#435 全志 SOC » 背光电路参数不当,造成该部分冒烟,soc不能正常工作,可能是什么原因呢? » 2023-05-19 08:57:39

Gentlepig
回复: 1

自己参考mq_r画的t113-s3板,之前没焊lcd部分电路,板子能正常工作。
昨天把背光和pfc40pin座也焊上了,接上屏幕,加电,发现背光部分有冒烟。(此时没注意是否能进入linux,但此时屏没亮,也无背光)
分析电路,背光升压电路我用的电源芯片是250mV反馈电压的,R4是电流采样电阻,这样电流肯能就是125mA,可能过大了。
R16、R17两个电阻是1/10W的75R电阻,过125mA电流也超其功率了,群友指出这两个电阻无用。

8.png
将R4电阻由2R改为10R,去掉R16、R17两个电阻,在其中一个位置补上0R电阻。不确定二极管及电源芯片是否损坏,直接换新。
不敢接lcd,光给板子加电(USB提供5V)。发现板子无法正常启动了。
测量3路DC/DC电压,3.3V,1.5V,0.9V正常。
用示波器测量波形,发现24M晶振是启动的。

9.png
复位电路是用IMP809然后上拉个3.3V接到RESET管脚的,测量RESET管脚,发现是2.8V。另一块正常的板子,RESET管脚是3.3V。
SOC自带两路LDO,其中LDOA应该是1.8V,结果是2.1V多一点。

然后接上LCD,发现此时背光亮了。测量此时升压电压为19V多一些。

想分析之前损坏的原因。
有群友指出电感10uH太大,产生这么大电流时电压过高。
有群友指出升压部分有可能达到30V电压,有可能碰到其他电路造成损坏。
但我不明白高压传递到soc的路径。

PCB部分,升压电路离其他信号线也太近了,空间干扰过去?
10.png

#436 Re: 全志 SOC » 开源 T113-s3 图纸 » 2023-05-18 08:55:21

edisondeng 说:

以太网口验证了吗?

我画了个板子,网口部分是参照这个原理图的网口部分。
https://pro.lceda.cn/editor#id=5133835294354c21ad5657691270ef3c,tab=*4b1386a708b64b9c8b43045527a13fed
设备树部分参考的是:
https://whycan.com/files/202108/d1/D1_Tina_Linux_%E4%BB%A5%E5%A4%AA%E7%BD%91_%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97.pdf
不过我板子是用的百兆网口,设备树部分略有区别。
现在可以通过网口连上网了,就是两个网口灯都没亮,其中有一个确定是我接反了,另一个不知道为什么也不亮。

#437 Re: 全志 SOC » 开源 T113-s3 图纸 » 2023-05-18 08:45:50

arychen 说:

看到介绍有个-S4的是啥区别
另外S3看到解码不支持到4K,-i的外挂DDR的话可以4K解码,是内存容量的问题?

-S4是256M版本的,有没有其他区别不知道。

#438 Re: 全志 SOC » 关于全志T113开发板接7寸LCD屏幕显示异常问题的解决方案 » 2023-05-17 11:46:46

感谢,过阵子也打算接个屏幕试试,可以跳过一个坑了。

#439 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-17 09:21:39

我尝试将package/gui/qt/qt5/files/qmake.conf里最后加上

# modifications to g++.conf
  1 QMAKE_CC                = arm-openwrt-linux-gcc
  2 QMAKE_CXX               = arm-openwrt-linux-gcc
  3 QMAKE_LINK              = arm-openwrt-linux-gcc
  4 QMAKE_LINK_SHLIB        = arm-openwrt-linux-gcc
  5 
  6 # modifications to linux.conf
  7 QMAKE_AR                = arm-openwrt-linux-ar cqs
  8 QMAKE_OBJCOPY           = arm-openwrt-linux-objcopy
  9 QMAKE_NM                = arm-openwrt-linux-nm -P
 10 QMAKE_STRIP             = arm-openwrt-linux-strip
 11 
 12 load(qt_config)

目的是将QMAKE_CC这些变量重新定义为固定的arm-openwrt-linux-gcc,结果编译通不过,报错:

ERROR: Qt requires a compliant STL library.

#440 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-17 08:41:31

@10*****231

sdk自带qt编译后没有打包进根文件系统,需要make menuconfig时勾选个qt例子,好像是洗衣机那个例子就行。这也是群友告诉我的,好像和openwrt的strip选项有关,打包时会剔除些用不到的库?不过试过去掉strip勾选,还是打包不进去。而勾选个qt例程会打包进去。

#441 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-16 10:46:25

感觉像是qtbas/mkspecs/linux-openwrt-g++/qmake内容有问题,可能有些变量没有正确传进来。
比如
QMAKE_CC        = $$(TARGET_CC)
如何将这个TARGET_CC打印出来查看一下?

#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

QT_QPA_DEFAULT_PLATFORM = eglfs

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

# QMAKE_{INC,LIB}DIR_QT needs to be overridden,
# as they're set to $$[QT_INSTALL_{HEADERS,LIBS}] by default
# which are compiled into the qmake binary statically
QMAKE_INCDIR_QT		= $$(TARGET_INCDIRS)
QMAKE_LIBDIR_QT		= $$(TARGET_LIBDIRS)
QMAKE_INCDIR		= $$(TARGET_INCDIRS)
QMAKE_LIBDIR		= $$(TARGET_LIBDIRS)
QMAKE_MOC		= $$(STAGING_DIR_HOST)/bin/moc
QMAKE_UIC		= $$(STAGING_DIR_HOST)/bin/uic
QMAKE_RCC		= $$(STAGING_DIR_HOST)/bin/rcc
QMAKE_CC		= $$(TARGET_CC)
QMAKE_CXX		= $$(TARGET_CXX)
QMAKE_AR		= $$(TARGET_AR)
QMAKE_OBJCOPY		= $$(TARGET_OBJCOPY)
QMAKE_RANLIB		= $$(TARGET_RANLIB)
QMAKE_CFLAGS		= $$(TARGET_CFLAGS)
QMAKE_CXXFLAGS		= $$(TARGET_CXXFLAGS)
QMAKE_NM                =
QMAKE_LINK		= $$(TARGET_CXX)
QMAKE_LINK_SHLIB	= $$(TARGET_CXX)
QMAKE_LINK_C		= $$(TARGET_CC)
QMAKE_LFLAGS		= $$(TARGET_LDFLAGS) # this will end up in redundant "-L"-strings, as they're already in $QMAKE_LIBDIR_QT, however TARGET_LDFLAGS may contain not only directories but special linker options

#unset vars which would intefere with vars/flags passed over by OpenWrt
QMAKE_STRIP				= # do not strip
QMAKE_STRIPFLAGS_LIB			= # do not strip
QMAKE_CFLAGS_WARN_ON			= 
QMAKE_CFLAGS_WARN_OFF			= 
QMAKE_CFLAGS_RELEASE			= 
QMAKE_CFLAGS_DEBUG			= 
QMAKE_CFLAGS_PRECOMPILE			= 
QMAKE_CFLAGS_USE_PRECOMPILE		= 
QMAKE_CXXFLAGS_WARN_ON			= 
QMAKE_CXXFLAGS_WARN_OFF			= 
QMAKE_CXXFLAGS_RELEASE			= 
QMAKE_CXXFLAGS_DEBUG			= 
QMAKE_CXXFLAGS_PRECOMPILE		= 
QMAKE_CXXFLAGS_USE_PRECOMPILE		= 
QMAKE_LFLAGS_RELEASE			= 

load(qt_config)

------------------------------------

Makefile里加入$(warning, &(TARGET_CC));将Makefile里的make -jx注释掉,使其不进行qt源码编译;用mm 1>&1|tee xxx.log将编译信息保存到xxx.log。
从xxx.log里找到了TARGET_CC,果然只是个arm-openwrt-linux-muslgnueabi-gcc ,没有路径。
还有CONFIGURE_PREFIX,  是/usr。

试了下arm-openwrt-linux-muslgnueabi-gcc -v,是可以看到信息的,其路径已经加到PATH环境变量里了。

-----------------------------

只在这里赋值了,感觉预安装

build/package-defaults.mk:77:CONFIGURE_PREFIX:=/usr

实际libQt5*.so是放到了../out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/ipkg-install/usr/lib/目录下。
而这个ipkg-install不知道是什么时候加进来的。

#442 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-16 08:55:02

@10*****231

这不是我想要的解决办法。
你这是将sdk的qt编译了一遍,又单独下载编译了一遍qt。

之前试过,单独编译qt源码,生成的qmake可以用,交叉编译的qt程序放到板子上,板子上只有sdk自带qt编译的库,也可以正常运行。

我是想搞明白为什么sdk自带qt生成的qmake,不能用。

----------------------------------------------------------------

发现qmke并不是编译qt源码make时产生的,而是在这之前,执行configure脚本时产生的。
tina sdk自带的qt并没有单独的configure脚本文件,而是在package/gui/qt/qt5/Makefile里有些configure语句。
就是这个帖子里我在22楼贴的那部分。

-----------------------------------------------------------------

sdk自带qt编译生成的qmake:

./qmake -v
QMake version 3.1
Using Qt version 5.12.9 in /usr/lib

手动生成autoconfigure.sh单独编译qt生成的qmake:

./qmake -v
QMake version 3.1
Using Qt version 5.12.9 in /home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/t113-qt/lib

可以看到sdk自带qt生成的qmake,并不能正确引用到lib所在位置。

#443 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-13 11:23:47

10*****231 说:

@Gentlepig

感谢补丁,自带的编译过了,明天上板子

qt通过编译了,那么交叉编译的qmake能否编译工程?
我这里用交叉编译的qmake生成的Makefile文件,CC总是空的。

--------------------------------------------

发现package/gui/qt/qt5目录下的Makefile里,有qt配置文件,但是里面没有-optimized-qmake选项,不知道和这个有没有关系。
手动加上了,正在重新编译一遍试试。
这个Makefile一旦修改,qt源码就又会重新解压一遍,qt有重新编译一遍,真是麻烦啊。

		./configure \
		-prefix $(CONFIGURE_PREFIX) \
		-bindir $(CONFIGURE_PREFIX)/bin \
		-headerdir $(CONFIGURE_PREFIX)/include \
		-libdir $(CONFIGURE_PREFIX)/lib \
		-datadir $(CONFIGURE_PREFIX)/share/qt5 \
		-qmldir $(CONFIGURE_PREFIX)/lib/qt5/qml \
		-plugindir $(CONFIGURE_PREFIX)/lib/qt5/plugins \
		-release \
		-xplatform linux-openwrt-g++ \
		-optimized-qmake \
		-opensource \
		-confirm-license \
		-c++std c++14 \
		-shared \
		-accessibility \
		-no-qml-debug \
		-no-sse2 \
		-no-sse3 \
		-no-ssse3 \
		-no-sse4.1 \
		-no-sse4.2 \
		-no-avx \
		-no-avx2 \
		-no-mips_dsp \
		-no-mips_dspr2 \
		-pkg-config \
		-system-zlib \
		-mtdev \
		-no-journald \
		-syslog \
		-system-libpng \
		-system-libjpeg \
		-system-freetype \
		-no-sql-db2 \
		-no-sql-ibase \
		-no-sql-mysql \
		-no-sql-oci \
		-no-sql-odbc \
		-no-sql-psql \
		-sql-sqlite \
		-sqlite \
		-no-sql-tds \
		-qt-harfbuzz \
		-openssl \
		-no-libproxy \
		-qt-pcre \
		-no-xcb \
		-no-xcb-xinput \
		-no-xcb-xlib \
		-no-glib \
		-no-pulseaudio \
		-alsa \
		-no-gtk \
		-no-opengl \
		-gui \
		-widgets \
		-no-cups \
		-iconv \
		-evdev \
		-tslib \
		-no-icu \
		-fontconfig \
		-strip \
		-no-pch \
		-no-ltcg \
		-dbus-linked -L$(STAGING_DIR)/usr/lib -I$(STAGING_DIR)/usr/include \
		-I$(STAGING_DIR)/usr/include/dbus-1.0 -I$(STAGING_DIR)/usr/lib/dbus-1.0/include \
		-no-use-gold-linker \
		-no-eglfs \
		-no-kms \
		-no-gbm \
		-no-directfb \
		-linuxfb \
		-no-mirclient \
		-no-libinput \
		-no-gstreamer \
		-nomake tests \
		-skip qtdoc \
		-skip qtwayland \
		-ssl \

哈,加了optimized-qmake也没用。

#445 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-12 17:03:16

我又重新编译了sdk自带的qt,结果通不过编译了,尴尬。

make[7]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtconnectivity/examples/nfc/corkboard'
make[7]: Nothing to be done for 'first'.
make[7]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtconnectivity/examples/nfc/corkboard'
make[6]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtconnectivity/examples/nfc'
make[5]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtconnectivity/examples'
make[4]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtconnectivity'
arm-openwrt-linux-muslgnueabi-g++ -c -Os -pipe -march=armv7-a -mtune=cortex-a7 -mfpu=neon -fno-caller-saves -Wno-unused-result -mfloat-abi=hard -Wformat -Werror=format-security -fPIC -fstack-protector -D_FORTIFY_SOURCE=2 -Wl,-z,now -Wl,-z,relro -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/freetype2 -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/include  -std=c++1y -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wvla -Wdate-time -Wshift-overflow=2 -Wduplicated-cond -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_MULTIMEDIA_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../include/QtMultimedia/5.12.9 -I../../../include/QtMultimedia/5.12.9/QtMultimedia -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/include/QtGui/5.12.9 -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/include/QtGui/5.12.9/QtGui -I../../../include -I../../../include/QtMultimedia -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/include -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/include/QtGui -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/include/QtCore/5.12.9 -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/include/QtCore/5.12.9/QtCore -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/include/QtNetwork -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/include/QtCore -I.moc -isystem /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include -isystem /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/dbus-1.0 -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib/dbus-1.0/include -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/include\ -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/mkspecs/linux-openwrt-g++ -o .obj/qalsaaudiodeviceinfo.o qalsaaudiodeviceinfo.cpp
make[8]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/qmlsensorgestures'
make[8]: Nothing to be done for 'first'.
make[8]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/qmlsensorgestures'
make[7]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/qmlsensorgestures'
cd qmlqtsensors/ && ( test -e Makefile || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/qmlqtsensors/qmlqtsensors.pro ) && make -f Makefile 
make[7]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtxmlpatterns/examples/xmlpatterns/schema'
make[7]: Nothing to be done for 'first'.
make[7]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtxmlpatterns/examples/xmlpatterns/schema'
make[6]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtxmlpatterns/examples/xmlpatterns'
make[5]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtxmlpatterns/examples'
make[4]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtxmlpatterns'
cd qttools/ && ( test -e Makefile || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools/qttools.pro ) && make -f Makefile 
make[7]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/qmlqtsensors'
make[7]: Nothing to be done for 'first'.
make[7]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/qmlqtsensors'
cd sensor_explorer/ && ( test -e Makefile || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/sensor_explorer/sensor_explorer.pro ) && make -f Makefile 
make[4]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools'
cd src/ && ( test -e Makefile || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools/src/src.pro ) && make -f Makefile 
make[7]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/sensor_explorer'
cd import/ && ( test -e Makefile || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/sensor_explorer/import/import.pro ) && make -f Makefile 
make[5]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools/src'
cd assistant/ && ( test -e Makefile || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools/src/assistant/assistant.pro ) && make -f Makefile 
make[8]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/sensor_explorer/import'
make[8]: Nothing to be done for 'first'.
make[8]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/sensor_explorer/import'
( test -e Makefile.qml || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile.qml /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/sensor_explorer/qml.pro ) && make -f Makefile.qml 
make[6]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools/src/assistant'
cd help/ && ( test -e Makefile || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools/src/assistant/help/help.pro ) && make -f Makefile 
In file included from qalsaplugin.cpp:41:0:
qalsaaudiodeviceinfo.h:113:5: error: 'snd_pcm_t' does not name a type
     snd_pcm_t* handle;
     ^~~~~~~~~
qalsaaudiodeviceinfo.h:114:5: error: 'snd_pcm_hw_params_t' does not name a type
     snd_pcm_hw_params_t *params;
     ^~~~~~~~~~~~~~~~~~~
In file included from qalsaplugin.cpp:42:0:
qalsaaudioinput.h:127:5: error: 'snd_pcm_t' does not name a type
     snd_pcm_t* handle;
     ^~~~~~~~~
qalsaaudioinput.h:159:5: error: 'snd_pcm_uframes_t' does not name a type
     snd_pcm_uframes_t buffer_frames;
     ^~~~~~~~~~~~~~~~~
qalsaaudioinput.h:160:5: error: 'snd_pcm_uframes_t' does not name a type
     snd_pcm_uframes_t period_frames;
     ^~~~~~~~~~~~~~~~~
qalsaaudioinput.h:161:5: error: 'snd_pcm_access_t' does not name a type
     snd_pcm_access_t access;
     ^~~~~~~~~~~~~~~~
qalsaaudioinput.h:162:5: error: 'snd_pcm_format_t' does not name a type
     snd_pcm_format_t pcmformat;
     ^~~~~~~~~~~~~~~~
qalsaaudioinput.h:163:5: error: 'snd_pcm_hw_params_t' does not name a type
     snd_pcm_hw_params_t *hwparams;
     ^~~~~~~~~~~~~~~~~~~
In file included from qalsaplugin.cpp:43:0:
qalsaaudiooutput.h:124:5: error: 'snd_pcm_uframes_t' does not name a type
     snd_pcm_uframes_t buffer_frames;
     ^~~~~~~~~~~~~~~~~
qalsaaudiooutput.h:125:5: error: 'snd_pcm_uframes_t' does not name a type
     snd_pcm_uframes_t period_frames;
     ^~~~~~~~~~~~~~~~~
qalsaaudiooutput.h:139:5: error: 'snd_pcm_t' does not name a type
     snd_pcm_t* handle;
     ^~~~~~~~~
qalsaaudiooutput.h:140:5: error: 'snd_pcm_access_t' does not name a type
     snd_pcm_access_t access;
     ^~~~~~~~~~~~~~~~
qalsaaudiooutput.h:141:5: error: 'snd_pcm_format_t' does not name a type
     snd_pcm_format_t pcmformat;
     ^~~~~~~~~~~~~~~~
qalsaaudiooutput.h:142:5: error: 'snd_pcm_hw_params_t' does not name a type
     snd_pcm_hw_params_t *hwparams;
     ^~~~~~~~~~~~~~~~~~~
make[8]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/sensor_explorer'
make[8]: Nothing to be done for 'first'.
make[8]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/sensor_explorer'
make[7]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/sensor_explorer'
cd shakeit/ && ( test -e Makefile || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/shakeit/shakeit.pro ) && make -f Makefile 
In file included from qalsaaudiodeviceinfo.cpp:51:0:
qalsaaudiodeviceinfo.h:113:5: error: 'snd_pcm_t' does not name a type
     snd_pcm_t* handle;
     ^~~~~~~~~
qalsaaudiodeviceinfo.h:114:5: error: 'snd_pcm_hw_params_t' does not name a type
     snd_pcm_hw_params_t *params;
     ^~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp: In constructor 'QAlsaAudioDeviceInfo::QAlsaAudioDeviceInfo(QByteArray, QAudio::Mode)':
qalsaaudiodeviceinfo.cpp:59:5: error: 'handle' was not declared in this scope
     handle = 0;
     ^~~~~~
qalsaaudiodeviceinfo.cpp: In member function 'bool QAlsaAudioDeviceInfo::open()':
qalsaaudiodeviceinfo.cpp:168:28: error: 'handle' was not declared in this scope
         err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0);
                            ^~~~~~
qalsaaudiodeviceinfo.cpp:168:65: error: 'SND_PCM_STREAM_PLAYBACK' was not declared in this scope
         err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0);
                                                                 ^~~~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:168:90: error: 'snd_pcm_open' was not declared in this scope
         err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0);
                                                                                          ^
qalsaaudiodeviceinfo.cpp:170:28: error: 'handle' was not declared in this scope
         err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0);
                            ^~~~~~
qalsaaudiodeviceinfo.cpp:170:65: error: 'SND_PCM_STREAM_CAPTURE' was not declared in this scope
         err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0);
                                                                 ^~~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:170:89: error: 'snd_pcm_open' was not declared in this scope
         err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0);
                                                                                         ^
qalsaaudiodeviceinfo.cpp:173:9: error: 'handle' was not declared in this scope
         handle = 0;
         ^~~~~~
qalsaaudiodeviceinfo.cpp: In member function 'void QAlsaAudioDeviceInfo::close()':
qalsaaudiodeviceinfo.cpp:181:8: error: 'handle' was not declared in this scope
     if(handle)
        ^~~~~~
qalsaaudiodeviceinfo.cpp:182:29: error: 'snd_pcm_close' was not declared in this scope
         snd_pcm_close(handle);
                             ^
qalsaaudiodeviceinfo.cpp:183:5: error: 'handle' was not declared in this scope
     handle = 0;
     ^~~~~~
qalsaaudiodeviceinfo.cpp: In member function 'bool QAlsaAudioDeviceInfo::testSettings(const QAudioFormat&) const':
qalsaaudiodeviceinfo.cpp:191:5: error: 'snd_pcm_t' was not declared in this scope
     snd_pcm_t* pcmHandle;
     ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:191:16: error: 'pcmHandle' was not declared in this scope
     snd_pcm_t* pcmHandle;
                ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:192:5: error: 'snd_pcm_hw_params_t' was not declared in this scope
     snd_pcm_hw_params_t *params;
     ^~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:192:26: error: 'params' was not declared in this scope
     snd_pcm_hw_params_t *params;
                          ^~~~~~
qalsaaudiodeviceinfo.cpp:202:5: error: 'snd_pcm_stream_t' was not declared in this scope
     snd_pcm_stream_t stream = mode == QAudio::AudioOutput
     ^~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:205:65: error: 'stream' was not declared in this scope
     if (snd_pcm_open(&pcmHandle, dev.toLocal8Bit().constData(), stream, 0) < 0)
                                                                 ^~~~~~
qalsaaudiodeviceinfo.cpp:205:74: error: 'snd_pcm_open' was not declared in this scope
     if (snd_pcm_open(&pcmHandle, dev.toLocal8Bit().constData(), stream, 0) < 0)
                                                                          ^
qalsaaudiodeviceinfo.cpp:208:34: error: 'snd_pcm_nonblock' was not declared in this scope
     snd_pcm_nonblock(pcmHandle, 0);
                                  ^
qalsaaudiodeviceinfo.cpp:209:37: error: 'snd_pcm_hw_params_alloca' was not declared in this scope
     snd_pcm_hw_params_alloca(&params);
                                     ^
qalsaaudiodeviceinfo.cpp:210:44: error: 'snd_pcm_hw_params_any' was not declared in this scope
     snd_pcm_hw_params_any(pcmHandle, params);
                                            ^
qalsaaudiodeviceinfo.cpp:213:76: error: 'snd_pcm_hw_params_set_channels' was not declared in this scope
     snd_pcm_hw_params_set_channels(pcmHandle, params, format.channelCount());
                                                                            ^
qalsaaudiodeviceinfo.cpp:214:73: error: 'snd_pcm_hw_params_set_rate' was not declared in this scope
     snd_pcm_hw_params_set_rate(pcmHandle, params, format.sampleRate(), 0);
                                                                         ^
qalsaaudiodeviceinfo.cpp:216:5: error: 'snd_pcm_format_t' was not declared in this scope
     snd_pcm_format_t pcmFormat = SND_PCM_FORMAT_UNKNOWN;
     ^~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:220:13: error: 'pcmFormat' was not declared in this scope
             pcmFormat = SND_PCM_FORMAT_S8;
             ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:220:25: error: 'SND_PCM_FORMAT_S8' was not declared in this scope
             pcmFormat = SND_PCM_FORMAT_S8;
                         ^~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:222:13: error: 'pcmFormat' was not declared in this scope
             pcmFormat = SND_PCM_FORMAT_U8;
             ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:222:25: error: 'SND_PCM_FORMAT_U8' was not declared in this scope
             pcmFormat = SND_PCM_FORMAT_U8;
                         ^~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:226:13: error: 'pcmFormat' was not declared in this scope
             pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian
             ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:227:25: error: 'SND_PCM_FORMAT_S16_LE' was not declared in this scope
                       ? SND_PCM_FORMAT_S16_LE : SND_PCM_FORMAT_S16_BE;
                         ^~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:227:49: error: 'SND_PCM_FORMAT_S16_BE' was not declared in this scope
                       ? SND_PCM_FORMAT_S16_LE : SND_PCM_FORMAT_S16_BE;
                                                 ^~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:229:13: error: 'pcmFormat' was not declared in this scope
             pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian
             ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:230:25: error: 'SND_PCM_FORMAT_U16_LE' was not declared in this scope
                       ? SND_PCM_FORMAT_U16_LE : SND_PCM_FORMAT_U16_BE;
                         ^~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:230:49: error: 'SND_PCM_FORMAT_U16_BE' was not declared in this scope
                       ? SND_PCM_FORMAT_U16_LE : SND_PCM_FORMAT_U16_BE;
                                                 ^~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:235:13: error: 'pcmFormat' was not declared in this scope
             pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian
             ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:236:25: error: 'SND_PCM_FORMAT_S32_LE' was not declared in this scope
                       ? SND_PCM_FORMAT_S32_LE : SND_PCM_FORMAT_S32_BE;
                         ^~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:236:49: error: 'SND_PCM_FORMAT_S32_BE' was not declared in this scope
                       ? SND_PCM_FORMAT_S32_LE : SND_PCM_FORMAT_S32_BE;
                                                 ^~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:238:13: error: 'pcmFormat' was not declared in this scope
             pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian
             ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:239:25: error: 'SND_PCM_FORMAT_U32_LE' was not declared in this scope
                       ? SND_PCM_FORMAT_U32_LE : SND_PCM_FORMAT_U32_BE;
                         ^~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:239:49: error: 'SND_PCM_FORMAT_U32_BE' was not declared in this scope
                       ? SND_PCM_FORMAT_U32_LE : SND_PCM_FORMAT_U32_BE;
                                                 ^~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:241:13: error: 'pcmFormat' was not declared in this scope
             pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian
             ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:242:25: error: 'SND_PCM_FORMAT_FLOAT_LE' was not declared in this scope
                       ? SND_PCM_FORMAT_FLOAT_LE : SND_PCM_FORMAT_FLOAT_BE;
                         ^~~~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:242:51: error: 'SND_PCM_FORMAT_FLOAT_BE' was not declared in this scope
                       ? SND_PCM_FORMAT_FLOAT_LE : SND_PCM_FORMAT_FLOAT_BE;
                                                   ^~~~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:246:9: error: 'pcmFormat' was not declared in this scope
     if (pcmFormat != SND_PCM_FORMAT_UNKNOWN)
         ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:246:22: error: 'SND_PCM_FORMAT_UNKNOWN' was not declared in this scope
     if (pcmFormat != SND_PCM_FORMAT_UNKNOWN)
                      ^~~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:247:72: error: 'snd_pcm_hw_params_set_format' was not declared in this scope
         err = snd_pcm_hw_params_set_format(pcmHandle, params, pcmFormat);
                                                                        ^
qalsaaudiodeviceinfo.cpp:254:87: error: 'snd_pcm_hw_params_test_channels' was not declared in this scope
         err = snd_pcm_hw_params_test_channels(pcmHandle, params, format.channelCount());
                                                                                       ^
qalsaaudiodeviceinfo.cpp:260:84: error: 'snd_pcm_hw_params_test_rate' was not declared in this scope
         err = snd_pcm_hw_params_test_rate(pcmHandle, params, format.sampleRate(), 0);
                                                                                    ^
qalsaaudiodeviceinfo.cpp:265:21: error: 'pcmFormat' was not declared in this scope
     if (err >= 0 && pcmFormat != SND_PCM_FORMAT_UNKNOWN)
                     ^~~~~~~~~
qalsaaudiodeviceinfo.cpp:265:34: error: 'SND_PCM_FORMAT_UNKNOWN' was not declared in this scope
     if (err >= 0 && pcmFormat != SND_PCM_FORMAT_UNKNOWN)
                                  ^~~~~~~~~~~~~~~~~~~~~~
qalsaaudiodeviceinfo.cpp:266:72: error: 'snd_pcm_hw_params_set_format' was not declared in this scope
         err = snd_pcm_hw_params_set_format(pcmHandle, params, pcmFormat);
                                                                        ^
qalsaaudiodeviceinfo.cpp:269:50: error: 'snd_pcm_hw_params' was not declared in this scope
         err = snd_pcm_hw_params(pcmHandle, params);
                                                  ^
qalsaaudiodeviceinfo.cpp:271:28: error: 'snd_pcm_close' was not declared in this scope
     snd_pcm_close(pcmHandle);
                            ^
qalsaaudiodeviceinfo.cpp: In member function 'void QAlsaAudioDeviceInfo::updateLists()':
qalsaaudiodeviceinfo.cpp:286:9: error: 'handle' was not declared in this scope
     if(!handle)
         ^~~~~~
qalsaaudiodeviceinfo.cpp:289:9: error: 'handle' was not declared in this scope
     if(!handle)
         ^~~~~~
make[7]: *** [Makefile:1517: .obj/qalsaplugin.o] Error 1
make[7]: *** Waiting for unfinished jobs....
cd designer/ && ( test -e Makefile || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools/src/designer/designer.pro ) && make -f Makefile 
make[7]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools/src/assistant/help'
make[7]: Nothing to be done for 'first'.
make[7]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools/src/assistant/help'
make[6]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qttools/src/assistant'
cd accelbubble/ && ( test -e Makefile || /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake -o Makefile /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/accelbubble/accelbubble.pro ) && make -f Makefile 
make[7]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/shakeit'
make[7]: Nothing to be done for 'first'.
make[7]: Leaving directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtsensors/examples/sensors/shakeit'

搜了下,是
./qtmultimedia/src/plugins/alsa/qalsaaudiodeviceinfo.cpp
这个文件报错的,但是为何还是会编译qtmultimedia?

-----------------------------------------------

还有这个tina linux,每次修改Makefile后再m,qt都会重新解压覆盖一次qt源码,之前编译报错添加的#include <limits>又需要从新添加一遍,甚是麻烦。

--------------------------------------------------

make menuconfig时,上次把alsa驱动部分关了,所以会一直报这个错误,加上后没事了。

#446 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-11 10:58:49

@10*****231

编译通过了,写了个简单的helloworld,可以通过编译。下载到板子上,可以运行。
不过我板子上还是用之前sdk自带qt编译的库。

#447 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-11 09:37:06

@10*****231

感谢,我对比了下autoconfigure.sh,发现了问题。
        -xplatform linux-arm-gnueabi-g++ \     
这句后面多了几个空格,应该是反斜杠后面不能跟任何字符,否则按新的命令处理了。

        -xplatform linux-arm-gnueabi-g++ \      

--------------------------------------------------

另,为什么autoconfigure.sh里需要配置STAGING_DIR这个环境变量,而且配置的是交叉编译器的路径?不是有个staging_dir目录么?不明白这个环境变量是干什么用的?

--------------------------------------------------

哈,看到了,帖子后面将到遇到报错后,又配置了一遍STAGING_DIR这个环境变量。

#448 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-11 08:53:18

jetchenxg2021 说:

@Gentlepig
Tina下编译的qt库,最后应用可以跑起来么?

编译完qt后看到根文件里有libQt5相关库就没再继续了,当时板子上也缺元件没有接屏幕。
前天想尝试用qt编译个hello,world,结果才发现交叉编译过不去...

----------------------------

在这里做个记录吧。
基于D1s的QT5移植
这个帖子里有补丁文件可编译tina sdk自带的qt.

#449 Re: 全志 SOC » Tina 2.0集成了哪些UI?求Tina环境下,移植LVGL的参考教程。 » 2023-05-11 08:49:29

我是参考mango的mq_r板子画了个t113-s3的板子,我想用qt5,sdk里也带了qt5,但是对于t113-s3编译是通不过的,原因好像是sdk里的qt5配置了很多和gpu相关的,而t113-s3没gpu。不过论坛里有人贡献了些文章,需要修改makefile,可以通过编译。不过一般还是推荐单独编译个qt5。另,我是从git上下载的mango的sdk,挺快的,当然可能就不是最新的。

#450 Re: 全志 SOC » 开源 T113-s3 图纸 » 2023-05-11 08:45:25

jshxcn 说:

T113-S3的CAN是硬件CAN吗

是硬件can,但是需要按论坛教程添加设备树。

#451 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-10 17:15:22

尝试单独编译qt源码,网上教程挺多,仍用qt5.12.9。解压后,修改qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf。
将里面的QMAKE_CC等修改为arm-openwrt-linux-gcc,因为sdk里交叉编译器名字就是这个,并且将交叉编译器路径加到PATH路径里了。

     AKEFILE_GENERATOR      = UNIX                                                                       │  qmake.conf                  
  1 CONFIG                 += incremental                                                                │  qplatformdefs.h
  2 QMAKE_INCREMENTAL_STYLE = sublib                                                                     │~                             
  3                                                                                                      │~                             
  4 include(../common/linux.conf)                                                                        │~                             
  5 include(../common/gcc-base-unix.conf)                                                                │~                             
  6 include(../common/g++-unix.conf)                                                                     │~                             
  7                                                                                                      │~                             
  8 # modifications to g++.conf                                                                          │~                             
  9 QMAKE_CC                = arm-openwrt-linux-gcc                                                      │~                             
 10 QMAKE_CXX               = arm-openwrt-linux-g++                                                      │~                             
 11 QMAKE_LINK              = arm-openwrt-linux-g++                                                      │~                             
 12 QMAKE_LINK_SHLIB        = arm-openwrt-linux-g++                                                      │~                             
 13                                                                                                      │~                             
 14 # modifications to linux.conf                                                                        │~                             
 15 QMAKE_AR                = arm-openwrt-linux-ar cqs                                                   │~                             
 16 QMAKE_OBJCOPY           = arm-openwrt-linux-objcopy                                                  │~                             
 17 QMAKE_NM                = arm-openwrt-linux-nm -P                                                    │~                             
 18 QMAKE_STRIP             = arm-openwrt-linux-strip                                                    │~                             
 19 load(qt_config)  

然找参考网上的autoConfigure.sh,然后执行source ./autoCoonfigure.sh。
结果却报错:

$ source ./autoConfigure.sh
+ cd qtbase
+ /home/any/MPU/AllWinner/T113-s3/qt-everywhere-opensource-src-5.12.9/qtbase/configure -top-level -prefix ./t113-qt -opensource -confirm-license -release -strip -shared -xplatform linux-openwrt-g++  
Creating qmake...
.Done.
ERROR: Invalid command line parameter ' '.
-optimized-qmake:未找到命令

autoConfigure.sh内容如下:

#export PATH=$PATH:/home/any/MPU/AllWinner/T113-s3/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/
./configure -prefix ./t113-qt \
        -opensource \
        -confirm-license \
        -release \
        -strip \
        -shared \
        -xplatform linux-arm-gnueabi-g++ \      
        -optimized-qmake \
        -c++std c++11 \
        --rpath=no \
        -pch \
        -skip qt3d \
        -skip qtactiveqt \
        -skip qtandroidextras \
        -skip qtcanvas3d \
        -skip qtconnectivity \
        -skip qtdatavis3d \
        -skip qtdoc \
        -skip qtgamepad \
        -skip qtlocation \
        -skip qtmacextras \
        -skip qtnetworkauth \
        -skip qtpurchasing \
        -skip qtremoteobjects \
        -skip qtscript \
        -skip qtscxml \
        -skip qtsensors \
        -skip qtspeech \
        -skip qtsvg \
        -skip qttools \
        -skip qttranslations \
        -skip qtwayland \
        -skip qtwebengine \
        -skip qtwebview \
        -skip qtwinextras \
        -skip qtx11extras \
        -skip qtxmlpatterns \
        -make libs \
        -make examples \
        -nomake tools -nomake tests \
        -gui \
        -widgets \
        -dbus-runtime \
        --glib=no \
        --iconv=no \
        --pcre=qt \
        --zlib=qt \
        -no-openssl \
        --freetype=qt \
        --harfbuzz=qt \
        -no-opengl \
        -linuxfb \
        --xcb=no \
        -tslib \
        --libpng=qt \
        --libjpeg=qt \
        --sqlite=qt \
        -plugin-sql-sqlite \
        -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/ \
        -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/allwinner/ \
        -I/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include//allwinner/include/ \
        -L/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib/ \
        -recheck-all                          

--------------------------------------------

确定是qmake.conf里这句出了问题。
        -xplatform linux-arm-gnueabi-g++ \
但还不知道原因。

#452 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-10 08:58:04

现在尝试qmake交叉编译个qt程序,才发现qmake报错。
搜索目录下的qmake,发现如下几个:

$ find ../../ -name qmake
../../Tina-Linux/out/t113-mq_r/staging_dir/target/host/bin/qmake
../../Tina-Linux/out/t113-mq_r/staging_dir/target/usr/bin/qmake
../../Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/ipkg-install/usr/bin/qmake
../../Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/bin/qmake
../../Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/examples/qmake
../../Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/qmake
../../Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/qmake/qmake
../../Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/qmake/doc/snippets/qmake
../../Tina-Linux/out/t113-mq_r/compile_dir/target/qt-everywhere-opensource-src-5.12.9/qtbase/tests/auto/tools/qmake

使用 ../../Tina-Linux/out/t113-mq_r/staging_dir/target/host/bin/qmake 这个时报错:

$ qmake-t113-qt5 -project -o t113
/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/mkspecs/features/resolve_config.prf:25: 'addExclusiveBuilds' is not a recognized test function.
/home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/mkspecs/features/resolve_config.prf:37: 'addExclusiveBuilds' is not a recognized test function.

使用 ../../Tina-Linux/out/t113-mq_r/staging_dir/target/usr/bin/qmake 时报错:

$ qmake-t113-qt5 -project -o t113
Could not find qmake spec 'linux-openwrt-g++'.
Cannot find feature default_pre.prf
Cannot find feature default_post.prf

--------------------------------------------------------

使用host/bin/qmake报错会找不到几个文件,但是在usr/目录下能找到。
于是就用usr/bin/qmake,然后忽略2个报错,因为可以生成.pro文件及makefile文件。但是make时又报错:

[2] 15916
c -std=gnu++11 -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I. -I. -I../../../Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include -I../../../Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/QtGui -I../../../Tina-Linux/out/t113-mq_r/staging_dir/target/usr/include/QtCore -I. -I../../../Tina-Linux/out/t113-mq_r/staging_dir/target/usr/mkspecs/linux-openwrt-g++ -o main.o ../main.cpp
make: c: 没有那个文件或目录
make: [Makefile:500:main.o] 错误 127 (已忽略)
Wl,-rpath,/usr/lib -o t113 main.o   /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib/libQt5Gui.so /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/lib/libQt5Core.so -lpthread   
make: Wl,-rpath,/usr/lib: 没有那个文件或目录
make: [Makefile:192:t113] 错误 127 (已忽略)
[2]+  已完成               $T/tools/build/buildserver --path $T 2> /dev/null 1>&2

#### make completed successfully (1 seconds) ####

-------------------------------

打开Makefile,发现CC为空。

MAKEFILE      = Makefile
  1 
  2 EQ            = =
  3 
  4 ####### Compiler, tools and options
  5 
  6 CC            = 
  7 CXX           = 
  8 DEFINES       = -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB
  9 CFLAGS        = -D_REENTRANT -fPIC $(DEFINES)
 10 CXXFLAGS      = -std=gnu++11 -D_REENTRANT -fPIC $(DEFINES)
 11 INCPATH       = -I. -I. -I../../../out/t113-mq_r/staging_dir/target/usr/include -I../../../out/t113-mq_r/staging_dir/target/usr/incl
 12 QMAKE         = /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/usr/bin/qmake
 13 DEL_FILE      = rm -f
 14 CHK_DIR_EXISTS= test -d
 15 MKDIR         = mkdir -p
 16 COPY          = cp -f
 17 COPY_FILE     = cp -f
 18 COPY_DIR      = cp -f -R

#453 Re: 全志 SOC » ubuntu下如何向t113-s3的spi nand里烧写系统? » 2023-05-09 16:31:46

shaoxi2010 说:

phonixsuit 有linux版本,用那个就行

找到了phoenixsuit-linux。
但是安装后启动时报错:

any@Any-Desktop:~/Bin/phoenixsuit$ ls
common_fun.lua  liblua.so     luaeFex.dll     regdecode.lua
imgdec_fun.lua  LiveProc.Plg  phoenixsuit     regdemo.lua
ini_fun.lua     luaBase.dll   plgvector.dll
LangPlg.dll     luadec.dll    regbasefun.lua
any@Any-Desktop:~/Bin/phoenixsuit$ ./phoenixsuit
library file path: /home/any/Bin/phoenixsuit/plgvector.dll
library file path: /home/any/Bin/phoenixsuit/LiveProc.Plg
library file path: /home/any/Bin/phoenixsuit/plgvector.dll
library file path: /home/any/Bin/phoenixsuit/luaeFex.dll
段错误 (核心已转储)

#454 Re: 全志 SOC » 开源一个F1C200S的小板子,附带MDK+RTX+LVGL+NS2009测试工程 » 2023-05-06 11:08:52

看颜色感觉像是ad。

-----------------------------

晕了,楼主都在上边说是ad21画的了。

#455 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » air724的串口不支持7位数据,luat语言如何将8位数据转为7位数据呢? » 2023-05-05 08:48:14

7. 一次发送的数据模块分为2个包来接收;第一个64bytes,第二次26bytes

    串口速度比主频慢很多,115200大概112K/s,模块主频有500MHz,所以接收的时候会分包。

在合宙官网找到这些内容。不太明白,为何模块主频高,所以串口接收会分包。不明白这里的因果关系...

#456 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » air724的串口不支持7位数据,luat语言如何将8位数据转为7位数据呢? » 2023-05-04 17:41:02

又遇到了个问题,串口接收是按上边那段程序处理的,大部分情况下正常。但是串口一次接收大量数据时,会将一帧数据分成2帧处理了。
我实际应用过程中,串口应该收到132字节数据,但是却分成了112字节和20字节两部分。很奇怪,每次收这组132字节时,都会从112字节处断开处理。

#457 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-05-04 14:52:08

按awol论坛的帖子,修改设备树,启用can功能。
然后发现ip命令无法设置can,搜了下,说是需要iproute2,但是总是不成功,package目录下的iproute2目录始终没有编译进去。
经群友提醒,勾选了ip-full后,iproute2顺利编译了。
另,busybox相关设置里有两套ip选项,也不清楚是为什么。

#458 Re: 全志 SOC » ubuntu下如何向t113-s3的spi nand里烧写系统? » 2023-05-04 14:32:31

shaoxi2010 说:

phonixsuit 有linux版本,用那个就行

是指wine版吗?

#459 Re: 全志 SOC » ubuntu下如何向t113-s3的spi nand里烧写系统? » 2023-04-28 14:19:21

看到win下phonixsuit烧录时,是先输出这些信息:

[612]fes begin commit:adaf1174cc
[615]set pll start
[621]periph0 has been enabled
[624]set pll end
[626][pmu]: bus read error
[628]board init ok
[630]beign to init dram
[632]ZQ value = 0x2f
[634]get_pmu_exist() = -1
[637]ddr_efuse_type: 0xa
[639]trefi:7.8ms
[642][AUTO DEBUG] single rank and full DQ!
[646]ddr_efuse_type: 0xa
[648]trefi:7.8ms
[650][AUTO DEBUG] rank 0 row = 13
[653][AUTO DEBUG] rank 0 bank = 8
[657][AUTO DEBUG] rank 0 page size = 2 KB
[661]DRAM BOOT DRIVE INFO: V0.33
[664]DRAM CLK = 936 MHz
[666]DRAM Type = 3 (2:DDR2,3:DDR3)
[669]DRAMC read ODT  off.
[672]DRAM ODT value: 0x42.
[674]ddr_efuse_type: 0xa
[677]DRAM SIZE =128 M
[679]dram_tpr4:0x0
[681]PLL_DDR_CTRL_REG:0xf8004d00
[684]DRAM_CLK_REG:0xc0000000
[687][TIMING DEBUG] MR2= 0x20
[691]DRAM simple test OK.
[693]rtc standby flag is 0x0, super standby flag is 0x0
[698]init dram ok

#460 全志 SOC » ubuntu下如何向t113-s3的spi nand里烧写系统? » 2023-04-28 14:18:32

Gentlepig
回复: 4

按教程编译的tina linux,最后pack生成了个tina_t113-mq_r_uart3.img文件。在win下可以用phonixsuit烧写。
不想两个系统来回切换,想找个ubuntu下烧写t113的方法。

sunxi-fel貌似不能向t113-s3的spi nand读写。

xfel可以读写t113-s3的spi nand。
我尝试将tina_t113-mq_r_uart3.img通过xfel spinand 0 tina_t113-mq_r_uart3.img烧写进去。结果系统起不来。可以通过xfel spinand read读出来,发现和烧写文件一致。
先通过phonixsuit将该img文件烧进去并确定系统可以去来,然后用xfel spinand read读出来,发现读出来的内容和烧写文件不一样了。不过貌似大小是一样的。

#461 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-04-28 11:48:03

看到win下phonixsuit烧录时,是先输出这些信息:

[612]fes begin commit:adaf1174cc
[615]set pll start
[621]periph0 has been enabled
[624]set pll end
[626][pmu]: bus read error
[628]board init ok
[630]beign to init dram
[632]ZQ value = 0x2f
[634]get_pmu_exist() = -1
[637]ddr_efuse_type: 0xa
[639]trefi:7.8ms
[642][AUTO DEBUG] single rank and full DQ!
[646]ddr_efuse_type: 0xa
[648]trefi:7.8ms
[650][AUTO DEBUG] rank 0 row = 13
[653][AUTO DEBUG] rank 0 bank = 8
[657][AUTO DEBUG] rank 0 page size = 2 KB
[661]DRAM BOOT DRIVE INFO: V0.33
[664]DRAM CLK = 936 MHz
[666]DRAM Type = 3 (2:DDR2,3:DDR3)
[669]DRAMC read ODT  off.
[672]DRAM ODT value: 0x42.
[674]ddr_efuse_type: 0xa
[677]DRAM SIZE =128 M
[679]dram_tpr4:0x0
[681]PLL_DDR_CTRL_REG:0xf8004d00
[684]DRAM_CLK_REG:0xc0000000
[687][TIMING DEBUG] MR2= 0x20
[691]DRAM simple test OK.
[693]rtc standby flag is 0x0, super standby flag is 0x0
[698]init dram ok

#462 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-04-27 08:45:59

ubuntu下交叉编译我是用qmake创建工程,没用qt creator,也不知道怎么配置...

#463 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-04-26 15:28:24

我板子上焊接的是spi nand,没用ft卡。
spi的cs、miso都有10k上拉电阻,mosi是有10k下拉电阻,且留了个直接对地短路的地方。

一开始用win下的phonixsuit,还挺顺利的。后来想在ubuntu下烧录,就下载了sunxi-fel,最后发现现在的版本不能直接向spi nand烧录。发现xfel可以,就用sudo xfel spinand earse,然后再sudo xfel spinand write 0 xxx.img。发现可以擦除,也可以烧写,再读出来,貌似和写进去的一致。但是烧写完后,板子还是处于fel状态,再次复位或重新上电,板子仍是fel状态。
这和win下phonixsuit烧录可不一样,当时我烧录完就自动重启进正常状态了。
让我怀疑是不是不该烧录到0地址?
我尝试手动将mosi管脚拉到3.3V,结果仍不行。暂时没找到好的办法,每次都是转到win下烧录。

------------------------------------------------

用xfel spinand命令将xxx.img文件烧录到spi nand,读出来后和源文件一样。
用phonixsuit将相同的xxx.img文件烧录到spi nand,系统可以启动。然后用xfel将spinand的内容读出来,竟然和原文件完全不一样,除了大小一样外。

#464 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-04-26 15:15:43

can部分,参考https://debugdump.com/topic/1926/t113-s3-can-linux-%E4%B8%8B%E5%B7%B2%E8%B0%83%E9%80%9A?lang=zh-CN

结果编译过程中报错找不到几个函数的定义,发现明明包含了对应的头文件了。
群友admin指点,说kconfig里新增的内容,不该放在can部分的总目录下,放到了那个if条件里,再编译就可以了。
另mangos的sdk里,自带了个sunxi_can.c,但是选这个的话会报错找不到 #include <sunxi_can_asm.h>这个头文件。虽然同目录下有个sunxi_can_asm.s,但是不知道怎么用。最后还是换回了sun4i_can.c。

#465 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-04-26 15:11:21

在此记录下遇到的其他问题吧。
参考mango的mq_r板子修改画的,调试口是uart3。下载下来的tina linux默认条是口还是uart1。修改了board.dts,sysconfig.fex,结果串口3还是无输出。经群友提醒,还需要修改env.cfg里的console以及earlyprintk,尤其是后者,需要根据寄存器地址修改。

#466 Re: 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-04-26 14:58:46

记录一下,群友Extraterrestrial提供了一个qt的makefile,替换掉tina linux的packages/gui/qt/qt5目录下的makefile即可。
对比了下,主要是屏蔽掉了gpu相关的一些部分。
另,无论这个makefile还是旧的自带的makefile,编译时都会从网上下载qt源码,但会失败。看了下,qt提供下载的地址里的文件变了。现在文件名中不带opensource这个词了。
尝试修改makefile中下载地址中的文件名,去掉opensource,目录变量也去掉opensource。还有文件的md5,也改成下载网址提供的。
再make,倒是很快能下载,但是解压目录到了不带opensource的目录,继续编译,等了很久,报了些错误。没解决得了,就想可能还需要改回默认文件明,就重新命名了下载得到的压缩文件,结果不行。于是编辑压缩文件里的目录名才解决。

网友提供的makefile里,有make -j32,结果造成编译过程中我电脑总是失去响应。我后来改成了-j4。
继续make,遇到几个和std::limits相关的报错,搜了下,可能是编译器过新,可能把个什么的默认包含去掉了。找到报错文件,手动加入#include <limits>解决,总共4个文件。

对了,还有个nss啥的,我去makefile里找到那一行,屏蔽了那两个库。

终于编译完了,结果发现根目录下没有libqt*.so。热心的群友又解释说,openwrt make menuconfig里有个strip选项,默认时strip,其他还有no strip和sstrip。选strip时貌似会把不用的库优化掉。试了改成no strip,结果再次编译还是一样的结果。后来又提醒我勾选个qt程序试试,make menuconfig的gui/qt5目录下有三个演示程序,选了个qt-easing。再次编译,根文件系统里终于有了qt库了。

T113_gui_qt5_Makefile.zip

其实aw-ol论坛里还有个朋友提供的qt补丁,不过是好几个文件,我就没用那个。

#467 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » air724 luat编程,串口收到数据然后通过mqtt发出去,在串口收发频率比较高的情况下,偶尔会丢失数据。 » 2023-04-24 14:53:24

试过串口助手向air724的串口发送数据,发送周期试过50ms,就是上边的结果发送600帧左右,mqtt再发出来,丢失10帧左右。
如果发送周期调整为25ms,则发送600帧,丢失300帧左右。
发送周期调整为100ms,发送600帧,丢失1帧。

感觉像是消息传递的问题,消耗速度慢于生产速度。
我是这样传递数据的,串口任务里将数据作为消息的参数发送出去,这样操作是不是会额外占用了过多开销?
想过该成消息里不带参数,串口发消息前,将接收数据存入全局列表里,mqtt任务收到消息再从全局列表里取。但是感觉这样顺序是不是可能会乱?本来打算是做应答通讯的。

试过irt固件,配置为串口透传,测试结果也是会丢数据,在50ms的发送周期下。

#468 全志 SOC » t113-s3的tina linux如何配置及编译sdk自带的qt? » 2023-04-22 09:25:57

Gentlepig
回复: 57

勾选了qt-core、qt-widgets,然后编译,结果报错

make[3]: Entering directory '/home/any/MPU/AllWinner/T113-s3/Tina-Linux/package/libs/libgpu'
Makefile:80: /fbdev/include
rm -rf /home/any/MPU/AllWinner/T113-s3/Tina-Linux/tmp/stage-libgpu
mkdir -p /home/any/MPU/AllWinner/T113-s3/Tina-Linux/tmp/stage-libgpu/host /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/staging_dir/target/packages /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/host/packages
mkdir -p /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/libgpu/ipkg-install
install -d -m0755 /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/libgpu/ipkg-install/usr/lib
cp -fpR -uvd /fbdev/"musl"/lib/* /home/any/MPU/AllWinner/T113-s3/Tina-Linux/out/t113-mq_r/compile_dir/target/libgpu/ipkg-install/usr/lib
cp: cannot stat '/fbdev/musl/lib/*': No such file or directory

编译libgpu库时找不到/fbdev/musl/lib目录。
热心群友回复说sdk自带的qt是配置了gpu渲染的,t113-s3不可用。只能单独下载qt再编译。
去make menuconfig里看了,确实勾选了libgpu,且不可取消状态。我试着取消其他qt勾选,只保留qt-core勾选,发现library选项下的gpu libraray就取消勾选状态了,但是我再make,还是报上边的错误,还是会编译libgpu。

#470 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » air724 luat编程,串口收到数据然后通过mqtt发出去,在串口收发频率比较高的情况下,偶尔会丢失数据。 » 2023-04-21 14:05:24

再次测试。pc通过串口助手向air724的串口发送了717帧,总数据10755字节。
air724  程序里通过log.info() 打印出了724接收的帧数量,也显示接收了717帧。

通过mqtt发送出去后,mqtt服务器统计到的是706帧。
mqtt客户端收到的是也是706帧,总数据10590字节。

看来,串口接收这里是没问题的,只是串口任务里通过消息将数据传到mqtt任务,再通过mqtt发送出去,这个过程有问题。

#471 NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » air724 luat编程,串口收到数据然后通过mqtt发出去,在串口收发频率比较高的情况下,偶尔会丢失数据。 » 2023-04-21 10:36:12

Gentlepig
回复: 2

请教个问题,air724,目前主要运行两个任务:
1,串口任务,不停的读取一个字节数据进行处理,空闲超时后将收到的字符串作为参数发送消息;
2,mqtt任务,mqtt接收等待,等到串口任务发送过来的消息后,将得到的参数通过mqtt发送出去。

发送频率低的情况下没问题。发送频率高,就有丢的现象。在9600波特率,50ms自动发送的情况下,每次发送15个字节,发送几百条可能就丢一条。

尝试串口任务里收到数据,空闲超时后,不发送消息,只是将串口接收累计条数打印出来。发现,这种情况下,串口接收是没问题的。发送频率再高一倍也没事。

搞不清问题出在哪里,是串口任务发送消息太频繁,mqtt任务没处理过来?还是说mqtt任务发送时,影响了串口任务的接收,使串口任务少接收了?

--------------------------

刚测试的数据,每50ms发送15字节,发送了12180字节,计812帧。看了下mqtt服务器统计,只收到了810帧。
另一个mqtt客户端总计收到了12150字节,就是少了2帧。

#472 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » air724的串口不支持7位数据,luat语言如何将8位数据转为7位数据呢? » 2023-04-20 13:43:29

用string.byte()可以将单个字符转换为number类型,然后判断其大小,再做处理。

现在想串口一次读多个字节的字符串,一次性处理。
打算

for i=1, i < #data then
    data1 = string.byte(data, i, i)
    if data1 > 127 then
        data2 = data1 - 128
    else
        data2 = data1
    end
end

这样来获得每个字符对应的数字进行处理,但是不知道该如何再组合成字符串进行发送。

--------------------------------------

目前这么处理的:

        data = uart.read(1, "*l")
        if not data or string.len(data) == 0 then
            break
        end
        s = ""
        for i = 1, #data do
            data1 = string.byte(data, i, i)
            if data1 > 127 then
                data2 = data1 - 128
            else
                data2 = data1
            end
            s1 = string.char(data2)
            s = s..s1
        end

#473 Re: NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » air724的串口不支持7位数据,luat语言如何将8位数据转为7位数据呢? » 2023-04-20 10:23:26

现在想这样该,串口一个字节一个字节的读取,然后判断该字节大小,或按位与0x7f。

现在问题是,uart.read()返回的是字符串类型。如何将这个字符串按数字处理?不能用tonumer()这样处理。

#474 NB-IoT/2G模块/4G模块/GPRS模块/GPS/北斗 » air724的串口不支持7位数据,luat语言如何将8位数据转为7位数据呢? » 2023-04-19 17:41:03

Gentlepig
回复: 4

uart.read()返回的是string格式的数据。
想着将每个字节和0x80比较,大于的话,就自减0x80。
但是string类型是不能改变,那么只能新建个变量来赋值了。
但是luat没有数组这种类型,能用的估计就是string和table类型了。
用table类型估计不好再拼接成string然后再用串口发出去吧?

求个简单好用的方法。

#475 Re: 全志 SOC » V3S,安装sunxi-fel烧录工具,提示找不到libusb.h,咋办? » 2023-04-19 10:57:27

今天在ubunt22.04编译最新的sunxi-tools也遇到了这个问题。
已经通过apt安装libusb-1.0-dev了,但还是报这个错误,fel_lib.c文件里报错找不到libusb.h。
向上翻,找到这些提示:

cc -std=c99 -Wall -Wextra -Wno-unused-result -D_POSIX_C_SOURCE=200112L -D_BSD_SOURCE -D_DEFAULT_SOURCE -Iinclude/  `pkg-config --cflags libusb-1.0` `pkg-config --cflags zlib`  -o sunxi-fel \
	fel.c fit_image.c progress.c soc_info.c fel_lib.c fel-spiflash.c  `pkg-config --libs libusb-1.0` `pkg-config --libs zlib` -lfdt
Package libusb-1.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libusb-1.0.pc'
to the PKG_CONFIG_PATH environment variable
Package 'libusb-1.0', required by 'world', not found
Package libusb-1.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libusb-1.0.pc'
to the PKG_CONFIG_PATH environment variable
Package 'libusb-1.0', required by 'world', not found

手动执行pkg-config --libs libusb-1.0也是报错,按提示找PKG_CONFIG_PATH。

echo $PKG_CONFIG_PATH

发现是空的,搜pkgconfig,搜到多个目录,有一个目录下有上边提示的libusb-1.0.pc,将PKG_CONFIG_PATH设为该目录。

export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/

再make,发现没上边那个提示了,但是仍报错找不到libusb.h。编辑fel_lib.c文件,找到报错那行,修改为:

#include <libusb-1.0/libusb.h>

再次编译就通过了。

#476 Re: Cortex M0/M3/M4/M7 » 国产王炸中的战斗机-普冉py32f003/py32f030(价格6毛起步) » 2023-04-15 16:43:52

@yjmwxwx

没看懂,汇编的程序里不需要main吗?
我还专门下了这个zip文件,发现帖子里的这部分就是工程里1.s里的全部。我以为会有个类似main:的函数呢。

而且也没搞明白makefile里只包含了这个1.s文件,gcc编译?

那个zhanding是啥含义?

#477 Re: 全志 SOC » 全志H6开发板-从零入门ARM高速电路设计 » 2023-04-14 10:46:16

nTliang 说:

楼主牛逼,才知道usb和sd卡都要做阻抗匹配

sd卡不需要做阻抗匹配吧?

#478 Re: 全志 SOC » t113-s3 linux 如何配置网口? » 2023-04-13 11:52:45

在board.dts设备树里有gmac描述,pe口,mq_r的这部分是用了pe0-15管脚,状态是关闭。
参考了100ask的设备树里的这部分,改成只用pe0-pe9,状态改为okay。

就是不知道tina linux的make menuconfig配置里还需要做哪些设置。

#479 全志 SOC » t113-s3 linux 如何配置网口? » 2023-04-12 17:49:04

Gentlepig
回复: 3

tina linux默认没有网口吧?
mango的麻雀板也没带网口。
那么如何使用网口呢?需要修改设备树?求个现成的。
立创上的t113-s3开源工程v1.1版是有网口的,我也是参考这个网口部分画的。但是群主在网盘分享的sdk有15G那么大...

#480 Re: 全志 SOC » t113-s3-支持W25N02 » 2023-04-10 17:09:23

请问,tina linux从坑网哪个帖子里下的呢?
我也想下载。

#481 Re: 全志 SOC » 开源 T113-s3 图纸 » 2023-04-10 17:03:44

奇怪,在板块上看到这个帖子有4个回复,进来以后只看到一个我的回复。
其他3个贴被删了?

#482 Re: 全志 SOC » 全志H6开发板-从零入门ARM高速电路设计 » 2023-04-10 11:20:02

tocurd 说:

问一下这种BGA的咋手焊啊

应该是热风枪吹,失败了然后手动植球(球不知道是用烙铁焊还是风枪吹)

真强啊,赶紧去下载文件学习下。

#484 Re: 全志 SOC » 开源 T113-s3 图纸 » 2023-04-08 09:48:41

好东西,感谢分享。
为何有J6、J7两个TF卡接口?

看了串口接收管脚那里做了5V/3.3V电压转换,才想到我刚发出去的t113-s3板子串口部分没考虑电平转换,直接接了5V的can收发芯片...

#485 Re: 全志 SOC » 全志T113 » 2023-03-28 10:32:22

5V转其他电压部分,可以考虑不是那么高耐压的电源芯片,找那种sot23-5的,有多个厂家型号可替换的那种。
不需要外置二极管的那种,电感也可以用小封装的功率电感。

另,没有搞上电顺序控制。
我参考的原理图是3.3V产生以后,控制1.8V使能。而0.9V使能是3.3V通过个RC电路延迟势能。(也不知道为啥这样搞,直接1.8V控制0.9V使能不好吗?)
咦,为何你的DDR供电是1.5V?t113-s3和d1s还不一样?我找到两个都是d1s的原理图...(我错了,t113-s3就是1.5V给DDR供电,我这就去改我的原理图去...)

#486 全志 SOC » spi nand flash有什么优点和缺点呢? » 2023-03-23 09:08:12

Gentlepig
回复: 9

看全志的大都是用spi nand flash。
而其他家的很多都是用nand或emmc。
好奇spi nand的优点和缺点,希望能详细说说。

#487 VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 批量生产的话,如何向嵌入式arm linux板传输文件? » 2023-03-21 13:57:56

Gentlepig
回复: 0

arm板目前应用主要用到can和网口,通过mqtt连到阿里云。
连阿里云需要用到三元码,打算用一机一密的方式。打算把三元码写到个json文件里让程序读取。
批量生产的话,如何向嵌入式linux板传输好呢?
如果是pc上生成json文件再复制进取的话,pc上需要生成很多同名文件,再挨个复制进取,难免出错。

之前用air724连阿里云时,是通过串口发送特定字符串,air724再保存到板子上。

#488 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 嵌入式linux如何设置开机自动配置网络? » 2023-03-21 10:53:02

重新烧录系统了。
那么,在/etc/init.d/S100脚本里执行程序,并在后便家 “空格”和“&”。启动后,可以按ctrl + c,返回控制台,但是程序貌似还是在执行。


能不能让板子进入控制台后,再自动启动应用程序,按ctrl+c可关闭程序退回控制台?

#489 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 嵌入式linux如何设置开机自动配置网络? » 2023-03-21 09:29:14

kin 说:

加个&符号后台运行

感谢,现在是板子无法退回到控制台了,又不想重新烧写系统,发愁。
虽然pc可以通过网口ping通板子,但是板子没装ssh。

#490 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 嵌入式linux如何设置开机自动配置网络? » 2023-03-20 17:09:18

我是在/etc/init.d里建了个S100,加入
/udhcpc   
/app
结果运行app后,无法退出到控制终端。没法进入终端就没法修改/etc/init.d,死循环?

#491 VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 嵌入式linux如何设置开机自动配置网络? » 2023-03-20 16:41:46

Gentlepig
回复: 5

之前是启动板子进到系统后,手动输入udhcpc,自动获取网络。
现在想启动后自动配置网络,就在/etc/init.d里建了个启动脚本,里面加了udhcpc命令。
结果是,网口正常连接时,可以启动。
网口断开时,启动时,会一直卡在:
udhcpc: sending discover
这里。
如何设置启动不卡在这里?且启动后插入网口仍会自动获取网络配置?

#493 Re: 全志 SOC » 问各位大佬,谁有,全志T113-S3的原理图呢 » 2023-03-17 13:37:30

全志在线 有哪吒开发板原理图和pcb,是jlc格式的,芒果的t113开发板貌似也提供pdf格式的原理图。

#494 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 应用程序运行过程中,是否可以把应用程序的可执行文件删除?删除后正在运行的程序能否正常运行? » 2023-03-17 11:59:33

死磕南墙 说:

一般更新程序下载先放在临时目录下,然后创建一个shell脚本进行程序替换并启动新程序,最后由Qt创建一个进程执行shell脚本,主程序退出。

请教,这样做,相比删掉正在运行的文件然后下载新的过去,有什么优点呢?

#495 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 应用程序运行过程中,是否可以把应用程序的可执行文件删除?删除后正在运行的程序能否正常运行? » 2023-03-17 11:58:33

运行例程,且修改json文件为指定的网址,确实可以下载指定文件,且下载前先删除了应用程序文件,但应用仍可执行。

遇到了些问题,下载后的文件默认没有可执行权限,调用chmod +x给了权限。
qsimpleupdater代码里是通过qdesktopservices()打开下载的本地文件的,打开时报错:没有应用程序注册为处理此文件的。

 182 void Downloader::openDownload()
    1 {
    2    if (!m_fileName.isEmpty())
    3       QDesktopServices::openUrl(QUrl::fromLocalFile(m_downloadDir.filePath(m_fileName)));
    4 
    5    else
    6    {
    7       QMessageBox::critical(this, tr("Error"), tr("Cannot find downloaded update!"), QMessageBox::Close);
    8    }
    9 }

#496 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 应用程序运行过程中,是否可以把应用程序的可执行文件删除?删除后正在运行的程序能否正常运行? » 2023-03-16 17:39:08

Gentlepig
回复: 5

在考虑qt应用程序自升级的问题。
搜到了QSimpleUpdater这个库,https://github.com/alex-spataru/QSimpleUpdater
没明白其原理,主要是3个.cpp文件,现在理解如下:
  Downloader:   下载器,删除旧文件,下载新文件,重命名文件;
  Updater: 下载json文件,获取版本信息,下载文件地址,创建Downloader对象进行文件下载;
  QSimpleUpdater: 静态类,可以创建多个Updater对象来进行多个不同文件下载;

不明白的地方:
程序运行过程中,可以删除本应用程序可执行文件?

#497 Re: 全志 SOC » 有没有128M的 像V3S性价比一样的,目前v3s只有64M » 2023-03-13 10:33:51

去别墅群里私聊坑主或小叶吧,他们是卖全志芯片的。

#498 Re: Nuvoton N32905/N32926/NUC972/N9H20/N9H26/N9H30 » socketcan,用write()发送,连续发送多条数据时,容易返回-1错误。 » 2023-03-10 15:06:39

受群里两位朋友指点,改成这样可以了。

   int ret;                                                                                      │  ▶ bin/
     1     uint8_t count = 0;                                                                            │  ▶ x86/
     2     while (write(can1Socket, &can1SendFrame, sizeof(can1SendFrame)) < 0 && count < 100)           │    aescrypto.cpp
     3     {                                                                                             │    can.c
     4         qDebug() << "socketcan write failed, delay";                                              │    cantest*
     5         count++;                                                                                  │    main.cpp*
     6         delayMs(1);                                                                               │    nuvotoncan.cpp*
     7     }     

#499 Nuvoton N32905/N32926/NUC972/N9H20/N9H26/N9H30 » socketcan,用write()发送,连续发送多条数据时,容易返回-1错误。 » 2023-03-10 14:30:43

Gentlepig
回复: 1

请教,socketcan,用write()发送,连续发送多条数据时,容易返回-1错误。
write加一句qDebug()打印发送的数据后,可以了,但偶尔还是会出,概率极小。感觉是相当于加了个延时等待。
socketcan有没有判断是否可写的功能?

oid NuvotonCan::socketCanSend(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
   1 {
   2     memset(&can1SendFrame, 0, sizeof(struct can_frame));
   3     can1SendFrame.can_id = (0x1b60f5f4 & CAN_EFF_MASK) | CAN_EFF_FLAG;
   4     can1SendFrame.can_dlc = 8;
   5     can1SendFrame.data[0] = d0;
   6     can1SendFrame.data[1] = d1;
   7     can1SendFrame.data[2] = d2;
   8     can1SendFrame.data[3] = d3;
   9     can1SendFrame.data[4] = d4;
  10     can1SendFrame.data[5] = d5;
  11     can1SendFrame.data[6] = d6;
  12     can1SendFrame.data[7] = d7;
  13 
  14     int ret;
  15     ret = write(can1Socket, &can1SendFrame, sizeof(can1SendFrame));
  16     if (ret == -1)
  17     {
  18         qDebug() << "write error!" << ret << endl;
  19     }
  20     else
  21     {
               qDebug("socketcan send ok: %x, %02x, %02x, %02x, %02x, %02x, %02x, %02x, %02x", can1SendFrame.can_id, can1SendFrame.data[0]
   7     }
   6 }

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn