导航

    全志在线开发者论坛

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

    ddrddrLV 5

    @ddrddr

    1941
    积分
    7
    声望
    14
    资料浏览
    33
    帖子
    2
    粉丝
    0
    关注
    注册时间 最后登录

    ddrddr 取消关注 关注

    ddrddr 发布的最佳帖子

    • V853显示屏无法直接显示图片

      V853的芯片,接的是800*480的RGB屏幕。QT是可以正常显示的。从网上找了个通过fb的ioctrl去显示bmp图片的程序,执行后不论是什么图片都是显示黑屏。同样的应用程序在 V3S+同样的屏幕 是可以正常显示bmp图片的。也有用过fbv去显示图片,fbv xxxx.bmp 但也是显示全黑。
      有没有遇到同样问题的朋友帮忙解答一下呢?
      以下是显示bmp图片的应用程序:

      ···
      #include <unistd.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <fcntl.h>
      #include <string.h>
      #include <linux/fb.h>
      #include <sys/mman.h>
      #include <sys/ioctl.h>
      #include <arpa/inet.h>
      #include <errno.h>
      
      //14byte文件头
      typedef struct
      {
      	char cfType[2];  //文件类型,"BM"(0x4D42)
      	int  cfSize;     //文件大小(字节)
      	int  cfReserved; //保留,值为0
      	int  cfoffBits;  //数据区相对于文件头的偏移量(字节)
      }__attribute__((packed)) BITMAPFILEHEADER;
      //__attribute__((packed))的作用是告诉编译器取消结构在编译过程中的优化对齐
      
      //40byte信息头
      typedef struct
      {
      	char ciSize[4];          //BITMAPFILEHEADER所占的字节数
      	int  ciWidth;            //宽度
      	int  ciHeight;           //高度
      	char ciPlanes[2];        //目标设备的位平面数,值为1
      	int  ciBitCount;         //每个像素的位数
      	char ciCompress[4];      //压缩说明
      	char ciSizeImage[4];     //用字节表示的图像大小,该数据必须是4的倍数
      	char ciXPelsPerMeter[4]; //目标设备的水平像素数/米
      	char ciYPelsPerMeter[4]; //目标设备的垂直像素数/米
      	char ciClrUsed[4];       //位图使用调色板的颜色数
      	char ciClrImportant[4];  //指定重要的颜色数,当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
      }__attribute__((packed)) BITMAPINFOHEADER;
      
      typedef struct
      {
      	unsigned char blue;
      	unsigned char green;
      	unsigned char red;
      	unsigned char reserved;
      }__attribute__((packed)) PIXEL; //颜色模式RGB
      
      
      
      typedef struct
      {
      	int          fbfd;
      	char         *fbp;
      	unsigned int xres;
      	unsigned int yres;
      	unsigned int xres_virtual;
      	unsigned int yres_virtual;
      	unsigned int xoffset;
      	unsigned int yoffset;
      	unsigned int bpp;
      	unsigned long line_length;
      	unsigned long size;
      
      	struct fb_bitfield red;
      	struct fb_bitfield green;
      	struct fb_bitfield blue;
      } FB_INFO;
      
      typedef struct
      {
      	unsigned int width;
      	unsigned int height;
      	unsigned int bpp;
      	unsigned long size;
      	unsigned int data_offset;
      } IMG_INFO;
      
      
      
      FB_INFO fb_info;
      IMG_INFO img_info;
      
      int show_bmp(char *img_name);
      
      static int cursor_bitmap_format_convert(char *dst,char *src, unsigned long img_len_one_line)
      {
      	int img_len ,fb_len ;
      	char *p;
      	__u32 val;
      	PIXEL pix;
      
      	p = (char *)&val;
      
      	img_len = img_info.width; /*一行图片的长度*/
      	fb_len = fb_info.xres; /*一行显示屏的长度*/
      
      	/*进行x轴的偏移*/
      	dst += fb_info.xoffset * (fb_info.bpp / 8);
      	fb_len -= fb_info.xoffset;
      
      	/*bmp 数据是上下左右颠倒的,这里只进行左右的处理*/
      	/*先定位到图片的最后一个像素的地址,然后往第一个像素的方向处理,进行左右颠倒的处理*/
      	src += img_len_one_line - 1;
      
      	/*处理一行要显示的数据*/
      	while(1) {
      		if (img_info.bpp == 32)
      			pix.reserved = *(src--);
      		pix.red   = *(src--);
      		pix.green = *(src--);
      		pix.blue  = *(src--);
      
      		val = 0x00;
      		val |= (pix.red >> (8 - fb_info.red.length)) << fb_info.red.offset;
      		val |= (pix.green >> (8 - fb_info.green.length)) << fb_info.green.offset;
      		val |= (pix.blue >> (8 - fb_info.blue.length)) << fb_info.blue.offset;
      		val = 0x000000;
      
      
      		if (fb_info.bpp == 16) {
      			*(dst++) = *(p + 0);
      			*(dst++) = *(p + 1);
      		}
      		else if (fb_info.bpp == 24) {
      			*(dst++) = *(p + 0);
      			*(dst++) = *(p + 1);
      			*(dst++) = *(p + 2);
      		}
      		else if (fb_info.bpp == 32) {
      			*(dst++) = *(p + 0);
      			*(dst++) = *(p + 1);
      			*(dst++) = *(p + 2);
      			*(dst++) = *(p + 3);
      		}
      
      		/*超过图片长度或显示屏长度认为一行处理完了*/
      		img_len--;
      		fb_len--;
      		if (img_len <= 0 || fb_len <= 0)
      			break;
      	}
      #if 0
      	printf("r = %d\n", pix.red);
      	printf("g = %d\n", pix.green);
      	printf("b = %d\n", pix.blue);
      #endif
      	return 0;
      }
      
      int show_bmp(char *img_name)
      {
      
      	FILE *fp;
      	int ret = 0;
      	BITMAPFILEHEADER FileHead;
      	BITMAPINFOHEADER InfoHead;
      
      	if(img_name == NULL) {
      		printf("img_name is null\n");
      		return -1;
      	}
      
      	fp = fopen( img_name, "rb" );
      	if(fp == NULL) {
      		printf("img[%s] open failed\n", img_name);
      		ret = -1;
      		goto err_showbmp;
      	}
      
      	/* 移位到文件头部 */
      	fseek(fp, 0, SEEK_SET);
      
      	ret = fread(&FileHead, sizeof(BITMAPFILEHEADER), 1, fp);
      	if ( ret != 1) {
      		printf("img read failed\n");
      		ret = -1;
      		goto err_showbmp;
      	}
      
      	//检测是否是bmp图像
      	if (memcmp(FileHead.cfType, "BM", 2) != 0) {
      		printf("it's not a BMP file[%c%c]\n", FileHead.cfType[0], FileHead.cfType[1]);
      		ret = -1;
      		goto err_showbmp;
      	}
      
      	ret = fread( (char *)&InfoHead, sizeof(BITMAPINFOHEADER),1, fp );
      	if ( ret != 1) {
      		printf("read infoheader error!\n");
      		ret = -1;
      		goto err_showbmp;
      	}
      
      	img_info.width       = InfoHead.ciWidth;
      	img_info.height      = InfoHead.ciHeight;
      	img_info.bpp         = InfoHead.ciBitCount;
      	img_info.size        = FileHead.cfSize;
      	img_info.data_offset = FileHead.cfoffBits;
      
      	printf("img info w[%d] h[%d] bpp[%d] size[%ld] offset[%d]\n", img_info.width, img_info.height, img_info.bpp, img_info.size, img_info.data_offset);
      
      	if (img_info.bpp != 24 && img_info.bpp != 32) {
      		printf("img bpp is not 24 or 32\n");
      		ret = -1;
      		goto err_showbmp;
      	}
      
      
      	/*
      	 *一行行处理
      	 */
      	char *buf_img_one_line;
      	char *buf_fb_one_line;
      	char *p;
      	int fb_height;
      
      	long img_len_one_line = img_info.width * (img_info.bpp / 8);
      	long fb_len_one_line = fb_info.line_length;
      
      //	printf("img_len_one_line = %d\n", img_len_one_line);
      //	printf("fb_len_one_line = %d\n", fb_info.line_length);
      
      	buf_img_one_line = (char *)calloc(1, img_len_one_line + 256);
      	if(buf_img_one_line == NULL) {
      		printf("alloc failed\n");
      		ret = -1;
      		goto err_showbmp;
      	}
      
      	buf_fb_one_line = (char *)calloc(1, fb_len_one_line + 256);
      	if(buf_fb_one_line == NULL) {
      		printf("alloc failed\n");
      		ret = -1;
      		goto err_showbmp;
      	}
      
      
      	fseek(fp, img_info.data_offset, SEEK_SET);
      
      	p = fb_info.fbp + fb_info.yoffset * fb_info.line_length; /*进行y轴的偏移*/
      	fb_height = fb_info.yres;
      	while (1) {
      		memset(buf_img_one_line, 0, img_len_one_line);
      		memset(buf_fb_one_line, 0, fb_len_one_line);
      		ret = fread(buf_img_one_line, 1, img_len_one_line, fp);
      		if (ret < img_len_one_line) {
      			/*图片读取完成,则图片显示完成*/
      			printf("read to end of img file\n");
      			cursor_bitmap_format_convert(buf_fb_one_line, buf_img_one_line, img_len_one_line); /*数据转换*/
      			memcpy(fb_info.fbp, buf_fb_one_line, fb_len_one_line);
      			break;
      		}
      
      		cursor_bitmap_format_convert(buf_fb_one_line, buf_img_one_line, img_len_one_line); /*数据转换*/
      		memcpy(p, buf_fb_one_line, fb_len_one_line); /*显示一行*/
      		p += fb_len_one_line;
      
      		/*超过显示屏宽度认为图片显示完成*/
      		fb_height--;
      		if (fb_height <= 0)
      			break;
      	}
      
      	free(buf_img_one_line);
      	free(buf_fb_one_line);
      
      	fclose(fp);
      	return ret;
      err_showbmp:
      	if (fp)
      		fclose(fp);
      	return ret;
      }
      
      int show_picture(char *img_name)
      {
      	struct fb_var_screeninfo vinfo;
      	struct fb_fix_screeninfo finfo;
      
      	if (fb_info.fbfd <= -1) {
      		printf("fb open fialed\n");
      		return -1;
      	}
      
      	if (ioctl(fb_info.fbfd, FBIOGET_FSCREENINFO, &finfo)) {
      		printf("fb ioctl fialed\n");
      		return -1;
      	}
      
      	if (ioctl(fb_info.fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
      		printf("fb ioctl fialed\n");
      		return -1;
      	}
      
      	fb_info.xres = vinfo.xres;
      	fb_info.yres = vinfo.yres;
      	fb_info.xres_virtual = vinfo.xres_virtual;
      	fb_info.yres_virtual = vinfo.yres_virtual;
      	fb_info.xoffset = vinfo.xoffset;
      	fb_info.yoffset = vinfo.yoffset;
      	fb_info.bpp  = vinfo.bits_per_pixel;
      	fb_info.line_length = finfo.line_length;
      	fb_info.size = finfo.smem_len;
      
      	memcpy(&fb_info.red, &vinfo.red, sizeof(struct fb_bitfield));
      	memcpy(&fb_info.green, &vinfo.green, sizeof(struct fb_bitfield));
      	memcpy(&fb_info.blue, &vinfo.blue, sizeof(struct fb_bitfield));
      
      #if 1
      	printf("fb info x[%d] y[%d] x_v[%d] y_v[%d] xoffset[%d] yoffset[%d] bpp[%d] line_length[%ld] size[%ld]\n", fb_info.xres, fb_info.yres, fb_info.xres_virtual, fb_info.yres_virtual, fb_info.xoffset, fb_info.yoffset, fb_info.bpp, fb_info.line_length, fb_info.size);
      
      	printf("fb info red off[%d] len[%d] msb[%d]\n", fb_info.red.offset, fb_info.red.length, fb_info.red.msb_right);
      	printf("fb info green off[%d] len[%d] msb[%d]\n", fb_info.green.offset, fb_info.green.length, fb_info.green.msb_right);
      	printf("fb info blue off[%d] len[%d] msb[%d]\n", fb_info.blue.offset, fb_info.blue.length, fb_info.blue.msb_right);
      #endif
      
      	if (fb_info.bpp != 16 && fb_info.bpp != 24 && fb_info.bpp != 32) {
      		printf("fb bpp is not 16,24 or 32\n");
      		return -1;
      	}
      
      	if (fb_info.red.length > 8 || fb_info.green.length > 8 || fb_info.blue.length > 8) {
      		printf("fb red|green|blue length is invalid\n");
      		return -1;
      	}
      
      	// 内存映射
      	fb_info.fbp = (char *)mmap(0, fb_info.size, PROT_READ | PROT_WRITE, MAP_SHARED, fb_info.fbfd, 0);
      	if (fb_info.fbp == (char *)-1) {
      		printf("mmap fialed\n");
      		return -1;
      	}
      
      	show_bmp(img_name);
      
      	//删除映射
      	munmap(fb_info.fbp, fb_info.size);
      
      	return 0;
      }
      
      
      int main(int argc, char **argv)
      {
      	char img_name[64];
      
      	if (argc != 2) {
      		printf("arg error\n");
      		return 0;
      	}
      
      	snprintf(img_name, sizeof(img_name), "%s", argv[1]);
      	printf("img_name = %s\n", img_name);
      
      	fb_info.fbfd = open("/dev/fb0", O_RDWR);
      	if (!fb_info.fbfd) {
      		printf("Error: cannot open framebuffer device(/dev/fb0).\n");
      		return -1;
      	}
      	show_picture(img_name);
      
      	close(fb_info.fbfd);
      		return 0;
      }
      ···
      

      只能是通过QT显示图片后,将/dev/fb0里面的数据抓出来,要显示的时候再cat这个数据到fb0里显示。有哪位大神知道是什么原因导致的吗?

      发布在 V Series
      D
      ddrddr
    • 飞凌OKT507C在安卓系统启动时如何设置GPIO口为高电平

      使用PE20/21为新的GPIO口,设置GPIO148/149在init为高电平时不生效。
      例如在OKT507-C-Common.dtsi文件设置:GPIO148 = <&pio PE 20 1 2 0 1>;
      进入串口后使用cd /sys/class/gpio/gpio148后,用cat value读取电平值还是0,无法设置生效。

      发布在 飞凌嵌入式专区
      D
      ddrddr
    • 关于T113-i的核心板GPIO号查询和/sys/class/spidev目录下找不到设备

      关于T113-i的核心板,我有2个问题请教:

      1、各个引脚对应的GPIO号如何查询,第49脚(U1/<PE1/NCSI0_VSYNC/UART2_CTS/TWI1_SDA/LCD0_VSYNC/RGMII_RXD0/RMII_RXD0/PE_EINT1>/3V3)我想拉高。

      2、在/sys/class/spidev目录下找不到设备,是spi驱动没做吗,还是我需要进行什么操作才会显示设备?

      发布在 创龙科技专区
      D
      ddrddr
    • 回复: D1-H的datasheet

      坑网热心网友提供的D1-H资料:https://whycan.com/t_6440.html

      发布在 MR Series
      D
      ddrddr
    • D1开发板操作gpio端口的简单方法以及ADB的连接方法

      准备操作

      作为一名萌新,在如何操作gpio端口上,历经千辛万苦,查阅各种资料。

      首先是根据同样是发布在平头哥开发社区的博文,链接如下 https://bbs.aw-ol.com/topic/349/ 是文件操作gpio端口,代码易读懂,但是代码量太大了。对有些部分,像是打开文件,进行读写操作的一块进行,可以简化一些,但是要控制多个gpio端口,还要多次复用,实在是不好用。所以在写完小车动起来的程序后,就想着有没有更简单的方式。

      找到了官方提供的gpio开发指南,利用的是设备树和Pinctrl和gpio子系统操作gpio,花了两天时间终于弄了个大概明白,想上手开始做,发现没找到一个完整的案例,不知如何入手。

      于是搜搜查查,最后回归了简单的终端操作,将终端操作用命令和shell脚本来操作方便同时操作多个gpio端口。更简单了,但是没学过脚本语言,准备开始学习基本知识的时候,发现了一篇博文,什么都解决了。

      链接如下:点这个理

      C语言代码里操作gpio

      此文里面有一个板块为C语言代码里操作gpio,代码短短几行,用了system()函数来操作echo等,很类似终端操作,但又更方便了。 于是操作gpio变成了这样

      • 将大部分操作宏定义
      #define EXPORT_GPIO2 "echo 2020 > /sys/class/gpio/export"
      #define EXPORT_GPIO3 "echo 2021 > /sys/class/gpio/export"
      #define EXPORT_GPIO4 "echo 2022 > /sys/class/gpio/export"
      
      #define UEXPORT_GPIO1 "echo 2027 > /sys/class/gpio/unexport"
      #define UEXPORT_GPIO2 "echo 2020 > /sys/class/gpio/unexport"
      #define UEXPORT_GPIO3 "echo 2021 > /sys/class/gpio/unexport"
      #define UEXPORT_GPIO4 "echo 2022 > /sys/class/gpio/unexport"
      
      #define GPIO1_OUTPUT "echo out > /sys/class/gpio/gpio2027/direction"
      #define GPIO2_OUTPUT "echo out > /sys/class/gpio/gpio2020/direction"
      #define GPIO3_OUTPUT "echo out > /sys/class/gpio/gpio2021/direction"
      #define GPIO4_OUTPUT "echo out > /sys/class/gpio/gpio2022/direction"
      
      #define LOWGPIO1 "echo 0 > /sys/class/gpio/gpio2027/value"
      #define LOWGPIO2 "echo 0 > /sys/class/gpio/gpio2020/value"
      #define LOWGPIO3 "echo 0 > /sys/class/gpio/gpio2021/value"
      #define LOWGPIO4 "echo 0 > /sys/class/gpio/gpio2022/value"
      
      • 一些操作语句,简单明了
      void INIT()
      {
      
      	system(EXPORT_GPIO1);
      	system(EXPORT_GPIO2);
      	system(EXPORT_GPIO3);
      	system(EXPORT_GPIO4);
      	
      	system(EXPORT_HW1);
      	system(EXPORT_HW2);
      	system(EXPORT_HW3);
      	system(EXPORT_HW4);
      	
      	system(GPIO1_OUTPUT);
      	system(GPIO2_OUTPUT);
      	system(GPIO3_OUTPUT);
      	system(GPIO4_OUTPUT);
      	
      	system(HW1_INPUT);
      	system(HW2_INPUT);
      	system(HW3_INPUT);
      	system(HW4_INPUT);
      	
      }
      
      void RUN()
      {
      	system(LOWGPIO1);//0
      	system(HIGHGPIO2);//1
      	system(HIGHGPIO3);//1
      	system(LOWGPIO4);//0
      	
      }
      
      • 但是由于没有办法system(cat...),得到value的值只能用文件方式来读出,但也将代码简化了很多。
      int GETHW(int gpio)
      {
      	char in[3] = {0, 0, 0};
      	char buf[50];
      	int nread, gpiofd;
      	sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio);
      	gpiofd = open(buf, O_RDWR);
      	if(gpiofd < 0) {
      		fprintf(stderr, "Failed to open gpio %d value\n", gpio);
      		perror("gpio failed");
      	}
       
      	do {
      		nread = read(gpiofd, in, 1);
      	} while (nread == 0);
      	if(nread == -1){
      		perror("GPIO Read failed");
      		return -1;
      	}
      	close(gpiofd);
      	return atoi(in);
      }
      

      D1开发板的gpio引脚

      我们项目的小车选用的是gpio2020~gpio2027这八个gpio引脚,其中四个引脚用来控制车轮的运动,四个引脚用来接收红外传感器传送过来的信号。这八个引脚分别对应的是pp0~pp7,

      根据这两张图片结合,我们就知道了gpio2020~gpio2027这四个分别在什么位置。

      8d5cfb247925666b938f378e36b84a96.png

      9e792bea735baa3ff8f74798da08b860.png

      查看gpio引脚值,对gpio引脚操作分为简单的几步:

      • 导出gpio值,命令:echo 2020 > export
      • 设置方向,输入为:echo in > direction输出为:echo out > direction
      • 查看value值:cat value ( 注意工作目录 )
      • 设置value值,如果gpio口被定义为输出时,可以设置gpio值为1或者0,1为高电平,0为低电平 echo 1 > value
      • 不用就 echo 2020 > unexport

      49043e4a5934023040e1a9cc1380dec1.png

      580453d43514605e6170d1f1b1a88048.png

      ADB使用和编译程序

      设备连接

      我们在将已经编译好的程序代码传送到哪吒开发板上时,使用的ADB工具。设备连接正常后,桌面上有显示图标:

      b76d2b76d72a50a88e695e7c727fd309.png

      那个对勾表示已经连接上ADB,如果有Allwinner Technology Inc. Tina ADB但是前面没有对勾,就点一下,要是没有这个选项,就重插一下开发板。

      交叉编译

      • ADB安装好以后,先在Ubuntu下新建一个.c文件,然后编译:
        编译是交叉编译,交叉编译就是编译和运行是分开的,即编译在电脑的Ubuntu上,运行在哪吒开发板上进行。

      根据全志社区中的提示:编译工具链在tina/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702中

      编译命令是:/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gcc -o car1 car1.c

      • 其中编译命令可以根据编译工具链存放的位置进行调整,我们编译工具链存放的位置是:
        tina-D1-H/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702

      所以编译命令略微调整为:

      tina-D1-H/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gcc -o car car.c

      我们一开始遇到的问题提示为找不到目录。后来发现是因为一开始目录不对。

      • 编译好.c文件后,执行adb push car ./.就将编译好的程序下载到开发板上

      进入开发板:用adb shell命令

      进入开发板以后,在/root目录下找到car程序,赋予文件可执行权限chmod +x car,然后运行 ./car,见下图:

      0e78e81db57965158fa09f4668ebcf0b.png

      9b77c38cf4cc958614489f02ec919391.png

      最后希望哪吒开发板也能拥有专门的操作gpio的函数和接口,方便大家使用。

      本文内容为【玄铁杯第二届RISC-V应用创新大赛】作业
      作者:智航追迹队

      原文链接:https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.429d180fqgpDV3&id=4094212597694402560

      发布在 MR Series
      D
      ddrddr
    • 百问网D1开发板HDMI、IR、WIFI 适配

      HDMI、IR、WIFI 适配

      • DTS 文件
        • ./device/config/chips/d1-h/configs/nezha/uboot-board.dts
        • ./device/config/chips/d1-h/configs/nezha/linux-5.4/board.dts
      • 分区文件
        • ./target/allwinner/d1-h-nezha/swupdate/sys_partition_ab.fex

      默认 HDMI 输出

      这里我希望开机就是默认输出到 HDMI,需要对 ./device/config/chips/d1-h/configs/nezha/uboot-board.dts 进行修改

      对 uboot-board.dts 中的 disp 节的代码进行修改,patch 文件如下,把默认的输出设备改为 HDMI 输出

      diff --git a/configs/nezha/uboot-board.dts b/configs/nezha/uboot-board.dts
      index 81a521e..ca1b898 100644
      --- a/configs/nezha/uboot-board.dts
      +++ b/configs/nezha/uboot-board.dts
      @@ -214,31 +214,29 @@
       	disp_init_enable         = <1>;
       	disp_mode                = <0>;
       
      -	screen0_output_type      = <1>;
      -	screen0_output_mode      = <4>;
      -
      -	screen1_output_type      = <3>;
      -	screen1_output_mode      = <10>;
      -
      -	screen1_output_format    = <0>;
      -	screen1_output_bits      = <0>;
      -	screen1_output_eotf      = <4>;
      -	screen1_output_cs        = <257>;
      -	screen1_output_dvi_hdmi  = <2>;
      -	screen1_output_range     = <2>;
      -	screen1_output_scan      = <0>;
      -	screen1_output_aspect_ratio = <8>;
      -
      -	dev0_output_type         = <1>;
      -	dev0_output_mode         = <4>;
      -	dev0_screen_id           = <0>;
      -	dev0_do_hpd              = <0>;
      -
      -	dev1_output_type         = <4>;
      -	dev1_output_mode         = <10>;
      -	dev1_screen_id           = <1>;
      -	dev1_do_hpd              = <1>;
      +	screen0_output_type      = <3>;
      +	screen0_output_mode      = <10>;
       
      +	screen1_output_type      = <1>;
      +    screen1_output_mode      = <4>;
      +
      +    screen0_output_format = <0>;
      +    screen0_output_bits = <0>;
      +    screen0_output_eotf = <4>;
      +    screen0_output_cs = <257>;
      +    screen0_output_dvi_hdmi = <2>;
      +    screen0_output_range = <2>;
      +    screen0_output_scan = <0>;
      +    screen0_output_aspect_ratio = <8>;
      +
      +
      +    dev0_output_type         = <4>;
      +
      +
      +
      +
      +	dev0_output_mode         = <10>;	dev0_screen_id           = <0>;
      +	dev0_do_hpd              = <1>;
       	def_output_dev           = <0>;
       	hdmi_mode_check          = <1>;
      

      Wi-Fi、IR 适配

      查看核心板的原理图可以看到 XR829 蓝牙+WiFi 模块的 WL_REG_ON 管脚需要修改,在 SDK 原本的设备树中 WL_REG_ON 管脚是 PG12,但是开发板的管脚是 PB12

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      红外接收头的输入管脚接到的是 PG16,和 SDK 原本的 PB12 不同,也需要修改

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      board.dts 的 patch 文件如下

      diff --git a/configs/nezha/linux-5.4/board.dts b/configs/nezha/linux-5.4/board.dts
      old mode 100755
      new mode 100644
      index 963aa17..15eed8c
      --- a/configs/nezha/linux-5.4/board.dts
      +++ b/configs/nezha/linux-5.4/board.dts
      @@ -464,14 +464,14 @@
       */
       
       	s_cir0_pins_a: s_cir@0 {
      -		pins = "PB12";
      +		pins = "PG16";
       		function = "ir";
       		drive-strength = <10>;
       		bias-pull-up;
       	};
       
       	s_cir0_pins_b: s_cir@1 {
      -		pins = "PB12";
      +		pins = "PG16";
       		function = "gpio_in";
       	};
       
      @@ -566,7 +566,7 @@
       			clock-names = "32k-fanout1";
       			clocks = <&ccu CLK_FANOUT1_OUT>;
       			wlan_busnum    = <0x1>;
      -			wlan_regon    = <&pio PG 12 GPIO_ACTIVE_HIGH>;
      +			wlan_regon    = <&pio PB 12 GPIO_ACTIVE_HIGH>;
       			wlan_hostwake  = <&pio PG 10 GPIO_ACTIVE_HIGH>;
       			/*wlan_power    = "VCC-3V3";*/
       			/*wlan_power_vol = <3300000>;*/
      @@ -1391,7 +1391,7 @@ pull up or pull down(default 0), driver level(default 1), data>
       	pinctrl-names = "default", "sleep";
       	pinctrl-0 = <&s_cir0_pins_a>;
       	pinctrl-1 = <&s_cir0_pins_b>;
      -	status = "disabled";
      +	status = "okay";
       };
       
       &ir1 {
      

      修改完了设备树后还需要修改一下 menuconfig 的配置,执行下面命令打开 kernel 的 menuconfig 的窗口

      make kernel_menuconfig
      

      然后使用 / 键进入搜索,搜索 IR_RX_SUNXI,可以看到我这里已经使能了,SDK 默认可能是没有使能的,需要修改下,前面标有(1),按下数字 1 键就可以跳转到这个位置

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      这时红外功能就可以用了,后续会注册到 /dev/input/event* 中

      核心板的 Wi-Fi 模块有可能会是 24MHz 的晶振,而 SDK 默认的是 40MHz 的,需要修改下,运行命令打开 menuconfig

      make menuconfig
      

      使用 / 进入搜索模式,搜索 XR829,把 kmod-net-xr829-40M 改成 kmod-net-xr829

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      失能掉 xr829 with 40M sdd

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      确保 xr829-firmware 是使能的

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      然后退出保存即可。

      烧录测试

      在 SDK 根目录以此运行如下命令完成编译和打包

      source build/envsetup.sh
      lunch
      make -j99
      pack
      

      将 Ubuntu 虚拟机编译出的镜像传输到 Windows 实体机中

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      烧录到开发板中

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      启动开发板,./device/config/chips/d1-h/configs/nezha/configs/bootlogo.bmp

      通过 HDMI 采集器可以看到在开发板启动的时候默认进入了 HDMI 的显示了

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      ifconfig 命令查看网卡,可以看到 wlan0 了,使用 wifi_connect_ap_test 命令连接到 Wi-Fi

      wifi_connect_ap_test [ssid] [passwd]
      

      命令尝试连接到一个 Wi-Fi,连接完后尝试 ping 百度来看看

      ping baidu.com -Iwlan0
      

      可以看到通过 Wi-Fi 可以正常访问到互联网了

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      再看看红外 O不OK

      cat /proc/bus/input/devices
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      可以看到红外的输入对应的是 event1,然后使用 hexdump 查看下输出

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      发布在 MR Series
      D
      ddrddr
    • 回复: mq-dual接lan8720的模块phy报错

      问题解决,全志的sunxi-gmac.c里暴力写了个phydev->is_gigabit_capable = 1 然后phy驱动就去访问不存在的千兆寄存器,把lan8720搞死了

      QQ图片20230605105211.jpg

      发布在 MR Series
      D
      ddrddr

    ddrddr 发布的最新帖子

    • 回复: 付費開發 - 需要幫助!(R128-S2/3)

      @gharibi nihao

      发布在 A Series
      D
      ddrddr
    • 百问网D1开发板HDMI、IR、WIFI 适配

      HDMI、IR、WIFI 适配

      • DTS 文件
        • ./device/config/chips/d1-h/configs/nezha/uboot-board.dts
        • ./device/config/chips/d1-h/configs/nezha/linux-5.4/board.dts
      • 分区文件
        • ./target/allwinner/d1-h-nezha/swupdate/sys_partition_ab.fex

      默认 HDMI 输出

      这里我希望开机就是默认输出到 HDMI,需要对 ./device/config/chips/d1-h/configs/nezha/uboot-board.dts 进行修改

      对 uboot-board.dts 中的 disp 节的代码进行修改,patch 文件如下,把默认的输出设备改为 HDMI 输出

      diff --git a/configs/nezha/uboot-board.dts b/configs/nezha/uboot-board.dts
      index 81a521e..ca1b898 100644
      --- a/configs/nezha/uboot-board.dts
      +++ b/configs/nezha/uboot-board.dts
      @@ -214,31 +214,29 @@
       	disp_init_enable         = <1>;
       	disp_mode                = <0>;
       
      -	screen0_output_type      = <1>;
      -	screen0_output_mode      = <4>;
      -
      -	screen1_output_type      = <3>;
      -	screen1_output_mode      = <10>;
      -
      -	screen1_output_format    = <0>;
      -	screen1_output_bits      = <0>;
      -	screen1_output_eotf      = <4>;
      -	screen1_output_cs        = <257>;
      -	screen1_output_dvi_hdmi  = <2>;
      -	screen1_output_range     = <2>;
      -	screen1_output_scan      = <0>;
      -	screen1_output_aspect_ratio = <8>;
      -
      -	dev0_output_type         = <1>;
      -	dev0_output_mode         = <4>;
      -	dev0_screen_id           = <0>;
      -	dev0_do_hpd              = <0>;
      -
      -	dev1_output_type         = <4>;
      -	dev1_output_mode         = <10>;
      -	dev1_screen_id           = <1>;
      -	dev1_do_hpd              = <1>;
      +	screen0_output_type      = <3>;
      +	screen0_output_mode      = <10>;
       
      +	screen1_output_type      = <1>;
      +    screen1_output_mode      = <4>;
      +
      +    screen0_output_format = <0>;
      +    screen0_output_bits = <0>;
      +    screen0_output_eotf = <4>;
      +    screen0_output_cs = <257>;
      +    screen0_output_dvi_hdmi = <2>;
      +    screen0_output_range = <2>;
      +    screen0_output_scan = <0>;
      +    screen0_output_aspect_ratio = <8>;
      +
      +
      +    dev0_output_type         = <4>;
      +
      +
      +
      +
      +	dev0_output_mode         = <10>;	dev0_screen_id           = <0>;
      +	dev0_do_hpd              = <1>;
       	def_output_dev           = <0>;
       	hdmi_mode_check          = <1>;
      

      Wi-Fi、IR 适配

      查看核心板的原理图可以看到 XR829 蓝牙+WiFi 模块的 WL_REG_ON 管脚需要修改,在 SDK 原本的设备树中 WL_REG_ON 管脚是 PG12,但是开发板的管脚是 PB12

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      红外接收头的输入管脚接到的是 PG16,和 SDK 原本的 PB12 不同,也需要修改

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      board.dts 的 patch 文件如下

      diff --git a/configs/nezha/linux-5.4/board.dts b/configs/nezha/linux-5.4/board.dts
      old mode 100755
      new mode 100644
      index 963aa17..15eed8c
      --- a/configs/nezha/linux-5.4/board.dts
      +++ b/configs/nezha/linux-5.4/board.dts
      @@ -464,14 +464,14 @@
       */
       
       	s_cir0_pins_a: s_cir@0 {
      -		pins = "PB12";
      +		pins = "PG16";
       		function = "ir";
       		drive-strength = <10>;
       		bias-pull-up;
       	};
       
       	s_cir0_pins_b: s_cir@1 {
      -		pins = "PB12";
      +		pins = "PG16";
       		function = "gpio_in";
       	};
       
      @@ -566,7 +566,7 @@
       			clock-names = "32k-fanout1";
       			clocks = <&ccu CLK_FANOUT1_OUT>;
       			wlan_busnum    = <0x1>;
      -			wlan_regon    = <&pio PG 12 GPIO_ACTIVE_HIGH>;
      +			wlan_regon    = <&pio PB 12 GPIO_ACTIVE_HIGH>;
       			wlan_hostwake  = <&pio PG 10 GPIO_ACTIVE_HIGH>;
       			/*wlan_power    = "VCC-3V3";*/
       			/*wlan_power_vol = <3300000>;*/
      @@ -1391,7 +1391,7 @@ pull up or pull down(default 0), driver level(default 1), data>
       	pinctrl-names = "default", "sleep";
       	pinctrl-0 = <&s_cir0_pins_a>;
       	pinctrl-1 = <&s_cir0_pins_b>;
      -	status = "disabled";
      +	status = "okay";
       };
       
       &ir1 {
      

      修改完了设备树后还需要修改一下 menuconfig 的配置,执行下面命令打开 kernel 的 menuconfig 的窗口

      make kernel_menuconfig
      

      然后使用 / 键进入搜索,搜索 IR_RX_SUNXI,可以看到我这里已经使能了,SDK 默认可能是没有使能的,需要修改下,前面标有(1),按下数字 1 键就可以跳转到这个位置

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      这时红外功能就可以用了,后续会注册到 /dev/input/event* 中

      核心板的 Wi-Fi 模块有可能会是 24MHz 的晶振,而 SDK 默认的是 40MHz 的,需要修改下,运行命令打开 menuconfig

      make menuconfig
      

      使用 / 进入搜索模式,搜索 XR829,把 kmod-net-xr829-40M 改成 kmod-net-xr829

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      失能掉 xr829 with 40M sdd

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      确保 xr829-firmware 是使能的

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      然后退出保存即可。

      烧录测试

      在 SDK 根目录以此运行如下命令完成编译和打包

      source build/envsetup.sh
      lunch
      make -j99
      pack
      

      将 Ubuntu 虚拟机编译出的镜像传输到 Windows 实体机中

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      烧录到开发板中

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      启动开发板,./device/config/chips/d1-h/configs/nezha/configs/bootlogo.bmp

      通过 HDMI 采集器可以看到在开发板启动的时候默认进入了 HDMI 的显示了

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      ifconfig 命令查看网卡,可以看到 wlan0 了,使用 wifi_connect_ap_test 命令连接到 Wi-Fi

      wifi_connect_ap_test [ssid] [passwd]
      

      命令尝试连接到一个 Wi-Fi,连接完后尝试 ping 百度来看看

      ping baidu.com -Iwlan0
      

      可以看到通过 Wi-Fi 可以正常访问到互联网了

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      再看看红外 O不OK

      cat /proc/bus/input/devices
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      可以看到红外的输入对应的是 event1,然后使用 hexdump 查看下输出

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      发布在 MR Series
      D
      ddrddr
    • 提高香橙派GPIO最高速率

      使用香橙派zero3,最高只能达到5MHz的信号,请问如何提高gpio速率?

      这个速率是参照网上树莓派的实现方法,直接对gpio写操作的寄存器循环进行写1和0。但只能产生最高5MHz的方波,即仅10MHz的写。函数是参照writeR实现的,在它单次写寄存器的基础上加了小循环写。用示波器可见5MHz方波。

      但实际需要30MHz的频率,请问zero3如何支持?需要修改APB频率吗?还是说h618芯片不支持这么高的频率呢

      发布在 H/F/TV Series
      D
      ddrddr
    • 回复: D1-H的datasheet

      坑网热心网友提供的D1-H资料:https://whycan.com/t_6440.html

      发布在 MR Series
      D
      ddrddr
    • 飞凌OKT507C在安卓系统启动时如何设置GPIO口为高电平

      使用PE20/21为新的GPIO口,设置GPIO148/149在init为高电平时不生效。
      例如在OKT507-C-Common.dtsi文件设置:GPIO148 = <&pio PE 20 1 2 0 1>;
      进入串口后使用cd /sys/class/gpio/gpio148后,用cat value读取电平值还是0,无法设置生效。

      发布在 飞凌嵌入式专区
      D
      ddrddr
    • 关于T113-i的核心板GPIO号查询和/sys/class/spidev目录下找不到设备

      关于T113-i的核心板,我有2个问题请教:

      1、各个引脚对应的GPIO号如何查询,第49脚(U1/<PE1/NCSI0_VSYNC/UART2_CTS/TWI1_SDA/LCD0_VSYNC/RGMII_RXD0/RMII_RXD0/PE_EINT1>/3V3)我想拉高。

      2、在/sys/class/spidev目录下找不到设备,是spi驱动没做吗,还是我需要进行什么操作才会显示设备?

      发布在 创龙科技专区
      D
      ddrddr
    • 想给R128移植上LVGL按照教程结果失败

      使用官方制作的虚拟机对照教程为啥编译LVGL这个都出错,怎么解

      微信图片_20231016104457.png

      Q微信图片_20231016104501.png

      微信图片_20231016104503.png

      发布在 A Series
      D
      ddrddr
    • R128的屏幕颜色显示异常时怎么回事?

      全志在线R128文档里的SPI LCD屏幕的内容(https://r128.docs.aw-ol.com/demo/spilcd/)

      按照demo,SPILCD这个demo应该是输出紫色,而文档却说输出了黄色,这是怎么回事?

      BC870202-BB49-4172-9321-8407501DDA35.png

      看到图片好像真的是黄色

      发布在 A Series
      D
      ddrddr
    • T113Pro开发板,改成TF卡启动后,系统分区异常

      现象:
      如题,一开始我用的是NAND启动,但是由于要添加lib库(NAND-Flash的空间不够),所以改成了TF卡。
      但是我根据说明,更改“sys_partition.fex”文件后,没有任何作用,并且通过“df -h”命令查看存储空间时,发现系统分区只剩下“/dev/root 和 tmpfs”了。

      b77ea38ee2619eb6b7c493b1001057f521766f13.png

      46d296335b2cdc1755e614fc8bad61bf17118a4c.png

      74771e9f5c3b507a1b125e0f580723898d057998_2_634x500.png

      疑问:
      1、为什么我更改“sys_partition.fex”文件后,没有任何作用;
      2、我该怎么对存储空间进行具体分区,并且保证“/usr/lib”目录有足够空间存放库文件;
      3、我把开发板上的NAND换成256MB的,需要进行哪些配置步骤。

      发布在 其它全志芯片讨论区
      D
      ddrddr
    • 韦东山官网提供的 T113SDK , tina-d1-h测试WIFI 和4G的方法好像与原来buildroot_100ask_t113-pro 的测试方法不一样吧

      我在测试 韦东山官网提供的 T113SDK , tina-d1-h, 这个SDK,测试WIFI 和4G的方法好像与原来buildroot_100ask_t113-pro 的测试方法不一样吧?有怎么连接WIFI, 4G的说明吗?

      QQ图片20230922102512.jpg

      发布在 MR Series
      D
      ddrddr