导航

    全志在线开发者论坛

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

    Alb702LV 5

    @Alb702

    1495
    积分
    12
    声望
    17
    资料浏览
    44
    帖子
    1
    粉丝
    0
    关注
    注册时间 最后登录

    Alb702 取消关注 关注

    Alb702 发布的最佳帖子

    • 回复: V853支持蓝牙BLE:请问如何让V853连接一个nRF52840芯片?

      @weifeng88
      BlueZ 使用 HCI 接口。可以进行HCI数据交换 通过 UART 或通过 USB。在大多数现代单板或 移动系统使用 UART。没有工作限制 将要。
      UART 速度通常设置为每秒 1500000...3000000 位。理论上,即使对于 A2DP 配置文件(高质量音频)来说,这也足够了。
      该串口适用于 BLE 操作,没有任何限制。

      发布在 V Series
      A
      Alb702
    • 回复: V851S tina linux ov5647 驱动程序没有 dmesg

      @kanken6174 在 V851S tina linux ov5647 驱动程序没有 dmesg 中说:

      我正在从头开始重写它。

      你好

      当我在 linux 中开发传感器驱动程序时,我使用特殊代码将 ioctl 添加到 V4l2 驱动程序、VIN 驱动程序和传感器驱动程序中。
      此 ioctl 用于直接从用户空间写入和读取传感器寄存器。 这种方法大大加快了开发速度, 因为从用户程序测试传感器寄存器编程的各种选项比从驱动程序测试要容易得多。

      发布在 V Series
      A
      Alb702
    • 回复: 有没有大佬懂axp202的呀?

      什么信号生成 _wakeup 事件? 必须在 REG42H/bit1 (PEK)、REG44/bit0 (GPIO0) REG44/bit1 (GPIO1) REG44/bit2 (GPIO2) REG44/bit3 (GPIO3) 中启用。

      发布在 灌水区
      A
      Alb702
    • 回复: V851S I2C/TWI 损坏(xfer 错误)

      @kanken6174 在 V851S I2C/TWI 损坏(xfer 错误) 中说:

      。
      您的波形图上不清楚信号的接地电平在哪里。 无论如何,最后一颗黄色“牙齿”的“低”电平高于其余的电平 冲动。 也就是说,控制器输出“下拉”的强度不够。

      全志GPIO有一个设置最大输出电流的寄存器:Px_DRVn。 我不知道当选择TWI功能时这个设置是否有效。 尝试在用户空间中通过 mmap 将寄存器地址简单地映射到内存进行试验。

      关于上拉电阻。 我在 Omnivision 传感器的文档中没有找到它,但对于 AR0330 传感器,建议值为 1.5 Kom。
      我的 A20 和 V3S MCU 上具有此上拉电阻的所有设备都可以与使用的所有传感器配合使用,在 TWI 上没有出现故障。 3.3V 和 1.8V。

      发布在 V Series
      A
      Alb702
    • 回复: 有没有大佬懂axp202的呀?

      我明白,它可以工作,但不稳定。 也许您的 AXP202 在睡眠模式下完全关闭? 当下次AXP202没有从 _wakeup 信号中恢复时,查看DRAM供电电压。

      发布在 灌水区
      A
      Alb702
    • V853 SDK:Linux内核下载。

      你好。

      我的设备从 SD 卡启动

      1.为了简化驱动程序-linux内核模块的开发,我在SDK的menuconfig中进行了设置:

      [] Include kernel in root filesystem
      [
      ] Include DTB in root filesystem

      组装好系统并将其安装到SD卡上后,我看到了linux内核文件,但找不到.dtb文件。
      还需要配置什么才能使 dtb 文件位于文件系统上?

      1. uboot 中从 SD 卡加载 Linux 内核的命令顺序是什么? 核心图像:uImage。
      发布在 V Series
      A
      Alb702
    • 回复: V853 SDK:Linux内核下载。

      @alb702 在 V853 SDK:Linux内核下载。 中说:

      uboot
      从 SD 卡启动的“快速而肮脏”的方式。 也许这对某人有用。

      V853 SDK不完全支持从SD卡启动。 我没有足够的信息来修复 SDK 的所有缺点,因此我使用了下面描述的方法。
      我的设备使用 sdc0 控制器 (PF00...PF05) 和相应的 mmc0 接口进行启动。 下面的描述中将用到该接口。

      Linux内核将通过脚本加载到uboot中。 我们准备一个文本格式的脚本,内容如下:

      setenv bootargs console=ttyS0,115200 debug panic=5 rootwait root=/dev/mmcblk0p4 earlyprintk rw loglevel=7
      fatload mmc 0:3 0x42000000 uImage
      fatload mmc 0:3 0x43000000 board.dtb
      bootm 0x42000000 - 0x43000000

      并将其以 boot.cmd 的名称保存在临时目录中。

      2、对于SDK中对应的【chip】和【board】:
      在文件 //device/config/chips/[chip]/configs/[board]/sys_config.fex 中
      需要更换:

      ;storage_type = 2
      storage_type = 1

      3.在SDK menuconfig(make menuconfig)中安装:
      menuconfig1.png

      在linux内核配置(make kernel_menuconfig)中设置:
      menuconfig4.png

      4.进入目录//lichee/brandy-2.0/u-boot-2018。 你需要做:
      make menuconfig

      对于 Boot Images 我们设置:
      menuconfig2.png

      对于 Boot Media 我们安装:
      menuconfig3.png

      如果你以这种形式组装系统并使用phoenixcard将其写入SD卡,那么u-boot很可能会启动。 但将无法访问mmc接口。 要使其出现,您需要运行命令:
      mmcinfo

      出现对界面的访问,但无法访问 mmc 部分。 你需要做:
      part list mmc 0

      现在您可以上传文件了 (fatload...)。

      1. 很明显,在u-boot控制台中输入这些命令是没有意义的,因此您需要在文件中写下引导的整个命令序列
        //device/config/chips/[chip]/configs/[board]/linux/env-4.9.cfg :
        ....
        #bootcmd=run setargs_nand boot_normal <-- 这需要禁用并替换为
        bootcmd=mmcinfo; part list mmc 0; fatload mmc 0:3 0x42000000 boot.scr; source
        ....

      6.如果使用mmc0,那么在文件中
      //lichee/brandy-2.0/u-boot-2018/drivers/mmc/mmc.c

      在 mmc_exit(void) 函数中,您需要更改:
      ...
      //int sdc_no = 2;
      int sdc_no = 0;
      ...

      您可以组装系统(make)

      1. 镜像必须在“StartUp”模式下使用phoenixcard安装到SD卡上(不是“Product”!!!) 在这种情况下,应该出现对引导部分中的目录的访问,uImage 文件应位于其中。
        您需要将boot.scr文件和board.dtb文件复制到该目录。 board.dtb 位于
        //lichee/brandy-2.0/linux-4.9/arch/arm/boot/dts/

      SDK 本身应该在构建时复制此文件,但由于某种原因它没有复制。

      1. 卸载SD 卡。 过程结束了!
      发布在 V Series
      A
      Alb702

    Alb702 发布的最新帖子

    • 回复: V853支持蓝牙BLE:请问如何让V853连接一个nRF52840芯片?

      @weifeng88
      BlueZ 使用 HCI 接口。可以进行HCI数据交换 通过 UART 或通过 USB。在大多数现代单板或 移动系统使用 UART。没有工作限制 将要。
      UART 速度通常设置为每秒 1500000...3000000 位。理论上,即使对于 A2DP 配置文件(高质量音频)来说,这也足够了。
      该串口适用于 BLE 操作,没有任何限制。

      发布在 V Series
      A
      Alb702
    • 回复: 关于R128芯片wifi sta与蓝牙是否可以同时共存(使用)

      @bsl_viys
      许多适配器都支持这一点。你们有什么 Wifi/BT 适配器芯片?

      发布在 MR Series
      A
      Alb702
    • 回复: 为啥R329的linux调试那么复杂?

      @kkkcxf

      1.向命令行输出信息需要较少的硬件资源和驱动程序,比图形用户界面。例如,如果您的视频适配器驱动程序有故障,您将无法收到任何调试信息

      1. Linux 中的许多命令只有控制台输出。如果调试过程中出现错误 您将无法在 GUI 中看到故障发生的位置。

      2. 如果您在遇到问题时到论坛寻求建议,控制台输出将包含比图像更有用的信息,并且描述问题的文件会小得多。

      发布在 灌水区
      A
      Alb702
    • 回复: V853 SDK: VIN/ISP问题

      @soso90
      cfg.tar.gz 另外:内核配置和 + device tree

      发布在 V Series
      A
      Alb702
    • V853 SDK: VIN/ISP问题

      我的项目安装了 v853s。使用的传感器是OV4689。SDK 中不支持该传感器。

      我补充道:
      OV4689 的内核驱动程序改编自 Allwinner V3s 上的工作项目 (sunxi-vfe)
      我对用户空间库(AwISPApi)进行了更改:
      我复制了文件.../isp520/libisp/isp_cfg/SENSOR_H/ov5658.h -> ov4689.h
      在文件 ov4689.h 中,我将结构名称 ov5658... 替换为 ov4689...
      表中 ISP 的系数值稍后将更改为正确的值。
      在文件 ../isp520/libisp/isp_cfg/isp_ini_parse.c 中我添加了
      #include“SENSOR_H/ov4689.h”,

      在 cfg_arr[] 中我添加了:
      ....
      {"ov4689", "ov4689_isp_cfg", 2688, 1520, 30, 0, 0, &ov4689_isp_cfg},

      运行测试程序“camera”时出现以下错误:

      [  144.200651] [ov4689]sensor_detect read value is 0x46
      camera: init successfully
      camera: image 1920x1080 30 fps init successfully
      [  144.234573] [ov4689]sensor_s_stream on = 1, 1920*1080 fps: 2 code: 3007
      [  144.313297] [VIN_ERR]isp0 frame lost!
      [  144.337600] [ov4689]s_fmt set width = 1920, height = 1080
      [  144.346640] [VIN_ERR]isp0 frame lost!
      [ISP]video device name is vin_video0
      cutils:D/AWIspApi: F:awIspGetIspId, L:48, video0 --> isp0
      >>>>>>>>>>>>>>>>>>>> ISP VERSION INFO <<<<<<<<<<<<<<<<<<<
      [ISP]version:V1.00
      [ISP]tag   : isp-500-520-v2.00
      [ISP]branch: a50_merge
      [ISP]commit: 924456a4a4b18b614a8273f282b25ad4ee59f417
      [ISP]date  : Tue Feb 12 17:03:31 2019 +0800
      [ISP]author: zhengjiangw[  144.379995] [VIN_ERR]isp0 frame lost!
      ei
      --------------------------------------------------------
      
      [ISP]register sensor entity is ov4689
      [ISP]open isp device[0] success!
      [ISP_WARN]open /mnt/isp0_ctx_saved.bin success!!!
      [ISP]cannot find ov4689_1920_1080_2_0 isp config!!!
      [ISP]use ov4689 isp config.
      [ISP_ERR] func: ae_copy_tbl_from_ini, line: 1570,AE table capture is invalid!
      [  144.413352] [VIN_ERR]isp0 frame lost!
      [ISP]create isp0 server thread!
      [  144.446712] [VIN_ERR]isp0 frame lost!
      [  144.480064] [VIN_ERR]isp0 frame lost!
      [  144.513425] [VIN_ERR]isp0 frame lost!
      [  144.546791] [VIN_ERR]isp0 frame lost!
      [  144.580141] [VIN_ERR]isp0 frame lost!
      [  144.613503] [VIN_ERR]isp0 frame lost!
      [  144.646858] [VIN_ERR]isp0 frame lost!
      [  144.680218] [VIN_ERR]isp0 frame lost!
      [  144.713581] [VIN_ERR]isp0 frame lost!
      [  144.746939] [VIN_ERR]isp0 frame lost!
      

      1.为什么会出现错误
      [ISP_ERR] func: ae_copy_tbl_from_ini, line: 1570,AE table capture is invalid!
      ??

      如果“AE_table”来自文件 ov4689.h,则该表的格式对应于 SDK 中的其他文件。 ae_copy_tbl_from_ini 函数位于 libisp_ae.so 库中。
      SDK 中没有该库的源文件。是否可以找到源文件 libisp_ae.so 找出错误原因?

      2、 ISP 的内核驱动出现错误:sunxi_isp.c

      [ 144.613503] [VIN_ERR]isp0 frame lost!

      执行 isp_isr(...) 中断处理程序时出错
      因为 ISP 中断寄存器中设置了 FRAME_LOST_PD 位。
      出于什么原因可能会设置 FRAME_LOST_PD 位?
      在哪里可以获取有关 V853s 的 ISP 寄存器的文档?

      日志显示,中断发生的周期为 33ms,即 30fps,与传感器设置相对应。由此可见,CSI 接口工作正常,故障发生在 ISP。

      发布在 V Series
      A
      Alb702
    • 回复: V853SDK:奇怪的帧缓冲区操作

      @awwwwa 在 V853SDK:奇怪的帧缓冲区操作 中说:

      cat /sys/class/disp/disp/attr/sys

      cat /sys/class/disp/disp/attr/sys
      screen 0:
      de_rate 300000000 hz, ref_fps:60
      mgr0: 1920x1080 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[3] force_sync[0] unblank direct_show[false] iommu[1]
      dmabuf: cache[0] cache max[0] umap skip[0] umap skip max[52]
      	lcd output	backlight(150)	fps:59.5	1920x1080
      	err:0	skip:154	irq:8267	vsync:0	vsync_skip:0	
         BUF    enable ch[1] lyr[0] z[16] prem[N] a[pixel 255] fmt[  0] fb[1920,1080;1920,1080;1920,1080] crop[   0,   0,1920,1080] frame[   0,   0,1920,1080] addr[48400000,       0,       0] flags[0x       0] trd[0,0]
      depth[ 0]
      

      "add layer" - i do not understanded.

      发布在 V Series
      A
      Alb702
    • 回复: F1C200S TX Empty trigger 设置成1/2触发要怎么做?

      @smbzd
      驱动程序算法的解释。

      驱动程序开发很久以前就开始了,在 Allwinner A20 的 legacy kernel 版本 3.xx 时期。 为了不使驱动程序适应Linux内核的不同API,采用直接写入GPIO和UART寄存器的方式。
      在我们的项目中,内核驱动程序和用户应用程序之间的数据交换是通过缓冲区进行的。 mmap 用于从用户空间访问缓冲区。 缓冲区包含用于接收和发送的数据以及控制结构。 为了开始传输,应用程序在缓冲区中设置一个特殊位。 驱动程序在 bum_poll() 函数的定时器中断中扫描该位(它位于不同的源代码中)。
      您很可能会使用其他方法:read()/write()、ioctl()...,并且您不需要计时器。

      /*
       * suniv xbus driver
       * (timer+uart)
       * 
       *
       * This program is free software; you can redistribute it and/or modify
       * it under the terms of the GNU General Public License version 2
       * as published by the Free Software Foundation.
       *
       * You should have received a copy of the GNU General Public License
       * along with this programOC; if not, write to the Free Software
       * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
       */
      #include <linux/module.h>
      #include <linux/kernel.h>   
      #include <linux/moduleparam.h>
      #include <asm/uaccess.h>
      #include <asm/pgtable.h>
      #include <linux/fs.h>
      #include <linux/gfp.h>
      #include <linux/cdev.h>
      #include <linux/sched.h>
      #include <linux/interrupt.h>
      #include <linux/of.h>
      #include <linux/of_irq.h>
      #include <linux/of_platform.h>
      #include <linux/platform_device.h>
      #include <linux/delay.h>
      #include <linux/ioport.h>
      #include <linux/slab.h>
      #include <linux/io.h>
      #include <linux/clk.h>
      #include <linux/reset.h>
      #include <linux/mm.h>
      #include <linux/miscdevice.h>
      #include <linux/wait.h>
      #include <linux/poll.h>
      
      static int hw_init;
      static int bum_init(void);
      static void bum_poll(void);
      
      static void gpio_set(int port, int pin);
      static void gpio_clr(int port, int pin);
      
      static enum hrtimer_restart xbus_periodic(struct hrtimer *);
      static struct hrtimer htimer;
      static int k_period; 
      static uint32_t norecv_timer;
      
      static int htimer_init(void)
      {
          k_period = ktime_set(0, 1000000); //1 ms
          hrtimer_init(&htimer, CLOCK_REALTIME, HRTIMER_MODE_REL);
          htimer.function = xbus_periodic;
          hrtimer_start(&htimer, k_period, HRTIMER_MODE_REL);
          return 0;
      }
      static void htimer_exit(void)
      {
          hrtimer_cancel(&htimer);
      }
      
      static void stop_send(void);
      
      static uint8_t *  xbus_iobuf = 0;
      #define xbus_mmap_mem()	(xbus_iobuf)
      
      /* -----------------------------Hardware registers mini description --------------------*/
      
      /*GPIO--------------------------------------*/
      
      typedef struct 
      {
          uint32_t	CFG[4];
          uint32_t	DAT;
          uint32_t	DRV[2];
          uint32_t	PULL[2];
      } 
      port_struct_t;
      
      enum {PORTA, PORTB, PORTC, PORTD, PORTE, PORTF, PORTG, PORTH,PORTI};
      
      #define PORT_IO_BASE	0x01C20800	
      #define UART_IO_BASE	0x01C25000
      
      static volatile __u8 *  port_io_base;
      static volatile __u8 *  uart_io_base;
      
      #define __gpio ((volatile port_struct_t *)(port_io_base))
      
      /*UART---------------------------------------*/
      #define UART_BASE       (uart_io_base)
      #define UART_BASE_OS    (0x400)
      #define UARTx_BASE(x)   (UART_BASE + (x) * UART_BASE_OS)
      #define RESSIZE(res)    (((res)->end - (res)->start)+1)
      
      //#define UART_HALT           0x29 /* Halt TX register */
      #define UART_FORCE_CFG      (1 << 1)
      #define UART_FORCE_UPDATE   (1 << 2)
      
      #define __uart_reg(num, off) (*(volatile __u32 *)((UARTx_BASE(num)) + (off)))
      
      #define UART_RBR(n)	__uart_reg(n, 0x00) // DLAB=0
      #define UART_THR(n)	__uart_reg(n, 0x00) // DLAB=0
      #define UART_DLL(n)	__uart_reg(n, 0x00) // DLAB=1
      #define UART_DLH(n)	__uart_reg(n, 0x04) // DLAB=1  
      #define UART_IER(n)	__uart_reg(n, 0x04) 
      #define UART_IIR(n)	__uart_reg(n, 0x08)
      #define UART_FCR(n)	__uart_reg(n, 0x08)
      #define UART_LCR(n)	__uart_reg(n, 0x0c)
      #define UART_MCR(n)	__uart_reg(n, 0x10)
      #define UART_LSR(n)	__uart_reg(n, 0x14)
      #define UART_MSR(n)	__uart_reg(n, 0x18)
      #define UART_SCH(n)	__uart_reg(n, 0x1c)
      #define UART_USR(n)	__uart_reg(n, 0x7c)
      #define UART_TFL(n)	__uart_reg(n, 0x80)
      #define UART_RFL(n)	__uart_reg(n, 0x84)
      #define UART_HALT(n)	__uart_reg(n, 0xa4)
      
      /*APB1---------------------------------------------*/ 
      #define __ccu_reg(off) (*(volatile __u32 *)((ccu_io_base) + (off)))
      #define APB1_GATING_REG	__ccu_reg(0x6c)
      /*--------------------------------------------------------------------------*/
      
      #define DTR_PORT	PORTE
      #define DTR_PIN		6
      
      //#define TIMERn		2
      //#define IRQn_TIM	19//52
      
      #define UARTn	2
      #define UART_BAUDRATE 	19200
      #define IRQn_UART	33
      
      #define CDEV_MAJOR	230
      #define CDEV_NAME	"b&ast;m"
      
       
      //========================== GPIO functions======================
      #define FMUX_IN		0
      #define FMUX_OUT	1
      #define FMUX_UART	3
      
      static void gpio_init_pin(int port, int pin, int mux)
      {   
          uint32_t tmp;
          int n = 0;
          while( pin > 7)  { pin -= 8; n++;  }
          tmp = __gpio[port].CFG[n] & ~(0xf << (pin << 2));
          __gpio[port].CFG[n] = tmp | (mux << (pin << 2));
      }
      
      static spinlock_t gpio_lock;
      
      static void gpio_set(int port, int pin)
      {
          spin_lock(&gpio_lock);
          __gpio[port].DAT |= (1 << pin);
          spin_unlock(&gpio_lock);
      }
      
      static void gpio_clr(int port, int pin)
      {
          spin_lock(&gpio_lock);
          __gpio[port].DAT &= ~(1 << pin);
          spin_unlock(&gpio_lock);
      
      } 
      
      // ========================= UART functions =======================
      inline static void start_send(void)
      {
          gpio_set(DTR_PORT, DTR_PIN);
          UART_IER(UARTn) |= (1 << 1); // set ETBEI (transmit holding register interrupt)     
      }    
      
      inline static void stop_send(void)
      {
          UART_IER(UARTn) &= ~(1 << 1);  // clr ETBEI    
          gpio_clr(DTR_PORT, DTR_PIN);
      }    
      
      static enum hrtimer_restart xbus_periodic(struct hrtimer * unused)
      {
          if(hw_init)
          {
      	norecv_timer++; 
      	if (norecv_timer > 2000) // 4s
      	{
      	    gpio_clr(DTR_PORT, DTR_PIN);
      	    norecv_timer = 0;
      	} 
              bum_poll();
          }
          hrtimer_forward_now(&htimer, k_period);
          return HRTIMER_RESTART;
      }
      
      //=================================================================
      #include "b&ast;m-core.c"
      static char tdata[128];
      static int idx; 	 
      
      static irqreturn_t irq_serial_handle(int irq, void *dev_id)
      {
          /*UART interrupt handler*/
      
         /* See "A20 User Manual 2013-03-22.pdf" , pp. 109 ... 122 */
          int data;
          uint32_t tmp = UART_IIR(UARTn) & 0xf;
          
          if (tmp == 2) // THR empty
          {
      	data = bum_uart_isr(-1);
      	if (data == -1)
      	    stop_send();
      	else
      	    UART_THR(UARTn) = data;    
          }
          else
              if (tmp == 4) // receiver data available
      	{
      	    norecv_timer = 0;
      	    bum_uart_isr(UART_RBR(UARTn));
      	}    
          return IRQ_HANDLED;
      }
      
      static int divisor;
      static int serial_hardware_init(void)
      {
          gpio_init_pin(DTR_PORT, DTR_PIN, FMUX_OUT);
      
       /* configure UART registers*/
      /* See "A20 User Manual 2013-03-22.pdf" , pp. 645 ... 665 */
      
          UART_HALT(UARTn) |= 1; 		    
          UART_LCR(UARTn) |= (1 << 7); // set DLAB (LCR.7)
          UART_DLH(UARTn) = (divisor >> 8);
          UART_DLL(UARTn) = (divisor & 0xff);
          UART_FCR(UARTn) = 0;// disable FIFO
          UART_MCR(UARTn) = 0;// disable modem control
          UART_LCR(UARTn) = (3 << 0) // DLS, 8 bits word width 
                          | (0 << 2) // STOP , 1 stop bit
      		    | (0 << 3) // PEN, parity = disabled
      		    | (0 << 4) // EPS  parity  select,
      		    | (0 << 6) // BC, no break control
      		    | (0 << 7) // clear DLAB
      		    ;
          UART_IER(UARTn) = (1 << 0);// set ERBFI / Enable Receiver Data available interrupt
          UART_HALT(UARTn) = 0; //clear HALT		    
          return 0;
      }
      
      inline static void serial_hardware_stop(int irq, void * id)
      {
          free_irq(irq, id); 
      }
      
      /* ==================== mmap implementation ======================*/
      
      struct mmap_info
      {
          char * data;
          int reference;
      };
      
      static void mmap_open(struct vm_area_struct *vma)
      {
      //    struct mmap_info * info = (struct mmap_info *)vma->vm_private_data;
      //    info->reference++; 
      }
      	
      static void  mmap_close(struct vm_area_struct *vma)
      {
      //    struct mmap_info * info = (struct mmap_info *)vma->vm_private_data;
      //    info->reference--; 
      }	
      
      static unsigned int mmap_fault(struct vm_fault * vmf)
      {
          struct page * page;
          struct vm_area_struct *vma = vmf->vma;
          unsigned long size = (unsigned long)(vma->vm_end-vma->vm_start); 
      //    struct mmap_info * info = (struct mmap_info *)vma->vm_private_data;
          size = (unsigned long)(vma->vm_end-vma->vm_start);
          if (size > PAGE_SIZE)
              return -EINVAL;
          page = virt_to_page(xbus_iobuf);
          get_page(page);
          vmf->page = page;
          return 0;
      }
      
      static const struct vm_operations_struct vm_ops = 
      {
          .open  = mmap_open,
          .close = mmap_close, 
          .fault = mmap_fault
      };
      /*=========================== -- mmap  =================================*/
      
      static int xbus_mmap_init(void)
      {
          xbus_iobuf = (uint8_t*)get_zeroed_page(GFP_KERNEL);
          if (!xbus_iobuf) {
      	printk(KERN_ERR "mmap init failed\n");
      	return 0;
          }
          return 0;
      }
      
      static void xbus_mmap_cleanup(void)
      {
          if (xbus_iobuf)
      	free_page((unsigned long)xbus_iobuf);
          xbus_iobuf = 0;
      }
       
      #ifndef VM_RESERVED
      #define VM_RESERVED (VM_DONTEXPAND | VM_DONTDUMP)
      #endif 
      
      static int mmap_xbus(struct file *filp, struct vm_area_struct *vma)
      {
          vma->vm_ops = &vm_ops;
          vma->vm_flags |= VM_RESERVED;    
          vma->vm_private_data = filp->private_data;
          return 0; 
      }
      
      //////////////////////////////////////////////////////////////////////////////
      
      static DECLARE_WAIT_QUEUE_HEAD(wait);
      static int check_data_ready(void);
      
      static void indicate_data_ready(void)
      {
          wake_up_interruptible(&wait);
      }
      
      static unsigned int poll_xbus(struct file *f, struct poll_table_struct *p)
      {
          unsigned int mask = 0;
          poll_wait(f, &wait, p);
          if(check_data_ready())
      	mask |= POLLIN | POLLRDNORM;
          return mask;
      }
      
      // VFS methods:
      static struct file_operations xbus_fops =
      {
          .owner = THIS_MODULE,
          .mmap = mmap_xbus,
          .poll = poll_xbus,
      };
       
      static struct miscdevice miscdev = { MISC_DYNAMIC_MINOR, "xbus", &xbus_fops };
      
      static const struct of_device_id xbus_of_match[] = {
      	{ .compatible = "xbus-uart" },
      	{ /* Sentinel */ }
      };
      MODULE_DEVICE_TABLE(of, xbus_of_match);
      
      struct xbus_serial_data {
      	int 			irq;
      	struct clk		*clk;
      	struct clk		*pclk;
      	struct reset_control	*rst;
      };
      
      static struct xbus_serial_data xbus_serial;
      
      static void serial_remove( struct platform_device * pdev)
      {
          struct xbus_serial_data *data = platform_get_drvdata(pdev);
      
      	reset_control_assert(data->rst);
      
      	if (!IS_ERR(data->pclk))
      		clk_disable_unprepare(data->pclk);
      
      	if (!IS_ERR(data->clk))
      		clk_disable_unprepare(data->clk);
      }
      
      static int serial_setup( struct platform_device * pdev)
      {
      	struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
      	int irq = platform_get_irq(pdev, 0);
      	struct device *dev = &pdev->dev;
      	struct xbus_serial_data *data;
      	int err = -1;
      	int uart_clk;
      
      	if (!regs) {
      		dev_err(dev, "no registers defined\n");
      		return -EINVAL;
      	}
      
      	if (irq < 0) {
      		if (irq != -EPROBE_DEFER)
      			dev_err(dev, "cannot get irq\n");
      		return irq;
      	}
      
      	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
      	if (!data)
      		return -ENOMEM;
      
      	data->clk = devm_clk_get(dev, "baudclk");
      	if (IS_ERR(data->clk) && PTR_ERR(data->clk) != -EPROBE_DEFER)
      		data->clk = devm_clk_get(dev, NULL);
      	if (IS_ERR(data->clk) && PTR_ERR(data->clk) == -EPROBE_DEFER)
      		return -EPROBE_DEFER;
      	if (!IS_ERR_OR_NULL(data->clk)) {
      		err = clk_prepare_enable(data->clk);
      		if (err)
      			dev_warn(dev, "could not enable optional baudclk: %d\n",
      				 err);
      	}
      
      	/* If no clock rate is defined, fail. */
      	if (err) {
      		dev_err(dev, "clock rate not defined\n");
      		return -EINVAL;
      	}
      
      	data->pclk = devm_clk_get(dev, "apb_pclk");
      	if (IS_ERR(data->pclk) && PTR_ERR(data->pclk) == -EPROBE_DEFER) {
      		err = -EPROBE_DEFER;
      		goto err_clk;
      	}
      	if (!IS_ERR(data->pclk)) {
      		err = clk_prepare_enable(data->pclk);
      		if (err) {
      			dev_err(dev, "could not enable apb_pclk\n");
      			goto err_clk;
      		}
      	}
      
      	uart_clk = clk_get_rate(data->clk);
          	divisor = DIV_ROUND_CLOSEST(uart_clk, 16 * UART_BAUDRATE);
      
      	data->rst = devm_reset_control_get_optional(dev, NULL);
      	if (IS_ERR(data->rst)) {
      		err = PTR_ERR(data->rst);
      		goto err_pclk;
      	}
      	reset_control_deassert(data->rst);
      	platform_set_drvdata(pdev, data);
      
      	return irq;
      //err_reset:
      	reset_control_assert(data->rst);
      err_pclk:
      	if (!IS_ERR(data->pclk))
      		clk_disable_unprepare(data->pclk);
      err_clk:
      	if (!IS_ERR(data->clk))
      		clk_disable_unprepare(data->clk);
      	return err;
      }
      
      static int xbus_probe(struct platform_device *pdev)
      {
          int irq;
          printk(KERN_ERR "xbus loading..\n");
          hw_init = 0;
          int err = misc_register(&miscdev);
          if(err != 0)
          {
      	printk("misc_register() error :%d\n", err);
      	return -EPROBE_DEFER;
          }
      
          irq = serial_setup(pdev);
          if (irq < 0)
          {
      	return -EPROBE_DEFER;
          }	
          
          xbus_serial.irq = irq;
          
          if (request_irq(irq, irq_serial_handle, IRQF_SHARED, 
      	    "xbus-suniv", &xbus_serial))
          {
               printk (KERN_ERR "request irq %d error.\n", irq);
               return -EPROBE_DEFER;
          }
      
          port_io_base	= (__u8 * )ioremap(PORT_IO_BASE, 0x400);
          uart_io_base	= (__u8 * )ioremap(UART_IO_BASE, 0x400);
      	
          if (uart_io_base == 0 || port_io_base == 0 ) 
          {
      	printk(KERN_ERR "resource ioremap failed\n");
      	return -EPROBE_DEFER;
          }
      
      
          if (htimer_init() < 0)
          {
      	iounmap(port_io_base);
      	iounmap(uart_io_base);
      	return -EPROBE_DEFER;
          }
          serial_hardware_init();
          
          xbus_mmap_init();
          bum_init();
          hw_init = 1;
          return 0;
      }
      
      static int xbus_remove(struct platform_device *pdev)
      {
          printk(KERN_ERR "xbus unloading..\n");
          hw_init = 0;
          htimer_exit();
          serial_hardware_stop(xbus_serial.irq, &xbus_serial);
          serial_remove(pdev);
          iounmap(port_io_base);
          iounmap(uart_io_base);
          xbus_mmap_cleanup();
          misc_deregister(&miscdev);
          return 0;
      }
      
      static struct platform_driver xbus_platform_driver = {
      	.driver = {
      		.name		= "xbus-suniv",
      		.owner		= THIS_MODULE,
      		.of_match_table	= xbus_of_match,
      	},
      	.probe			= xbus_probe,
      	.remove			= xbus_remove,
      };
      
      module_platform_driver(xbus_platform_driver);
      
      MODULE_LICENSE("GPL");
      MODULE_AUTHOR("albert@sokrat.ru");
      MODULE_AUTHOR("jean@sokrat.ru");
      
      

      bum_uart_isr() 它用于接收和传输。基本算法是:

      static uint8_t tx_buf[MAX_TX];
      static uint8_t rx_buf[MAX_RX];
      static int rx_count;
      static int tx_count;
      static int snd_size;
      
      int bum_uart_isr(int value)
      {
      	if (value < 0) // TX IRQ
      	{
      		if (tx_count < snd_size && tx_count < MAX_TX)
      			value = (int)tx_buf[tx_count++];
      	}
      	else  // RX IRQ
      	{
      		if (rx_count < MAX_RX)
      			rx_buf[rx_count++] = (uint8_t)value;
      	}	
      	return value;
      }
      
      发布在 其它全志芯片讨论区
      A
      Alb702
    • 回复: V853SDK:奇怪的帧缓冲区操作

      @awwwwa

      Ok.

      On my system in board.dtb set display parameter "fb format" = 0 : RGBA. This format is 32 bits per pixel. Three low bytes are component R/G/B . High byte is alpha-channel. Alpha-channel must work :

      value = 0xff : pixel fully transparent (invisible) .
      value = 0 : pixel fully non-transparent.
      intermediate values : transparency level.

      I wrote simple test program, which draw image by pixels with alpha-channel value 0 (fully non-transparent), but i got a black screen. To experiment, i set pixels alpha channel to non-zero value. The image became visible, but alpha-channel value is not affect to transparency level.

      This is very strange. Work of alpha-channel fully non-correct.

      In kernel display driver source i found optional function "color bar", which draw color bands. In this function programmed pixels with alpha-channel value = 0xff. It mean, in this function wrong work of driver is "workarounded".

      I think, this also taken into account in LVGL library in SDK : "lv_examples" application draw right images.
      But other programs, built separately from SDK, draw distorted colors, or black screen.

      Also i found in kernel display driver source init of parameter

      config.info.alpha_mode = 0;

      for RT-Mixer (part of Display Engine) layer in framebuffer initialization. This parameter value means "alpha-channel for each pixel", and i may to expect "standard" work of alpha-channel. In fact, this is not the case.

      What is this? Hardware bug of RT-Mixer? or it may be corrected through RT-Mixer register values?

      I may to try to correct problem myself, but i do not have documentation for V853 Display Engine.
      Where i may download it?
      I have description of Display Engine for old AllWinner MPUs : H3, H8, A83. What of this is match to V853 Display Engine?

      I may to easy set alpha-channel of pixel to value, which work, for my programs to this device, but i need standard work of framebuffer.

      发布在 V Series
      A
      Alb702
    • V853SDK:奇怪的帧缓冲区操作

      在我的系统上,在显示设置的 board.dtb 中,像素格式指定为 RGBA。 每个像素都用 32 位数字进行编码。 三个最低有效字节是 R/G/B 分量。 最高有效字节是 Alpha 通道。 Alpha 通道应该像这样工作:
      值 0xff - 像素完全透明(不可见)。
      值 0 - 像素完全不透明
      其他值是中等透明度。

      我编写了一个测试程序,以像素为单位输出 alpha 值为 0 的图像。但是,我得到了黑屏。 在进一步的实验中我 我发现如果 Alpha 通道值不是零,则图像是可见的。
      但 Alpha 通道值不会影响透明度级别。

      这很奇怪。

      我查看了linux内核中视频控制器驱动程序的源代码。 发现 在可选的 colorbar 函数中,在形成时绘制颜色条 图像的 Alpha 通道值设置为 0xff 。 也就是说,这种行为 从驾驶员的角度来看,这是“正常”的。 但从标准的角度来看——不。

      lvgl 库很可能也考虑到了这一点,因为 lv_examples 可以正确显示图像。 但其他程序要么输出扭曲的图像 花或黑屏。

      经过进一步调查内核驱动程序,我发现在图像层设置中 对于显示引擎参数中的 RT-Mixer 块:

      配置.info.alpha_mode = 0;

      初始化帧缓冲区时。

      该值对应于“标准”Alpha 通道操作。 然而它不起作用。

      这是什么? RT-Mixer 硬件错误? 或者可以通过参数值来修正吗?

      我可以尝试自己解决这个问题,但是我没有V853的Display_Engine的描述,也找不到它。 我在哪里可以得到它?
      有来自较旧处理器的 Diplay_Engine 的描述:H3、H5、H8、A83.
      也许其中一些与V853一致 (RT-Mixer0 偏移地址) ?

      在我的设备程序中,我可以轻松设置像素的 Alpha 通道,以便 我有一个图像,但我想让它按照标准工作。

      发布在 V Series
      A
      Alb702
    • 回复: T113-S3 tina mipi-dsi 无输出

      @guyuandongfang
      我也遇到过类似的情况。 看题目 «V853 SDK:Linux内核中的MIPI DSI «

      发布在 其它全志芯片讨论区
      A
      Alb702