坑网热心网友提供的D1-H资料:https://whycan.com/t_6440.html
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,无法设置生效。 -
关于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驱动没做吗,还是我需要进行什么操作才会显示设备?
-
V853显示屏无法直接显示图片发布在 V Series
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里显示。有哪位大神知道是什么原因导致的吗?
-
D1开发板操作gpio端口的简单方法以及ADB的连接方法发布在 MR Series
准备操作
作为一名萌新,在如何操作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这四个分别在什么位置。


查看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


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

那个对勾表示已经连接上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,见下图:


最后希望哪吒开发板也能拥有专门的操作gpio的函数和接口,方便大家使用。
本文内容为【玄铁杯第二届RISC-V应用创新大赛】作业
作者:智航追迹队
原文链接:https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.429d180fqgpDV3&id=4094212597694402560 -
百问网D1开发板HDMI、IR、WIFI 适配发布在 MR Series
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 查看下输出
[

- DTS 文件
-
回复: mq-dual接lan8720的模块phy报错发布在 MR Series
问题解决,全志的sunxi-gmac.c里暴力写了个phydev->is_gigabit_capable = 1 然后phy驱动就去访问不存在的千兆寄存器,把lan8720搞死了

ddrddr 发布的最新帖子
-
百问网D1开发板HDMI、IR、WIFI 适配发布在 MR Series
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 查看下输出
[

- DTS 文件
-
提高香橙派GPIO最高速率发布在 H/F/TV Series
使用香橙派zero3,最高只能达到5MHz的信号,请问如何提高gpio速率?
这个速率是参照网上树莓派的实现方法,直接对gpio写操作的寄存器循环进行写1和0。但只能产生最高5MHz的方波,即仅10MHz的写。函数是参照writeR实现的,在它单次写寄存器的基础上加了小循环写。用示波器可见5MHz方波。
但实际需要30MHz的频率,请问zero3如何支持?需要修改APB频率吗?还是说h618芯片不支持这么高的频率呢
-
飞凌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,无法设置生效。 -
关于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驱动没做吗,还是我需要进行什么操作才会显示设备?
-
R128的屏幕颜色显示异常时怎么回事?发布在 A Series
全志在线R128文档里的SPI LCD屏幕的内容(https://r128.docs.aw-ol.com/demo/spilcd/)
按照demo,SPILCD这个demo应该是输出紫色,而文档却说输出了黄色,这是怎么回事?

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


疑问:
1、为什么我更改“sys_partition.fex”文件后,没有任何作用;
2、我该怎么对存储空间进行具体分区,并且保证“/usr/lib”目录有足够空间存放库文件;
3、我把开发板上的NAND换成256MB的,需要进行哪些配置步骤。 -
韦东山官网提供的 T113SDK , tina-d1-h测试WIFI 和4G的方法好像与原来buildroot_100ask_t113-pro 的测试方法不一样吧发布在 MR Series
我在测试 韦东山官网提供的 T113SDK , tina-d1-h, 这个SDK,测试WIFI 和4G的方法好像与原来buildroot_100ask_t113-pro 的测试方法不一样吧?有怎么连接WIFI, 4G的说明吗?



