导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页
    1. 主页
    2. zznzzn
    • 资料
    • 关注 2
    • 粉丝 2
    • 我的积分 3539
    • 主题 44
    • 帖子 61
    • 最佳 4
    • 群组 0

    zznzznLV 6

    @zznzzn

    3539
    积分
    6
    声望
    36
    资料浏览
    61
    帖子
    2
    粉丝
    2
    关注
    注册时间 最后登录

    zznzzn 取消关注 关注

    zznzzn 发布的最佳帖子

    • T113上uart转485功能实现

      sunxi-uart.c
      sunxi-uart.h

      如下是T113在linux下实现uart转485,patch可以参考附件,dts的配置如下:

      uart1: uart@05000400 {
      		status = "okay";
      		uart1_type = <2>;
      		uart1_rs485=<1>;
      		uart1_485fl=<0>;
      		uart1_485oe=<&pio PG 1 1 0xffffffff 0xffffffff 0>;
      	};
      

      patch如下:

      diff --git a/arch/arm/boot/dts/sun8iw20p1.dtsi b/arch/arm/boot/dts/sun8iw20p1.dtsi
      index 6e51b72..4d3fb29 100644
      --- a/arch/arm/boot/dts/sun8iw20p1.dtsi
      +++ b/arch/arm/boot/dts/sun8iw20p1.dtsi
      @@ -613,8 +613,11 @@
       			clock-names = "uart1";
       			resets = <&ccu RST_BUS_UART1>;
       			uart1_port = <1>;
      -			uart1_type = <4>;
      +			uart1_type = <2>;
       			status = "okay";
      +			uart1_rs485=<1>;
      +			uart1_485fl=<0>;
      +			uart1_485oe=<&pio PG 1 1 0xffffffff 0xffffffff 0>;			
       		};
       
       		uart2: uart@2500800 {
      diff --git a/drivers/tty/serial/sunxi-uart.c b/drivers/tty/serial/sunxi-uart.c
      index 395b1bd..f013ad2 100644
      --- a/drivers/tty/serial/sunxi-uart.c
      +++ b/drivers/tty/serial/sunxi-uart.c
      @@ -43,6 +43,10 @@
       #include <linux/of.h>
       #include <linux/of_irq.h>
       #include <linux/of_address.h>
      +
      +#include <linux/delay.h>
      +#include <uapi/linux/sched/types.h>
      +#include <linux/of_gpio.h>
       #include "sunxi-uart.h"
       
       #if defined(CONFIG_SERIAL_SUNXI_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
      @@ -191,6 +195,28 @@ static inline void sw_uart_disable_ier_thri(struct uart_port *port)
       	}
       }
       
      +
      +/********************************************************************/
      +/* cet,liudachuan: rs485 delayed rts release control, not used now */
      +# if 0
      +static enum hrtimer_restart uart_set_rs485(struct hrtimer *u_timer)
      +{
      +	struct sw_uart_port *sw_uport = container_of(u_timer, struct sw_uart_port, uart_timer);
      +	if(sw_uport == NULL)
      +	{
      +		SERIAL_DBG("faile to get sw_uport\n", __func__);
      +		return HRTIMER_NORESTART;
      +	}
      +	
      +	if(sw_uport->rs485_en){
      +		gpio_direction_output(sw_uport->rs485oe_io.gpio, sw_uport->rs485_fl);
      +	}
      +
      +	return HRTIMER_NORESTART;
      +}
      +#endif
      +/***********************************************************************************/
      +
       static unsigned int sw_uart_handle_rx(struct sw_uart_port *sw_uport, unsigned int lsr)
       {
       	unsigned char ch = 0;
      @@ -272,23 +298,66 @@ static unsigned int sw_uart_handle_rx(struct sw_uart_port *sw_uport, unsigned in
       	return lsr;
       }
       
      +
      +
      +/******************************************************************************/
      +/* cet,liudachuan: add sw-rs485 support */
      +#define BITS_PER_SERIAL_BYTE	10
      +#define NANOSECOND_PER_USECONDS	1000
      +#define USECONDS_PER_SECOND		1000000
      +static void sw_uart_rs485_cal_tout(struct uart_port *port, unsigned int lcr)
      +{
      +	struct sw_uart_port *sw_uport = UART_TO_SPORT(port);
      +	unsigned int bits_per_byte;
      +	if (lcr & SUNXI_UART_LCR_PARITY) /*有奇偶的时候,byte=start+8+parity=10*/
      +		bits_per_byte = 10;
      +	else    /*无奇偶的时候,byte=start+8=9*/
      +		bits_per_byte = 9;
      +
      +	if (sw_uport->baud != 0) {
      +		sw_uport->tout = 
      +			(bits_per_byte * USECONDS_PER_SECOND) / (sw_uport->baud) * NANOSECOND_PER_USECONDS;
      +	}
      +	else {
      +		sw_uport->tout = 0;
      +	}
      +}
      +
       static void sw_uart_stop_tx(struct uart_port *port)
       {
      -#if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
       	struct sw_uart_port *sw_uport = UART_TO_SPORT(port);
      +
      +#if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
       	struct sw_uart_dma *uart_dma = sw_uport->dma;
       
       	if (uart_dma->use_dma & TX_DMA)
       		sw_uart_stop_dma_tx(sw_uport);
       #endif
       	sw_uart_disable_ier_thri(port);
      +	/* cet,liudachuan: delay 1 byte transmit time then turn off rs485 tx-en */
      +	if (sw_uport->rs485_en) {
      +	   	// hrtimer_start(&sw_uport->uart_timer, sw_uport->tout, HRTIMER_MODE_REL);
      +		unsigned char lsr = 0;
      +		while ((lsr & SUNXI_UART_LSR_BOTH_EMPTY) != SUNXI_UART_LSR_BOTH_EMPTY) {
      +			// cpu_relax();
      +			udelay(10);
      +			lsr = serial_in(port, SUNXI_UART_LSR);
      +		};
      +		gpio_direction_output(sw_uport->rs485oe_io.gpio, sw_uport->rs485_fl);
      +	}
       }
       
       static void sw_uart_start_tx(struct uart_port *port)
       {
      -#if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
       	struct sw_uart_port *sw_uport = UART_TO_SPORT(port);
      +	/* cet,liudachuan: rs485 rts = 1 */
      +	// serial_out(port, sw_uport->mcr & (~SUNXI_UART_MCR_RTS), SUNXI_UART_MCR);
      +	if(sw_uport->rs485_en){
      +		// udelay(20);
      +		gpio_direction_output(sw_uport->rs485oe_io.gpio, !sw_uport->rs485_fl);
      +	}
       
      +#if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
       	if (!((sw_uport->dma->use_dma & TX_DMA) && sw_uport->dma->tx_dma_used))
       #endif
       		sw_uart_enable_ier_thri(port);
      @@ -342,8 +411,14 @@ static void sw_uart_handle_tx(struct sw_uart_port *sw_uport)
       		uart_write_wakeup(&sw_uport->port);
       		spin_lock(&sw_uport->port.lock);
       	}
      -	if (uart_circ_empty(xmit))
      -		sw_uart_stop_tx(&sw_uport->port);
      +
      +	/* cet,liudachuan: add sw-rs485 support */
      +	// if (uart_circ_empty(xmit))
      +	//     sw_uart_stop_tx(&sw_uport->port);
      +	if (!sw_uport->rs485_en) {
      +		if (uart_circ_empty(xmit))
      +			sw_uart_stop_tx(&sw_uport->port);
      +	}
       }
       
       static unsigned int sw_uart_modem_status(struct sw_uart_port *sw_uport)
      @@ -354,7 +429,7 @@ static unsigned int sw_uart_modem_status(struct sw_uart_port *sw_uport)
       	sw_uport->msr_saved_flags = 0;
       
       	if (status & SUNXI_UART_MSR_ANY_DELTA && sw_uport->ier & SUNXI_UART_IER_MSI &&
      -	    sw_uport->port.state != NULL) {
      +		sw_uport->port.state != NULL) {
       		if (status & SUNXI_UART_MSR_TERI)
       			sw_uport->port.icount.rng++;
       		if (status & SUNXI_UART_MSR_DDSR)
      @@ -724,6 +799,25 @@ static enum hrtimer_restart sw_uart_report_dma_rx(struct hrtimer *rx_hrtimer)
       
       #endif
       
      +
      +
      +/**
      + * 串口中断实测14-135us,数据发完后gic_handle_irq两次进入中断,第二次才真正进入串口中断,导致整个延迟变大
      + * 通过提高中断线程优先级为4以上,可以解决,时间缩短到(-5-35us),这里优先级设置为1
      + * cet,ljt 2021.10
      +*/
      +static inline void sw_uart_irq_set_pri(struct sw_uart_port *sw_uport)
      +{
      +    struct sched_param param = { .sched_priority = MAX_USER_RT_PRIO - 2 };
      +	if (sw_uport->irq_pri_promoted)
      +		return;
      +	if (sched_setscheduler(current, SCHED_FIFO, &param) < 0)
      +	{
      +		SERIAL_MSG("sched_setscheduler set error\n");
      +	}
      +	sw_uport->irq_pri_promoted = 1;
      +}
      +
       static irqreturn_t sw_uart_irq(int irq, void *dev_id)
       {
       	struct uart_port *port = dev_id;
      @@ -731,6 +825,9 @@ static irqreturn_t sw_uart_irq(int irq, void *dev_id)
       	unsigned int iir = 0, lsr = 0;
       	unsigned long flags;
       
      +	/* if we hasn't promote the irq priority, set priority to 97 */
      +	//sw_uart_irq_set_pri(sw_uport);
      +
       	spin_lock_irqsave(&port->lock, flags);
       
       	iir = serial_in(port, SUNXI_UART_IIR) & SUNXI_UART_IIR_IID_MASK;
      @@ -1072,7 +1169,7 @@ static void sw_uart_flush_buffer(struct uart_port *port)
       }
       
       static void sw_uart_set_termios(struct uart_port *port, struct ktermios *termios,
      -			    struct ktermios *old)
      +				struct ktermios *old)
       {
       	struct sw_uart_port *sw_uport = UART_TO_SPORT(port);
       	unsigned long flags;
      @@ -1119,6 +1216,12 @@ static void sw_uart_set_termios(struct uart_port *port, struct ktermios *termios
       	dlh = quot >> 8;
       	SERIAL_DBG("set baudrate %d, quot %d\n", baud, quot);
       
      +	/* cet,liudachuan: add sw rs485 support */
      +	sw_uport->baud = baud;
      +	if (sw_uport->rs485_en) {
      +		sw_uart_rs485_cal_tout(port, lcr);
      +	}
      +
       	spin_lock_irqsave(&port->lock, flags);
       	uart_update_timeout(port, termios->c_cflag, baud);
       
      @@ -1379,7 +1482,7 @@ static int sw_uart_ioctl(struct uart_port *port, unsigned int cmd,
       }
       
       static void sw_uart_pm(struct uart_port *port, unsigned int state,
      -		      unsigned int oldstate)
      +			  unsigned int oldstate)
       {
       #if IS_ENABLED(CONFIG_EVB_PLATFORM)
       	int ret;
      @@ -1727,7 +1830,7 @@ static void sw_console_putchar(struct uart_port *port, int c)
       }
       
       static void sw_console_write(struct console *co, const char *s,
      -			      unsigned int count)
      +				  unsigned int count)
       {
       	struct uart_port *port = NULL;
       	struct sw_uart_port *sw_uport;
      @@ -1909,6 +2012,9 @@ static int sw_uart_probe(struct platform_device *pdev)
       	char uart_para[16] = {0};
       	const char *uart_string;
       	int ret = -1;
      +	int rs485_en = 0;         //2020.09.24 2¨??? ¨?¨a?¨?RS485????
      +	int rs485_fl = 0;
      +
       	struct device_node *apk_np = of_find_node_by_name(NULL, "auto_print");
       	const char *apk_sta = NULL;
       #if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
      @@ -2052,6 +2158,45 @@ static int sw_uart_probe(struct platform_device *pdev)
       	else
       		sw_uport->card_print = false;
       
      +	/* cet,liudachuan: add sw-rs485 support */
      +	/************ Modify by wangshunfan @2021.01.11 for this part *************/
      +	/* Get rs485 enable flag */
      +	snprintf(uart_para, sizeof(uart_para), "uart%d_rs485", pdev->id);
      +	ret = of_property_read_u32(np, uart_para, &rs485_en);
      +	if (ret) {
      +		SERIAL_MSG("error to get uart%d_rs485\n", pdev->id);
      +			rs485_en = 0;
      +	}
      +	sw_uport->rs485_en = rs485_en;
      +
      +	//SERIAL_DBG("caid rs485_en = %d port = %d", rs485_en, pdev->id);
      +	if (sw_uport->rs485_en) {
      +		snprintf(uart_para, sizeof(uart_para), "uart%d_485fl", pdev->id);
      +		ret = of_property_read_u32(np, uart_para, &rs485_fl);
      +		if (ret) {
      +			SERIAL_MSG("error to get tuart%d_rs485\n", pdev->id);
      +				rs485_fl = 0;
      +		}
      +		sw_uport->rs485_fl = rs485_fl;
      +
      +		/* Get rs485 enable control pin, request and init gpio */
      +		snprintf(uart_para, sizeof(uart_para), "uart%d_485oe", pdev->id);
      +		sw_uport->rs485oe_io.gpio = of_get_named_gpio_flags(np, uart_para, 0,
      +			(enum of_gpio_flags *)(&(sw_uport->rs485oe_io)));
      +		if (gpio_is_valid(sw_uport->rs485oe_io.gpio)){
      +			gpio_request(sw_uport->rs485oe_io.gpio, NULL);
      +			gpio_direction_output(sw_uport->rs485oe_io.gpio, sw_uport->rs485_fl);
      +		}
      +
      +		/* Init hrtimer for rs485 and set timeout callback function */
      +		// hrtimer_init(&sw_uport->uart_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
      +		// sw_uport->uart_timer.function = uart_set_rs485;
      +
      +		sw_uport->irq_pri_promoted = 0;
      +		SERIAL_MSG("uart%d rs485 enabled\n", pdev->id);
      +	}
      +	/**************** end of modify by wangshunfan for this part ****************/
      +
       	pdata->used = 1;
       	port->iotype = UPIO_MEM;
       	port->type = PORT_SUNXI;
      @@ -2129,7 +2274,14 @@ static int sw_uart_remove(struct platform_device *pdev)
       	struct sw_uart_port *sw_uport = platform_get_drvdata(pdev);
       
       	SERIAL_DBG("release uart%d port\n", sw_uport->id);
      -#if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
      +
      +	/* cet,liudachuan: add sw-rs485 support */
      +	if (sw_uport->rs485_en) {
      +		gpio_free(sw_uport->rs485oe_io.gpio);	/* free gpio of rs485 */
      +		// hrtimer_cancel(&sw_uport->uart_timer);	/* canel hrtimer      */
      +	}
      +
      +#ifdef CONFIG_SERIAL_SUNXI_DMA
       	sw_uart_release_dma_tx(sw_uport);
       	sw_uart_release_dma_rx(sw_uport);
       #endif
      diff --git a/drivers/tty/serial/sunxi-uart.h b/drivers/tty/serial/sunxi-uart.h
      index 565acbf..ab096d6 100644
      --- a/drivers/tty/serial/sunxi-uart.h
      +++ b/drivers/tty/serial/sunxi-uart.h
      @@ -22,6 +22,8 @@
       #include <linux/dmaengine.h>
       #include <linux/reset.h>
       //include <linux/serial_core.h>
      +#include <linux/ktime.h>
      +#include <linux/sunxi-gpio.h>
       
       /* SUNXI UART PORT definition*/
       #define PORT_MAX_USED	PORT_LINFLEXUART  /* see include/uapi/linux/serial_core.h */
      @@ -106,6 +108,16 @@ struct sw_uart_port {
       	struct serial_rs485 rs485conf;
       	bool card_print;
       	bool throttled;
      +
      +    /* cet,liudachuan: add rs485 support(not hardware's rs485) */
      +    struct gpio_config rs485oe_io;
      +    unsigned int rs485_en;
      +    unsigned int rs485_fl;
      +    struct hrtimer uart_timer;
      +    unsigned int baud;
      +    int irq_pri_promoted;
      +    /* Added by wangshunfan @2021.01.11 for hrtimer timeout */
      +	ktime_t tout;
       };
       
       /* register offset define */
      @@ -191,6 +203,8 @@ struct sw_uart_port {
       #define SUNXI_UART_LSR_OE         (BIT(1))
       #define SUNXI_UART_LSR_DR         (BIT(0))
       #define SUNXI_UART_LSR_BRK_ERROR_BITS 0x1E /* BI, FE, PE, OE bits */
      +/* cet,liudachuan: add BOTH_EMPTY macro */
      +#define SUNXI_UART_LSR_BOTH_EMPTY   (SUNXI_UART_LSR_TEMT | SUNXI_UART_LSR_THRE)
       /* Modem Status Register */
       #define SUNXI_UART_MSR_DCD        (BIT(7))
       #define SUNXI_UART_MSR_RI         (BIT(6))
      
      发布在 MR Series
      zznzzn
      zznzzn
    • 如何给R128在FreeRTOS下配置/data目录

      在调试音频、usb等模块时,会发现SDK的根目录下没有/data该目录,导致无法存储所需要的文件,这就是因为/data目录没有配置好的原因。

      1、选上配置

      首先需要选上的配置:
      运行mrtos_menuconfig,选上COMPONENT_LITTLEFS

      -> System components
          -> thirdparty components
              [*] LittleFS Filesystem
      

      选上littlefs只是支持了这个功能,另外还需要对分区进行配置。

      2、确认分区表

      通过命令cconfigs,跳转到方案配置目录,找到文件sys_partition.fex

      这里需要注意,目录下可能会有多个分区文件,带着不同后缀的,比如说nor,xip等等的,因此需要确认用的是哪一个分区表,以免修改不生效

      在方案已经编译完成之后,运行

      pack
      

      命令对方案进行打包,通过打包时打印出来的log信息,可以提取到用的是哪一个分区表,如下:

      download1FileByUrl.png

      如图片,可以确认到打包示例中调用的分区表。

      3、修改分区表

      在分区表中加入以下配置代码:

      [partition]
          name         = UDISK
          downloadfile = "data_udisk.fex"
          user_type    = 0x8100
      

      通过上述的代码,在打包固件调用的pack_img.sh脚本中,通过函数

      function make_data_image()
      

      会创建对应的分区。

      4、挂载目录

      分区已经建好的话,剩下就是通过littlefs将区分挂载到目录下了。

      在方案的main.c函数中(这里只是举个例子,在系统启动时挂载目录即可,但是需要注意要在flash初始化完成之后才能挂载)

      在main.c中,添加以下代码:

      littlefs_mount("/dev/UDISK", "/data", true);
      

      /dev/UDISK就是分区名字,由分区表产生的。
      /data则是创建目录的名字及路径。

      通过以上步骤,即可为方案新建一个/data目录,可以用于保存一些程序所需要用到的文件。

      5、保存文件到data目录下

      1.在SDK编译环境中存放文件
      可以在编译时,所需要的文件放到UDISK分区。

      存放文件到UDISK分区方法为:

      直接将文件拷贝到编译环境对应的路径下:

      {root_dir}/board/芯片名/方案名/data/UDISK
      

      在SDK打包时就会将UDISK目录下的文件全部打包生成udisk的镜像,最终打包到image里。

      在烧录时,就会udisk的镜像烧录到对应的分区里。系统启动,挂载分区之后,就直接可以通过/data目录访问到对应的文件了。

      2.通过代码读写文件
      FreeRTOS SDK中,通过fopen fwrite fread等POSIX接口,即可操作UDISK分区(/data目录)的文件。

      以下做个示例:

      static int save_to_file(void *str, void *start, int length)
      {
              FILE *fp = NULL;
      
              fp = fopen(str, "wb+"); //save more frames
              if (!fp) {
                      printf(" Open %s error\n", (char *)str);
      
                      return -1;
              }
      
              if (fwrite(start, length, 1, fp)) {
                      fclose(fp);
      
                      return 0;
              } else {
                      printf(" Write file fail (%s)\n", strerror(errno));
                      fclose(fp);
      
                      return -1;
              }
      
              return 0;
      }
      
      • str: 路径名,若为/data目录的话,比如说写入一个a.txt,str可以定义为 /data/a.txt
      • start:所需要写入的数据起始地址
      • length:所需要写的数据的长度。
      发布在 A Series
      zznzzn
      zznzzn
    • 基于全志T507-H的Linux-RT + Igh EtherCAT主站案例分享

      本文将为各位工程师演示全志T507-H工业评估板(TLT507-EVM)基于IgH EtherCAT控制伺服电机方法,生动说明Linux-RT + Igh EtherCAT的强大之处!

      Linux-RT系统的优势

      • 内核开源、免费、功能完善。

      • RT PREEMPT补丁,使Linux内核成为硬实时操作系统,无需完整的内核重写。

      • 既有实时性,又有相同的开发生态系统(包括相同工具链、文件系统和安装方法,以及相同的POSIX API等),实现产品快速上市的期望。

      Linux-RT实时性测试(Cyclictest工具)

      Cyclictest常用于实时系统的基准测试,是评估实时系统相对性能的最常用工具之一。Cyclictest反复测量并精确统计线程的实际唤醒时间,以提供有关系统的延迟信息。它可测量由硬件、固件和操作系统引起的实时系统的延迟。

      基于全志T507-H(硬件平台:创龙科技TLT507-EVM评估板),按照创龙科技提供的案例用户手册进行操作,使用Cyclictest程序测试系统实时性,得出如下测试结果。

      在这里插入图片描述

      在这里插入图片描述

      对比测试数据,可看到基于Linux-RT-4.9.170内核的系统的延时更加稳定,最大延时更低,系统实时性更佳。

      Linux-RT性能测试

      基于全志T507-H(硬件平台:创龙科技TLT507-EVM评估板),按照创龙科技提供的案例用户手册进行操作,测试分别在CPU空载、满负荷(运行stress压力测试工具)、隔离CPU核心的情况下,得出如下测试结果。

      备注:测试数据与实际测试环境有关,仅供参考。

      在这里插入图片描述

      CPU空载状态测试,CPU0、CPU1核心Max Latencies值最大,为69us,CPU3核心的Max Latencies值最小,为66us。

      在这里插入图片描述

      CPU满负荷状态测试,CPU0核心Max Latencies值最大,为88us,CPU3核心的Max Latencies值最小,为64us。

      在这里插入图片描述

      隔离CPU核心状态测试,CPU0核心Max Latencies值最大,为73us,隔离CPU3核心的Max Latencies值最小,为41us。

      根据CPU空载、CPU满负荷、隔离CPU核心三种状态的测试结果可知:当程序指定至隔离的CPU3核心上运行时,Linux系统延迟最低,可有效提高系统实时性。故推荐对实时性要求较高的程序(功能)指定至T507-H隔离的CPU核心运行。

      基于全志T507-H的Linux-RT + IgH EtherCAT主站演示

      下文主要介绍基于全志T507-H(硬件平台:创龙科技TLT507-EVM评估板)案例,按照创龙科技提供的案例用户手册进行操作得出测试结果。

      本次演示的开发环境:

      • Windows开发环境:Windows 7 64bit、Windows 10 64bit
      • Linux开发环境:Ubuntu18.04.4 64bit
      • 虚拟机:VMware16.2.5
      • U-Boot:U-Boot 2018
      • Kernel:Linux-RT-4.9.170
      • LinuxSDK:LinuxSDK-[版本号].tar.gz(基于全志官方V2.0_20220618)
      • IgH EtherCAT:ethercat-stable-1.5-gcd0d17d-20210723
      • 伺服驱动器:台达ASD-A2-0121-E
      • 伺服电机:台达ECMA-C10401GS
      • 硬件平台:TLT507-EVM评估板(基于全志T507-H)

      IgH EtherCAT简介

      IgH EtherCAT为运行于Linux系统的免费开源EtherCAT主站程序,框架如下所示,

      在这里插入图片描述

      IgH EtherCAT主站通过构建Linux字符设备,应用程序通过对字符设备的访问实现与EtherCAT主站模块的通信。

      IgH EtherCAT开发包提供EtherCAT工具,该工具提供各种可在Linux用户层运行的命令,可直接实现对从站的访问和设置,如设置从站地址、显示总线配置、显示PDO数据、读写SDO参数等。

      案例说明

      案例功能:EtherCAT通讯周期时间为1ms,控制伺服电机正转和反转,并通过串口循环打印EtherCAT通讯周期时间的最大值和最小值。

      (1)正转:伺服电机目标速度从0加速到10000,当达到10000速度后,控制伺服电机减速至0,循环运行。

      (2)反转:伺服电机目标速度从0加速到-10000,当达到-10000速度后,控制伺服电机减速至0,循环运行。

      在这里插入图片描述

      为便于测试,我司提供已验证的基于Linux-RT编译生成的内核镜像文件和内核模块,位于产品资料“4-软件资料\Linux\Kernel\image\linux-4.9.170-[版本号]-[Git系列号]\”目录下。

      请将Linux-RT内核镜像boot-rt.fex和Linux-RT内核配套的内核模块modules-rt目录下4.9.170-[版本号]-[Git系列号].tar.gz压缩包的拷贝至评估板文件系统目录下。

      执行如下命令,将boot-rt.fex重命名为boot.fex,同时将内核模块压缩包解压。

      Target#mv boot-rt.fex boot.fex
      
      Target#tar -zxf 4.9.170-rt129-g4c65c66.tar.gz
      

      在这里插入图片描述

      执行如下命令替换内核镜像和内核模块,评估板重启生效。

      备注:mmcblk1为Micro SD对应的设备节点,如需固化至eMMC,请将设备节点修改为mmcblk0。

      Target#dd if=boot.fex of=/dev/mmcblk1p3 conv=fsync
      
      Target#rm /lib/modules/* -rf
      
      Target#cp $(uname -r) /lib/modules/ -r
      
      Target#sync
      
      Target#reboot
      

      在这里插入图片描述

      在这里插入图片描述

      案例测试

      请按下图所示使用网线连接评估板ETH0 RGMII网口和伺服驱动器A的IN网口,将伺服驱动器A的OUT网口使用网线连接至伺服驱动器B的IN网口。

      在这里插入图片描述
      在这里插入图片描述
      为便于测试,我司提供的经验证的IgH EtherCAT主站程序为案例"igh_ethercat\images"目录下的ethercat-stable-1.5-gcd0d17d.tar.gz压缩包,将其拷贝至评估板文件系统任意目录下。

      执行如下命令,解压ethercat-stable-1.5-gcd0d17d.tar.gz压缩包将会得到_install文件夹。

      Target#tar -zxf ethercat-stable-1.5-gcd0d17d.tar.gz
      

      在这里插入图片描述

      执行如下命令,并查询评估板网卡物理地址。

      Target#ifconfig
      

      在这里插入图片描述

      执行如下命令,加载驱动模块。

      Target#insmod -f /root/_install/modules/ec_master.ko main_devices=46:99:F6:AB:1F:19
      

      在这里插入图片描述
      执行如下命令,拷贝EtherCAT主站相关文件至评估板文件系统。

      Target#mkdir /etc/sysconfig
      
      Target#cp /root/_install/etc/sysconfig/ethercat /etc/sysconfig
      
      Target#ls /lib/modules/$(uname -r)//查看是否已创建modules目录
      
      Target#cp ./_install/modules/ec_master.ko /lib/modules/$(uname -r)
      
      Target#depmod -a //同步模块依赖关系,同步过程中打印警告请忽略
      

      在这里插入图片描述

      执行如下命令,启动EtherCAT主站。

      Target#/root/_install/etc/init.d/ethercat start
      

      在这里插入图片描述

      执行如下命令,加载ec_generic.ko驱动文件。

      Target#insmod -f /root/_install/modules/ec_generic.ko
      

      在这里插入图片描述
      执行如下命令,添加IgH动态链接库路径。

      Target#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/_install/lib
      

      在这里插入图片描述
      将案例bin目录下的igh_ethercat_dc_motor可执行文件拷贝至评估板文件系统,执行如下命令查看参数信息。

      Target#./igh_ethercat_dc_motor --help
      

      在这里插入图片描述
      执行如下命令,控制两台伺服电机同时正转。

      Target#./igh_ethercat_dc_motor -d 0
      

      在这里插入图片描述
      在这里插入图片描述
      按下"Ctrl + C",停止运行程序。
      在这里插入图片描述

      执行如下命令,控制两台伺服电机同时反转。

      Target#./igh_ethercat_dc_motor -d 1
      

      在这里插入图片描述
      按下"Ctrl + C",停止运行程序。

      在这里插入图片描述

      发布在 创龙科技专区
      zznzzn
      zznzzn
    • 【R128经验分享】启用USB ADB以及无线ADB配置方法

      首先在FreeRTOS的环境下,选择r128_c906_pro:

      source envsetup.sh
      lunch_rtos r128s2_pro_c906
      

      USB ADB的配置比较常规,注意以下几个驱动的勾选

      • usb device驱动
      • adb gadget驱动
      • adbd应用

      运行menuconfig,选择对应的驱动以及软件包:

      mrtos_menuconfig
      

      配置好的图片如下图所示

      downloadFileByUrl (3).png

      downloadFileByUrl (1).png

      downloadFileByUrl (4).png

      当选上以上配置时,usb的adb功能已经可以正常使用了。无线adb还需要额外选上以下配置:

      配置是开启无线adb的配置。

      downloadFileByUrl (5).png

      无线adb的端口,默认为5555

      downloadFileByUrl (6).png

      当上面配置全部选上后,编译烧录即可使用无线adb调试功能。

      1、首先让笔记本与板子,都连上共一个wifi,使其处于局域网的状态。

      2、板子串口控制台运行

      ifconfig
      

      查看ip地址。

      3、笔记本首先使用

      ping 板子ip地址
      

      命令确认笔记本是否能连接上板子。

      4、运行

      adb connect 板子ip地址
      

      进行连接。

      downloadFileByUrl (7).png

      5、出现如上图的connect to 板子ip地址的字符,表示已经连接成功。
      6、接下来就可以运行adb的一些调试命令了。

      7、如果更换了无线adb的端口,比如说从5555改成了5556,那么在笔记本中连接adb的命令需要改成:

      adb connect 板子ip地址:5556
      

      相对于原来的命令多了“:5556”,原来的命令是自动省略端口“:5555”。

      发布在 A Series
      zznzzn
      zznzzn

    zznzzn 发布的最新帖子

    • 基于全志T507-H的Linux-RT + Igh EtherCAT主站案例分享

      本文将为各位工程师演示全志T507-H工业评估板(TLT507-EVM)基于IgH EtherCAT控制伺服电机方法,生动说明Linux-RT + Igh EtherCAT的强大之处!

      Linux-RT系统的优势

      • 内核开源、免费、功能完善。

      • RT PREEMPT补丁,使Linux内核成为硬实时操作系统,无需完整的内核重写。

      • 既有实时性,又有相同的开发生态系统(包括相同工具链、文件系统和安装方法,以及相同的POSIX API等),实现产品快速上市的期望。

      Linux-RT实时性测试(Cyclictest工具)

      Cyclictest常用于实时系统的基准测试,是评估实时系统相对性能的最常用工具之一。Cyclictest反复测量并精确统计线程的实际唤醒时间,以提供有关系统的延迟信息。它可测量由硬件、固件和操作系统引起的实时系统的延迟。

      基于全志T507-H(硬件平台:创龙科技TLT507-EVM评估板),按照创龙科技提供的案例用户手册进行操作,使用Cyclictest程序测试系统实时性,得出如下测试结果。

      在这里插入图片描述

      在这里插入图片描述

      对比测试数据,可看到基于Linux-RT-4.9.170内核的系统的延时更加稳定,最大延时更低,系统实时性更佳。

      Linux-RT性能测试

      基于全志T507-H(硬件平台:创龙科技TLT507-EVM评估板),按照创龙科技提供的案例用户手册进行操作,测试分别在CPU空载、满负荷(运行stress压力测试工具)、隔离CPU核心的情况下,得出如下测试结果。

      备注:测试数据与实际测试环境有关,仅供参考。

      在这里插入图片描述

      CPU空载状态测试,CPU0、CPU1核心Max Latencies值最大,为69us,CPU3核心的Max Latencies值最小,为66us。

      在这里插入图片描述

      CPU满负荷状态测试,CPU0核心Max Latencies值最大,为88us,CPU3核心的Max Latencies值最小,为64us。

      在这里插入图片描述

      隔离CPU核心状态测试,CPU0核心Max Latencies值最大,为73us,隔离CPU3核心的Max Latencies值最小,为41us。

      根据CPU空载、CPU满负荷、隔离CPU核心三种状态的测试结果可知:当程序指定至隔离的CPU3核心上运行时,Linux系统延迟最低,可有效提高系统实时性。故推荐对实时性要求较高的程序(功能)指定至T507-H隔离的CPU核心运行。

      基于全志T507-H的Linux-RT + IgH EtherCAT主站演示

      下文主要介绍基于全志T507-H(硬件平台:创龙科技TLT507-EVM评估板)案例,按照创龙科技提供的案例用户手册进行操作得出测试结果。

      本次演示的开发环境:

      • Windows开发环境:Windows 7 64bit、Windows 10 64bit
      • Linux开发环境:Ubuntu18.04.4 64bit
      • 虚拟机:VMware16.2.5
      • U-Boot:U-Boot 2018
      • Kernel:Linux-RT-4.9.170
      • LinuxSDK:LinuxSDK-[版本号].tar.gz(基于全志官方V2.0_20220618)
      • IgH EtherCAT:ethercat-stable-1.5-gcd0d17d-20210723
      • 伺服驱动器:台达ASD-A2-0121-E
      • 伺服电机:台达ECMA-C10401GS
      • 硬件平台:TLT507-EVM评估板(基于全志T507-H)

      IgH EtherCAT简介

      IgH EtherCAT为运行于Linux系统的免费开源EtherCAT主站程序,框架如下所示,

      在这里插入图片描述

      IgH EtherCAT主站通过构建Linux字符设备,应用程序通过对字符设备的访问实现与EtherCAT主站模块的通信。

      IgH EtherCAT开发包提供EtherCAT工具,该工具提供各种可在Linux用户层运行的命令,可直接实现对从站的访问和设置,如设置从站地址、显示总线配置、显示PDO数据、读写SDO参数等。

      案例说明

      案例功能:EtherCAT通讯周期时间为1ms,控制伺服电机正转和反转,并通过串口循环打印EtherCAT通讯周期时间的最大值和最小值。

      (1)正转:伺服电机目标速度从0加速到10000,当达到10000速度后,控制伺服电机减速至0,循环运行。

      (2)反转:伺服电机目标速度从0加速到-10000,当达到-10000速度后,控制伺服电机减速至0,循环运行。

      在这里插入图片描述

      为便于测试,我司提供已验证的基于Linux-RT编译生成的内核镜像文件和内核模块,位于产品资料“4-软件资料\Linux\Kernel\image\linux-4.9.170-[版本号]-[Git系列号]\”目录下。

      请将Linux-RT内核镜像boot-rt.fex和Linux-RT内核配套的内核模块modules-rt目录下4.9.170-[版本号]-[Git系列号].tar.gz压缩包的拷贝至评估板文件系统目录下。

      执行如下命令,将boot-rt.fex重命名为boot.fex,同时将内核模块压缩包解压。

      Target#mv boot-rt.fex boot.fex
      
      Target#tar -zxf 4.9.170-rt129-g4c65c66.tar.gz
      

      在这里插入图片描述

      执行如下命令替换内核镜像和内核模块,评估板重启生效。

      备注:mmcblk1为Micro SD对应的设备节点,如需固化至eMMC,请将设备节点修改为mmcblk0。

      Target#dd if=boot.fex of=/dev/mmcblk1p3 conv=fsync
      
      Target#rm /lib/modules/* -rf
      
      Target#cp $(uname -r) /lib/modules/ -r
      
      Target#sync
      
      Target#reboot
      

      在这里插入图片描述

      在这里插入图片描述

      案例测试

      请按下图所示使用网线连接评估板ETH0 RGMII网口和伺服驱动器A的IN网口,将伺服驱动器A的OUT网口使用网线连接至伺服驱动器B的IN网口。

      在这里插入图片描述
      在这里插入图片描述
      为便于测试,我司提供的经验证的IgH EtherCAT主站程序为案例"igh_ethercat\images"目录下的ethercat-stable-1.5-gcd0d17d.tar.gz压缩包,将其拷贝至评估板文件系统任意目录下。

      执行如下命令,解压ethercat-stable-1.5-gcd0d17d.tar.gz压缩包将会得到_install文件夹。

      Target#tar -zxf ethercat-stable-1.5-gcd0d17d.tar.gz
      

      在这里插入图片描述

      执行如下命令,并查询评估板网卡物理地址。

      Target#ifconfig
      

      在这里插入图片描述

      执行如下命令,加载驱动模块。

      Target#insmod -f /root/_install/modules/ec_master.ko main_devices=46:99:F6:AB:1F:19
      

      在这里插入图片描述
      执行如下命令,拷贝EtherCAT主站相关文件至评估板文件系统。

      Target#mkdir /etc/sysconfig
      
      Target#cp /root/_install/etc/sysconfig/ethercat /etc/sysconfig
      
      Target#ls /lib/modules/$(uname -r)//查看是否已创建modules目录
      
      Target#cp ./_install/modules/ec_master.ko /lib/modules/$(uname -r)
      
      Target#depmod -a //同步模块依赖关系,同步过程中打印警告请忽略
      

      在这里插入图片描述

      执行如下命令,启动EtherCAT主站。

      Target#/root/_install/etc/init.d/ethercat start
      

      在这里插入图片描述

      执行如下命令,加载ec_generic.ko驱动文件。

      Target#insmod -f /root/_install/modules/ec_generic.ko
      

      在这里插入图片描述
      执行如下命令,添加IgH动态链接库路径。

      Target#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/_install/lib
      

      在这里插入图片描述
      将案例bin目录下的igh_ethercat_dc_motor可执行文件拷贝至评估板文件系统,执行如下命令查看参数信息。

      Target#./igh_ethercat_dc_motor --help
      

      在这里插入图片描述
      执行如下命令,控制两台伺服电机同时正转。

      Target#./igh_ethercat_dc_motor -d 0
      

      在这里插入图片描述
      在这里插入图片描述
      按下"Ctrl + C",停止运行程序。
      在这里插入图片描述

      执行如下命令,控制两台伺服电机同时反转。

      Target#./igh_ethercat_dc_motor -d 1
      

      在这里插入图片描述
      按下"Ctrl + C",停止运行程序。

      在这里插入图片描述

      发布在 创龙科技专区
      zznzzn
      zznzzn
    • 回复: 新 SDK 平台下载 D1-H/D1s SDK

      @gharibi 那只能是网络问题了

      发布在 MR Series
      zznzzn
      zznzzn
    • 回复: 新 SDK 平台下载 D1-H/D1s SDK

      @gharibi
      try

      sudo git config --global credential.helper store
      
      发布在 MR Series
      zznzzn
      zznzzn
    • 回复: 手把手带你T113-S3使用TinaSDK适配RTL8723BS

      图片全挂啦!!!

      发布在 其它全志芯片讨论区
      zznzzn
      zznzzn
    • 为什么t527的设备树uart0没有配置引脚

      lQLPJyF67RO8gL_NAVbNAeGwBKbzB8jE118Fy6O3_M2CAA_481_342.png

      发布在 T Series
      zznzzn
      zznzzn
    • 详解OpenHarmony各部分文件在XR806上的编译顺序

      大家好,今天我们来谈一谈编程时一个很有趣的话题——编译顺序。我知道,一提到编译可能大家会感到有点儿头疼,但请放心,我不会让大家头疼的。我们要明白,在开始写代码之前,了解整个程序的编译路径是十分有必要的。这就好比你要去一个陌生的地方,首先得知道怎么走才能到达目的地,对吧?

      20211210_151829-resized.jpg

      首先呢,得看看这个vendor/xradio/xr806/config.json,这可是个关键角色。它就像是一个交通警察,告诉编译器:“嘿,你得先编译这个,然后再编译那个。”其中的product_name就是交通警察手中的指挥棒,它决定了执行hb set时会出现的选项。而device_company、board、kernel_type这三位则是一同决定了代码的行走路径。

      当你用hb set选定了wifi_skylark后,就会在根目录中生成一个叫做ohos_config.json的文件。这个文件就像是一张地图,上面清楚地标明了各个代码文件应该放置的位置。这样,编译器就知道去哪里找这些代码了。

      378790254-6573fb3f993f8.png

      然后,当你执行hb build -f命令时,HarmonyOS的编译脚本就会从device_path中获取编译工具和编译选项,从product_path下寻找BUILD.gn文件。这个过程就像是在准备一场演出,编译工具是音响设备,编译选项是音量调节器,而BUILD.gn文件则是节目单。

      3430817475-6573fbfd9cdbc.png

      BUILD.gn文件中的内容可是相当精彩的。其中build_ext_component("libSDK")就像是一个大明星,有很多依赖项需要先行准备。这些依赖项就像是它的伴舞团队和乐队,得提前到位才能确保演出的顺利进行。

      3136971961-6573fe6b47cf3.png

      同样的道理也适用于group("xr806")和ohosdemo/BUILD.gn中的内容。这些文件和文件夹都需要按照一定的顺序进行编译,才能确保整个程序的顺利运行。

      最后呢,当你打开hello_demo/BUILD.gn时,你会看到import("//device/xradio/xr806/liteos_m/config.gni")这句话。这就像是在演出开始前,主持人走上台说:“感谢大家的支持,现在我们开始演出!”然后,static_library("app_hello")就像是第一个节目,闪亮登场!

      你想想看,一群代码如果不按照顺序来,岂不是乱成一锅粥了?好在Harmony给我们提供了明确的编译顺序,让代码们可以乖乖排队,一个个等待被编译。所以说啊,编译顺序可是个大学问。只有掌握了正确的顺序,才能让代码们和谐共处,共同演绎出一场精彩的程序运行秀!

      以XR806_OpenHarmony为例,当你通过hb set选定wifi_skylark后,会在根目录中生成一个叫ohos_config.json的文件。这个文件里主要包括以下内容:

      {
       "root_path": "/home/workspace/Harmony_XR806",
       "board": "xr806",
       "kernel": "liteos_m",
       "product": "wifi_skylark",
       "product_path": "/home/workspace/Harmony_XR806/vendor/xradio/xr806",
       "device_path": "/home/workspace/Harmony_XR806/device/xradio/xr806/liteos_m"
      }
      

      然后,当你执行hb build -f时,HarmonyOS的编译脚本就会从device_path中获取编译工具和编译选项,然后从product_path下寻找BUILD.gn文件。

      现在让我们看看这个BUILD.gn文件的内容:

      build_ext_component("libSDK") {
        exec_path = rebase_path(".", root_build_dir)
        outdir = rebase_path("$root_out_dir")
        command = "./build.sh ${outdir}"
        deps = [
            "//kernel/liteos_m:kernel",       #(3)
            "os:liteos_glue",
            "adapter/hals:adapter",
            "adapter/console:app_console",
            "ohosdemo:ohosdemo",              #(2)
        ]
      }
      
      group("xr806") {
          deps = [
              ":libSDK"       #(1)
          ]
      }
      

      这里有三个需要注意的地方:

      1、deps关键字代表执行group("xr806")前需要先执行libSDK,也就是build_ext_component("libSDK")。

      2、在执行build_ext_component("libSDK")前,需要先找到ohosdemo文件夹下的BUILD.gn,并且这个文件里会有ohosdemo的定义。

      3、//代表绝对路径,可以理解为根目录。比如//kernel/liteos_m代表根目录下的kernel/liteos_m文件夹。

      最后,关于演示部分:

      XR806_OpenHarmony串口默认配置为:波特率115200,无校验,8位数据位,1位停止位。开发板成功连接PC上对串口调试助手后按下开发板的复位按键串口输出。这段文字描述了如何配置串口以及如何通过串口输出信息。当你连接开发板到PC并使用串口调试助手进行调试时,你可以通过发送复位信号来启动应用程序,然后你将看到“Hello World!”消息输出到串口上。这个过程就像是我们在家里看电视,按下遥控器上的播放键就能看到精彩的节目一样简单!希望大家在编码的道路上越走越顺!

      本文转载自:https://aijishu.com/a/1060000000442210

      发布在 Wireless & Analog Series
      zznzzn
      zznzzn
    • 有没有大佬在测试D1s melis 的时候遇到epc register corrupted

      有没有大佬在测试D1s melis 的时候遇到这个问题的epc register corrupted!!

      ``
      msh />disp_layer_alpha_tes0t3 0
      disp_layer_alpha_tes0t3: command not found.
      msh />disp_layer_alpha_test3 0
      msh />cedar_test F:\output.mp4
      cmd_cedar_test start, free mem size:45194872
      vplay filename = F:\output.mp4
      [DBG]: [LDR_LoadFile:0261]: filepath = d:\mod\cedar.mod.
      [DBG]: [esMEMS_FreeMemSize:2352]: aval memory: 0x02b00c18.
      ========mp_display:0xe9a052e8=========
      vedio screen=0 0 800 800
      ===11=====mp_display:0xe9a052e8=========
      [DBG]: [layer_request:0691]: layer_request MOD_DISP_LAYER_WORK_MODE_SCALER
      [DBG]: [layer_request:0739]: requested: ch:0, id:1 disp_mgr[0].req_layer_cnt = 2
      pipe = 0, prio = 255, w:800, h:800
      request_vedio_layer success...
      [DBG]: [esMEMS_FreeMemSize:2352]: aval memory: 0x02b00c18.
      [DBG]: [PlayMediFile:0964]: Play file: F:\output.mp4!

      cmd_cedar_test end, free mem size:45020584
      msh />[DBG]: [LDR_LoadFile:0261]: filepath = d:\mod\cedar\avs.drv.
      [DBG]: [install_psr:0203]: load psr_video.plg!
      [DBG]: [LDR_LoadFile:0261]: filepath = d:\mod\cedar\psr_video.plg.
      [DBG]: [CEDAR_fs_set_encrytp_mod:0049]: [YG] g_cedar_encrytp_mod:0

      [DBG]: [pvfopen:0042]: filename: F:\output.mp4
      [DBG]: [GetParserType:0216]: parser type:4104
      [DBG]: [PsrVideo_MIoctrl:2574]: cmd:2e aux:0
      [DBG]: [PsrVideo_MIoctrl:2612]: enter set:0 1
      [DBG]: [PlayMediFile:1220]: Set MediaTpe=0x1.
      [DBG]: [PlayMediFile:1232]: type[14] w[1280] h[720]

      =====================================================================================================
      EXC_INST_PAGE_FAULT

      thread: 0xE940412A, entry: 0x00000000e940412a, stack_base: 0x00000000409de000,stack_size: 0x00003000.
      x0:0x0000000000000000 ra:0x00000000e9406016 sp:0x00000000409e0e50 gp:0x00000000403420e4
      tp:0x00000000409d6340 t0:0x00000000e9400164 t1:0x000000000000000e t2:0x0000000000000000
      s0:0x000000004138f438 s1:0x00000000000002d0 a0:0x00000000409e0e90 a1:0x00000000e94104b3
      a2:0x0000000000000001 a3:0x0000000000000002 a4:0x0000000000000000 a5:0x0000000000001000
      a6:0x0000000002500000 a7:0x000000004010e8b0 s2:0x00000000e940d6f8 s3:0x0000000000001008
      s5:0x0000000000000001 s5:0x0000000000000001 s6:0xffffffffffffffd0 s7:0x000000004138f448
      s8:0x00000000e9410410 s9:0x000000004138fa68 s10:0x0000000041390438 s11:0x0000000000000500
      t3:0x0000000000000000 t4:0x0000000019999999 t5:0x0000000000000009 t6:0x0000000000000000

      other:
      sepc :0x0000000000000000
      scause :0x000000000000000c
      stval :0x0000000000000000
      sstatus :0x0000000200004120
      sscratch:0x0000000000000000

      -------backtrace-----------
      backtrace : 0X00000000
      backtrace : 0XE9406014
      backtrace : 0XE9404370
      backtrace : 0X40028ECE
      backtrace : 0X40028E6E

      -----------------------------------------------TSK Usage Report----------------------------------------------------------
          name     errno    entry       stat   prio     tcb     slice stacksize      stkfree  lt    si   so       stack_range
       0xE54040B4    0   0xe54040b4    suspend   24   0x409d66b8   15    16384       15912    15  0000 0000  [0x415b2000-0x415b6000]
       0xE5000F5C    0   0xe5000f5c    suspend   14   0x409d64d8   20     8192        7520    20  0000 0000  [0x41557000-0x41559000]
       0xE940412A    0   0xe940412a    running    9   0x409d62f8   20    12288        8736    15  0000 0000  [0x409de000-0x409e1000]
       0xE9400B8A    0   0xe9400b8a    suspend   24   0x409d6118   15    16384       15912    15  0000 0000  [0x4154a000-0x4154e000]
           tshell    0   0x400c883a    suspend   20   0x409d5f38   10    16384       11968    08  0000 0000  [0x41516000-0x4151a000]
         tp_input    0   0x400d047a    suspend    3   0x409d5d58   10     2048        1568    10  0000 0000  [0x414ba000-0x414ba800]
         kb_input    0   0x400d0074    suspend    3   0x409d5b78   10     4096        2752    10  0000 0000  [0x4150b000-0x4150c000]
       0x400385C6    0   0x400385c6    suspend   24   0x409d57b8   15     4096        3600    15  0000 0000  [0x40a32000-0x40a33000]
            disp2    0   0x4002f8c8    running   15   0x409d55d8   10     8192        5736    03  0000 0000  [0x413bf000-0x413c1000]
        kmsg2appq    0   0x400d4a5c    suspend    6   0x409d53f8   10     4096        3376    07  0000 0000  [0x40a31000-0x40a32000]
         mnt_task    0   0x400fe256    suspend    7   0x409d5218   10    16384       15936    10  0000 0000  [0x409e1000-0x409e5000]
            tidle    0   0x4002bad2    running   31   0x4034f030   32     8192        7488    17  0000 0000  [0x4034f228-0x40351228]
            timer    0   0x4002f744    suspend    8   0x40351900   10    16384       12848    07  0000 0000  [0x40351ad8-0x40355ad8]
      -------------------------------------------------------------------------------------------------------------------------
      
      memory info:
          Total  0x036f3000
          Used   0x00d8fda0
          Max    0x00d93da0
      ------------------------------------------------memory information-------------------------------------------------------
      

      dump stack memory:
      0x00000000409e0e50: 0x0000000e 0x00000000 0x00000500 0x00000000
      0x00000000409e0e60: 0x000002d0 0x00000000 0xe940d6f8 0x00000000
      0x00000000409e0e70: 0x00000000 0x00000000 0x0000000e 0x00000000
      0x00000000409e0e80: 0x409e0f30 0x00000000 0x00000000 0x00000000
      0x00000000409e0e90: 0x0000000e 0x00000000 0x050002d0 0x00000000
      0x00000000409e0ea0: 0x401069c8 0x00000000 0xdeadbeef 0x00000000
      0x00000000409e0eb0: 0xdeadbeef 0x00000000 0xdeadbeef 0x00000000
      0x00000000409e0ec0: 0xdeadbeef 0x00000000 0xdeadbeef 0x00000000
      0x00000000409e0ed0: 0xdeadbeef 0x00000000 0x000009c4 0x00000000
      0x00000000409e0ee0: 0x0000500d 0x00000000 0xe940d6f8 0x00000000
      0x00000000409e0ef0: 0x00001000 0x00000000 0x409e0f30 0x00000000
      0x00000000409e0f00: 0xe9410410 0x00000000 0xe9404374 0x00000000
      0x00000000409e0f10: 0x23232323 0x23232323 0x23232323 0x23232323
      0x00000000409e0f20: 0x23232323 0x23232323 0x23232323 0x00232323
      0x00000000409e0f30: 0x00000001 0x00000000 0x00000079 0x00000000
      0x00000000409e0f40: 0x400c2e36 0x00000000 0x408f6218 0x00000000
      0x00000000409e0f50: 0x23232323 0x23232323 0x23232323 0x23232323
      0x00000000409e0f60: 0x23232323 0x23232323 0x23232323 0x23232323
      0x00000000409e0f70: 0x23232323 0x23232323 0xdeadbeef 0x00000000
      0x00000000409e0f80: 0xdeadbeef 0x00000000 0xdeadbeef 0x00000000
      0x00000000409e0f90: 0xdeadbeef 0x00000000 0xdeadbeef 0x00000000
      0x00000000409e0fa0: 0x409d62f8 0x00000000 0x4002e920 0x00000000
      0x00000000409e0fb0: 0x00000000 0x00000000 0xe940412a 0x00000000
      0x00000000409e0fc0: 0x409d5f38 0x00000000 0x40028ed0 0x00000000
      0x00000000409e0fd0: 0xffffffff 0xffffffff 0xe940412a 0x00000000
      0x00000000409e0fe0: 0x00000000 0x00000000 0x4002e920 0x00000000
      0x00000000409e0ff0: 0xdeadbeef 0x00000000 0x40028e6e 0x00000000
      0x00000000409e1000: 0x23232323 0x23232323 0x23232323 0x23232323
      0x00000000409e1010: 0x23232323 0x23232323 0x23232323 0x23232323
      0x00000000409e1020: 0x23232323 0x23232323 0x23232323 0x23232323
      0x00000000409e1030: 0x23232323 0x23232323 0x23232323 0x23232323
      0x00000000409e1040: 0x23232323 0x23232323 0x23232323 0x23232323

      epc register corrupted!!

      发布在 MR Series
      zznzzn
      zznzzn
    • 如何给R128在FreeRTOS下配置/data目录

      在调试音频、usb等模块时,会发现SDK的根目录下没有/data该目录,导致无法存储所需要的文件,这就是因为/data目录没有配置好的原因。

      1、选上配置

      首先需要选上的配置:
      运行mrtos_menuconfig,选上COMPONENT_LITTLEFS

      -> System components
          -> thirdparty components
              [*] LittleFS Filesystem
      

      选上littlefs只是支持了这个功能,另外还需要对分区进行配置。

      2、确认分区表

      通过命令cconfigs,跳转到方案配置目录,找到文件sys_partition.fex

      这里需要注意,目录下可能会有多个分区文件,带着不同后缀的,比如说nor,xip等等的,因此需要确认用的是哪一个分区表,以免修改不生效

      在方案已经编译完成之后,运行

      pack
      

      命令对方案进行打包,通过打包时打印出来的log信息,可以提取到用的是哪一个分区表,如下:

      download1FileByUrl.png

      如图片,可以确认到打包示例中调用的分区表。

      3、修改分区表

      在分区表中加入以下配置代码:

      [partition]
          name         = UDISK
          downloadfile = "data_udisk.fex"
          user_type    = 0x8100
      

      通过上述的代码,在打包固件调用的pack_img.sh脚本中,通过函数

      function make_data_image()
      

      会创建对应的分区。

      4、挂载目录

      分区已经建好的话,剩下就是通过littlefs将区分挂载到目录下了。

      在方案的main.c函数中(这里只是举个例子,在系统启动时挂载目录即可,但是需要注意要在flash初始化完成之后才能挂载)

      在main.c中,添加以下代码:

      littlefs_mount("/dev/UDISK", "/data", true);
      

      /dev/UDISK就是分区名字,由分区表产生的。
      /data则是创建目录的名字及路径。

      通过以上步骤,即可为方案新建一个/data目录,可以用于保存一些程序所需要用到的文件。

      5、保存文件到data目录下

      1.在SDK编译环境中存放文件
      可以在编译时,所需要的文件放到UDISK分区。

      存放文件到UDISK分区方法为:

      直接将文件拷贝到编译环境对应的路径下:

      {root_dir}/board/芯片名/方案名/data/UDISK
      

      在SDK打包时就会将UDISK目录下的文件全部打包生成udisk的镜像,最终打包到image里。

      在烧录时,就会udisk的镜像烧录到对应的分区里。系统启动,挂载分区之后,就直接可以通过/data目录访问到对应的文件了。

      2.通过代码读写文件
      FreeRTOS SDK中,通过fopen fwrite fread等POSIX接口,即可操作UDISK分区(/data目录)的文件。

      以下做个示例:

      static int save_to_file(void *str, void *start, int length)
      {
              FILE *fp = NULL;
      
              fp = fopen(str, "wb+"); //save more frames
              if (!fp) {
                      printf(" Open %s error\n", (char *)str);
      
                      return -1;
              }
      
              if (fwrite(start, length, 1, fp)) {
                      fclose(fp);
      
                      return 0;
              } else {
                      printf(" Write file fail (%s)\n", strerror(errno));
                      fclose(fp);
      
                      return -1;
              }
      
              return 0;
      }
      
      • str: 路径名,若为/data目录的话,比如说写入一个a.txt,str可以定义为 /data/a.txt
      • start:所需要写入的数据起始地址
      • length:所需要写的数据的长度。
      发布在 A Series
      zznzzn
      zznzzn
    • 【R128经验分享】启用USB ADB以及无线ADB配置方法

      首先在FreeRTOS的环境下,选择r128_c906_pro:

      source envsetup.sh
      lunch_rtos r128s2_pro_c906
      

      USB ADB的配置比较常规,注意以下几个驱动的勾选

      • usb device驱动
      • adb gadget驱动
      • adbd应用

      运行menuconfig,选择对应的驱动以及软件包:

      mrtos_menuconfig
      

      配置好的图片如下图所示

      downloadFileByUrl (3).png

      downloadFileByUrl (1).png

      downloadFileByUrl (4).png

      当选上以上配置时,usb的adb功能已经可以正常使用了。无线adb还需要额外选上以下配置:

      配置是开启无线adb的配置。

      downloadFileByUrl (5).png

      无线adb的端口,默认为5555

      downloadFileByUrl (6).png

      当上面配置全部选上后,编译烧录即可使用无线adb调试功能。

      1、首先让笔记本与板子,都连上共一个wifi,使其处于局域网的状态。

      2、板子串口控制台运行

      ifconfig
      

      查看ip地址。

      3、笔记本首先使用

      ping 板子ip地址
      

      命令确认笔记本是否能连接上板子。

      4、运行

      adb connect 板子ip地址
      

      进行连接。

      downloadFileByUrl (7).png

      5、出现如上图的connect to 板子ip地址的字符,表示已经连接成功。
      6、接下来就可以运行adb的一些调试命令了。

      7、如果更换了无线adb的端口,比如说从5555改成了5556,那么在笔记本中连接adb的命令需要改成:

      adb connect 板子ip地址:5556
      

      相对于原来的命令多了“:5556”,原来的命令是自动省略端口“:5555”。

      发布在 A Series
      zznzzn
      zznzzn
    • 回复: 【R128填坑分享】适配LVGL界面图片和文字显示很虚,色阶明显的解决方法

      修复好之后的显示效果,一切正常了

      azcjbjq.jpg

      发布在 A Series
      zznzzn
      zznzzn