Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页
    1. Home
    2. IAMLIUBO
    • Profile
    • Following 1
    • Followers 4
    • my integral 1793
    • Topics 6
    • Posts 46
    • Best 5
    • Groups 0

    IAMLIUBOLV 5

    @IAMLIUBO

    大家好,我是刘波(AKA IAMLIUBO),一个软硬兼施的Maker👨‍💻👨‍🏭,梦想拥有一个自己的工作室🥳,可以关注我的个人主页(https://blogs.oopswow.com/)了解更多.

    1793
    integral
    6
    Reputation
    52
    Profile views
    46
    Posts
    4
    Followers
    1
    Following
    Joined Last Online
    Website blogs.oopswow.com/ Location Shenzhen,China

    IAMLIUBO Unfollow Follow

    Best posts made by IAMLIUBO

    • 哪吒D1-年轻人的第一块RISC-V开发板开箱

      原文链接:哪吒D1-年轻人的第一块RISC-V开发板

      前言不搭后语

      上周一收到了我的哪吒D1开发板,这是一款RISC-V架构的开发板,也是基于全志科技首款RISC-V指令集的芯片,集成了阿里平头哥64位C906核心,支持RVV,1GHz主频,可支持Linux、RTOS等系统。没想到全志在线社区的Kirin要亲自送过来,还顺便约了个椰子鸡😜。上周没来得及仔细把玩一下,刚好周末来个开箱记录下。

      Out of the box!

      包装非常简约,就用了很常见的这种纸盒,上面印着全志在线四个大字和logo。

      打开包装盒分为左右两个分区,左侧是开发板,还装在了一个非常精致的小盒子里,右侧是一些开发板配套的线材和充电头。

      将全部内容取出来,可以看到配件还是蛮丰富的,有两根A2C的USB线,一根串口线,一个充电头,还有一些小螺丝,充分保证了上手就可以用。

      接下来我们将重点放在装有开发板的这个精致小盒子上,正面也是比较简洁,印有哪吒的字样,还有AWOL全志在线社区的logo,值得注意点是还有一句slogan:
      <center>不负所爱 自创奇迹</center>


      再来看一下包装盒的底部,清晰度印着开发板的布局图,总体来看跟树莓派B系列的开发板是接近的,这样可以兼容一下树莓派的外设等等。

      包装盒的侧边印着管脚图,这样使用起来就很方便了,不用每次都去看文档查找了,从管脚图可以看出大部分是跟树莓派兼容的,可能少部分管脚的功能不一样,但是电源管脚的排列是一致的,也可能是管脚不够用了,有三个管脚是NC(No Connection)空着的。

      打开包装盒就可以看到开发板本体了,黑色哑光PCB板,略显高端,开发板用黑丝海绵包裹着。

      将开发板取出来,先看一下正面,做工还是非常不错的,看丝印是21年第17周投板,看来还是热乎的!

      然后看一下背面,背面大的元器件不是很多,只有一个SD卡座、Flash和一颗海力士的DDR3,根据丝印来看单颗256M,正面还有一颗,所以一共是512M,也就是拿到的是内测版本。

      那么来看一下主要参数:

      主控:全志D1 C906 RISC-V 1GHz
      DRAM:DDR3 512M/1GB/2GB (内测版/公开版/定制版)
      存储:板载256MB spi-nand,支持USB外接U盘及SD卡拓展存储
      网络:支持千兆以太网(RTL8211F),支持2.4G WiFi及蓝牙(XR829无线模组),板载天线
      显示:支持MIPI-DSI+TP屏幕接口,支持HDMI输出,支持SPI屏幕
      音频:麦克风子板接口 * 1,3.5mm耳机接口 * 1(CTIA)
      按键:fel按键 * 1,LRADC OK按键 * 1
      灯:电源指示灯 * 1,三色LED * 1
      DEBUG:支持uart串口调试,支持ADB USB调试
      USB:USB HOST * 1, USB OTG * 1,支持USB2.0
      PIN:40pins插针阵列,使用PCF8574 GPIO拓展芯片外拓GPIO
      电源输入:Type-C USB 5V-2A
      PMIC:分立器件
      板身大小:长85mm宽56mm厚1.7mm
      PCB板层:6层板

      Power on!

      看完了板子长啥样,当然要上电运行一下了!出厂Flash中带有固件,所以是可以直接上电运行的,但是出厂固件应该是默认从MIPI显示屏输出的,也可以切换到HDMI输出,但是我这也没有显示器,所以我们这里就先从串口看一下就好了。
      从配件包里,取出串口线,按照白色接TX,绿色接RX,黑色接GND的线序,将串口线接到右上角的DEBUG接口,然后再取出电源和USB线给开发板供电,接HDMI旁边的TYPE-C,然后打开串口应该就能看到启动日志了,启动完成后不会出现登录提示,我们只需按一下回车即可,然后就会看到下面的开机提示了。

      内置的固件是基于全志官方维护的Tina Linux,现在D1的SDK已经全部释放了,所以个人玩家再也不用担心拿不到官方的SDK了!!!

      今天先简单体验下,改天刷个Debian固件再尝试下!😁

      后语非要讲几句

      不知道大家第一次接入嵌入式Linux是用的什么开发板和哪家的片子,但是我第一块开发板是友善之臂的NanoPi NEO Air,使用的是全志的H3 CPU,板子非常小巧也很精致,但是个人是拿不到官方的SDK包的,包括友善之臂也没有开放出来,不过全志的板子却在开源创客圈非常火,比如armbian支持的很多SBC都是使用的全志的CPU,当然可能性价比也占一部分原因,但是以后可能会有很大改观,现在在全志在线官网已经可以不用NDA就可以直接下载到两款芯片的SDK了,而且现在全志还官方搭建了开发者论坛,让使用和开发全志CPU的开发者有了可以同官方交流的平台。

      不负所爱 自创奇迹 不会辜负开发者的厚爱,大家同社区创造了奇迹,全志在线也会竭尽全力帮助每一位开发者!(Kirin讲的,大概好像是这样了,难道说我给忘了?😅)

      真结束

      再来几张图片欣赏下,图片都是用手机拍的,成像有点渣🤣,大家见谅!


      那么问题来了,相关文档要去哪里获取呢?这个大家不要担心,因为包装盒上已经印刷了!

      全志在线开发者社区和D1的文档都可以扫码直达,为了大家更方便,我也贴一下链接:
      全志开发者社区
      D1开发板相关文档

      posted in D1系列-RISC-V
      IAMLIUBO
      IAMLIUBO
    • 开源!教你自制最精致的Pi!

      是什么
      M5Pi是我最近自制并开源的嵌入式Linux开发板,基于全志科技的F1C200s芯片,板载MPU6050姿态传感器,拥有一个320x240分辨率,2寸大小的全贴合电容触摸显示屏,一个1W的小喇叭可以用来播放声音,Wi-Fi用的是ESP8089,最重要的是有一个精美的外壳,这也是为什么我称它为最精致的“Pi”的原因,项目完全开源,PCB使用的开源软件KiCAD绘制,部分3D模型使用的开源软件FreeCAD绘制,系统使用的比较流行的buildroot制作,还用LVGL写了个简单的Launcher(还没完全写完)。

      01.jpg

      为什么做
      其实接触嵌入式Linux已经蛮久了,从最开始的树莓派,到后来NanoPi、香橙派、荔枝派等等,基本上也是都有玩过,还在B站录制过几集纯萌新入门视频,不过平常工作也不是主要做Linux相关的,所以理解的和讲的都很浅薄,真正让自己想要从零开始做一个属于自己的“Pi”,还是去年看到稚晖做的小电脑,当时觉得非常不错,自己也想去做一个,不过后面实际尝试了下,难度系数还是颇高的,所以当时用ESP32-S2做了个单片机版的小电视玩了玩,不过这个想法从未消失。

      02.jpg

      做了哪些尝试
      第二次想做,应该是在去年的十一月份左右,因为当时M5Core2玩了蛮久了,觉得这个尺寸,这个外壳,还有触摸的屏幕简直是太棒了,刚好我近水楼台先得月,手头也有外壳也有显示屏,所以当时又想去尝试一下,还特地选择了全志的H5,然后各种逛论坛,找资料,下载资料,真正开始要画PCB的时候,就觉得还是差点儿事了,因为H5没有内置DDR,我还想加一个eMMC,这部分属于高速PCB范畴了,挺难整的,只是简单打了一版布局的PCB,看了看主要元器件就放弃了,因为受制于外壳的尺寸,正面空间还是蛮小的,放背面我还不确定跟屏幕会不会有干涉,以及发热会不会影响屏幕等,就又咕掉了。

      背面还有两颗DDR,还没layout就觉得难整了

      04.jpg

      不过也没有完全咕掉,我还是成功曲线救国,做了一版试了试,不过是用的友善之臂的NanoPi NEO Air核心板,然后画了个扩展版,成功试制了一版,虽然曲线救国,尺寸也不太合适等等众多小问题,但是效果还是非常棒的!跑的是Armbian,驱动屏幕的时候也是翻车了很久,怎么搞都没法点亮,最后发现问题是FPC座子虚焊了… 当时差点儿想拍死自己。

      04.jpg

      正面看还是蛮不错的,但是看看背面就有点惨不忍睹了…

      05.jpeg

      怎么做的
      用NanoPi搞完后,就懒惰了(其实是菜),想用性能高点的CPU,PCB搞不定,PCB能搞定的,性能又不高,陷入了很长时间的CPU选型阶段,总体思想就是选内置DDR的,性能还要高点的,其实刚开始M5Pi没有准备用F1C200s,当时是看上了SSD202,因为刚好我司在做一个项目(Unit V2),刚好也了解一点,但是这个片子的资料需要签NDA,那我后期开源肯定会受到影响,所以还不如选择一款大家用的多,虽然官方也没公开release过任何资料的片子,最后的焦点就放在了F1C和V3s上,虽然V3s性能要比F1C高,但是价格还是要贵一丢丢,而且第一次做,还是找个便宜点的吧,于是就这样定了下来,四月底就正式开始搞了,内置DDR的片子画起来,要简单很多,基本上只要电源没问题,晶振没问题,就可以正常跑起来了…(省略几千字,开发记录可以在坑网看到,链接在文章最后)

      06.png

      07.png

      PCB第一版就可以正常运行,只不过触摸跟LED都画反了,别的没什么大碍,然后软件开发也就挺顺利的,因为aodzip大佬已经做了很多适配了,所以就简单改改设备树之类的,就平平无奇的运行起来了,不如上一次因为焊接问题,结果搞了好几天软件有意思(ahhhh),有点凡尔赛了,其实从开始做,到正常运行还是花了蛮久的时间的,基本都是周末搞,PCB其实也打了好几版,主要是布局好,为了看结构需要打板测试。开发过程中最崩溃的莫过于焊接了,说多了都是泪,焊接太费事了…

      08.jpg

      收获了什么
      M5Pi做了很久,做的还是非常开心的,这种感觉只有自己亲自去做,然后一点点调试,调试一个功能就行一个功能的感觉妙不可言~ 完整的做一个小项目还是比较爽的,建议大家也可以去尝试下,B站很多同学私信我是怎么学习,怎么开发的,我觉得还是多动手,多实践是最好的方法。M5Pi还没有完全开发完成,不过我已经开始着手准备下一个版本了!

      09.jpg

      大感谢
      做M5Pi的过程中也收到了很多人的帮助,首先感谢哇酷网(原坑网)的各位坛友,然后是我的BOSS,哈哈,免费提供了我几套外壳(遗憾的是显示屏仓库缺货),还有实验室可以让我在周末瞎搞,再然后是全志的Kirin,还送了我一个哪吒D1开发板,最后就是将各种问题记录并分享出来的网友们!

      最后,项目是开源的,可以在我的Github仓库找到。

      相关链接
      https://github.com/imliubo/M5Pi
      https://www.bilibili.com/video/BV1RV411W7eH
      https://whycan.com/viewtopic.php?id=6402&action=onlyshowauthor

      本文作者: IAMLIUBO @IAMLIUBO
      发表时间: Fri Aug 13 2021 12:49:59 GMT+0800
      本文链接: https://blogs.oopswow.com/2021/08/13/How-to-make-a-M5Pi/

      posted in 其它全志芯片讨论区
      IAMLIUBO
      IAMLIUBO
    • Reply: 第一次调MIPI接口的显示屏,都是什么套路?

      更新:
      在晕哥指导后,反复查看数据手册和D1_Linux_LCD_开发指南终于出图像了🤧

      4db02d57-5b3c-4be3-a03d-a094dec605dd-image.png

      显示貌似还有点问题,GAMA的问题?还需要再调整优化下,不过终于出来了,太感动了。

      下面是修改的后DTS LCD节点:

      	lcd_x               = <240>;
      	lcd_y               = <320>;
      	lcd_width           = <30>;
      	lcd_height          = <40>;
      	lcd_dclk_freq       = <7>;
      
      	lcd_pwm_used        = <1>;
      	lcd_pwm_ch          = <2>;
      	lcd_pwm_freq        = <1000>;
      	lcd_pwm_pol         = <0>;
      	lcd_pwm_max_limit   = <255>;
      
      	lcd_hbp             = <20>;
      	lcd_ht              = <304>; /**/
      	lcd_hspw            = <4>;   /**/
      	lcd_vbp             = <6>;
      	lcd_vt              = <336>;  /**/
      	lcd_vspw            = <2>;    /**/
      
      	lcd_dsi_if          = <0>;
      	lcd_dsi_lane        = <1>;
      

      不过有点好奇的是,为什么这里的参数会影响到启动?会直接卡死在boot阶段?

      等我整理下,把驱动跟PCB工程再分享上来,哈哈哈,开心。

      posted in D1系列-RISC-V
      IAMLIUBO
      IAMLIUBO
    • 第二次调试MIPI屏幕,套路居然又不太一样?

      前情回顾

      三个月之前有调试过一块MIPI接口的小屏幕,最近又买了一款新的MIPI接口的屏幕,本以为会像上次一样顺顺利利的,结果....

      废话不多说,这次买的屏幕长这样:
      304934d8-ccb1-4534-939b-6d5b70f2ff1b-image.png

      基本参数:
      9d6c5812-3cfb-4a89-a757-16c218de25b0-image.png

      是2通道的MIPI接口,驱动IC是ST7701s,2寸,分辨率480*360。

      管脚:
      3ff7a404-acb6-476f-8e7b-91ca8f3c2586-image.png

      转接板:
      479928c8-f2a4-40f5-88f4-330dc39c0000-image.png
      0a971d4a-32cb-4e94-89fd-f17f2db2b483-image.png

      数据手册:
      ST7701S_SPEC_+V1.1.pdf

      初始化代码:

      /*
      VFP=VBP=6=VS=6
      HFP=HBP=6=HS=220
      pll_clock=155;
      */
      WriteComm (0xFF);     
      WriteData (0x77);   
      WriteData (0x01);   
      WriteData (0x00);   
      WriteData (0x00);   
      WriteData (0x13);
               
      WriteComm (0xEF);
      WriteData (0x08);                 
      WriteComm (0xFF);
      WriteData (0x77);   
      WriteData (0x01);   
      WriteData (0x00);   
      WriteData (0x00);   
      WriteData (0x10); 
              
      WriteComm (0xC0);     
      WriteData (0x2C);   
      WriteData (0x00); 
                      
      WriteComm (0xC1);    
      WriteData (0x08);   
      WriteData (0x02); 
                      
      WriteComm (0xC2);     
      WriteData (0x37);    
      WriteData (0x05); 
                       
      WriteComm (0xCC);
      WriteData (0x10);
      .....
      
      // 稍微有点多....
      // 下面是我整理过的
      {0xFF, 5, {0x77, 0x01, 0x00, 0x00, 0x13} },
      {0xEF, 1, {0x08}},
      {0xFF, 5, {0x77, 0x01, 0x00, 0x00, 0x10}},
      {0xC0, 2, {0x2C, 0x00}},  // SCNL = (0x2c + 1) * 8 = 360
      {0xC1, 2, {0x08, 0x02}},  // VFB=0x08 VBF=0x02
      {0xC2, 2, {0x37, 0x05}},  // PCLK= 512 + (0x05 * 16) = 592
      {0xCC, 1, {0x10}},
      {0xB0, 16, {0x04, 0x0E, 0x17, 0x0B, 0x0F, 0x06, 0x08, 0x08, 0x08, 0x24, 0x04, 0x11, 0x0F, 0x2C, 0x33, 0x13}},
      {0xB1, 16, {0x0C, 0x16, 0x1D, 0x0E, 0x11, 0x06, 0x08, 0x08, 0x08, 0x24, 0x05, 0x13, 0x11, 0x2D, 0x33, 0x1F}},
      {0xFF, 5, {0x77, 0x01, 0x00, 0x00, 0x11}},
      {0xB0, 1, {0x54}},
      {0xB1, 1, {0x76}},
      {0xB2, 1, {0x87}},
      {0xB3, 1, {0x80}},
      {0xB5, 1, {0x4B}},
      {0xB7, 1, {0x85}},
      {0xB8, 1, {0x21}},
      {0xC1, 1, {0x78}},
      {0xC2, 1, {0x78}},
      {0xD0, 1, {0x88}},
      {REGFLAG_DELAY, REGFLAG_DELAY, { 20 } },
      {0xE0, 3, {0x00, 0x00, 0x02}},
      {0xE1, 11, {0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x33, 0x33}},
      {0xE2, 12, {0x11, 0x11, 0x33, 0x33, 0x6E, 0x00, 0x70, 0x00, 0x6D, 0x00, 0x6F, 0x00}},
      {0xE3, 4, {0x00, 0x00, 0x11, 0x11}},
      {0xE4, 2, {0x44, 0x44}},
      {0xE5, 16, {0x03, 0x6F, 0x00, 0xFF, 0x05, 0x71, 0x00, 0xFF, 0x07, 0x73, 0x00, 0xFF, 0x09, 0x6D, 0x00, 0xFF}},
      {0xE6, 4, {0x00, 0x00, 0x11, 0x11}},
      {0xE7, 2, {0x44, 0x44}},
      {0xE8, 16, {0x02, 0x6E, 0x00, 0xFF, 0x04, 0x70, 0x00, 0xFF, 0x06, 0x72, 0x00, 0xFF, 0x08, 0x6C, 0x00, 0xFF}},
      {0xEB, 7, {0x00, 0x01, 0x4E, 0x4E, 0xEE, 0x44, 0x00}},
      {0xED, 16, {0x4F, 0x01, 0x23, 0x56, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x65, 0x32, 0x10, 0xF4}},
      {0xEF, 6, {0x10, 0x0D, 0x04, 0x08, 0x3F, 0x1F}},
      {0xFF, 5, {0x77, 0x01, 0x00, 0x00, 0x00}},
      {0x11, 0, {0x00}},
      {REGFLAG_DELAY, REGFLAG_DELAY, { 120 } },
      {0x36, 0, {0x00}},
      {0x35, 0, {0x00}},
      {0x29, 0, {0x00}},
      { REGFLAG_END_OF_TABLE, REGFLAG_END_OF_TABLE, {} }
      

      现在有个疑问是下面的这几个参数,手册中只给了几个范围:
      3784a622-9bc3-4f0c-806a-9964d8c71ff3-image.png

      然后卖家给的初始化代码开头的几行注释,跟代码中实际设置的貌似也不一致....
      卖家给的:

      VFP=VBP=6=VS=6
      HFP=HBP=6=HS=220
      pll_clock=155;
      

      初始化代码计算的:

      {0xFF, 5, {0x77, 0x01, 0x00, 0x00, 0x10}},
      {0xC0, 2, {0x2C, 0x00}},  // SCNL = (0x2c + 1) * 8 = 360
      {0xC1, 2, {0x08, 0x02}},  // VFB=0x08  VBF=0x02
      {0xC2, 2, {0x37, 0x05}},  // PCLK= 512 + (0x05 * 16) = 592
      

      HFP和HBP没看到有相关的命令设置...

      现在的主要问题是下面这几个参数,我尝试了用各种方式计算,貌似都不对,

      lcd_hbp             = <>;
      lcd_ht              = <>;
      lcd_hspw            = <>;
      lcd_vbp             = <>;
      lcd_vt              = <>;
      lcd_vspw            = <>;
      
      lcd_dsi_if          = <0>;
      lcd_dsi_lane        = <2>;
      

      有大佬帮忙看一下吗😁 (我这里有两个屏幕和两个转接板,有想调的,可以联系我😀 )

      posted in D1系列-RISC-V
      IAMLIUBO
      IAMLIUBO
    • 使用OpenCV实时显示USB摄像头画面到屏幕上

      前置工作:

      在Ubuntu中交叉编译Opencv 4.5.1 运行于Tina Linux中(整合帖)

      借助OpenCV实时显示摄像头画面,需要先参考上面的帖子编译好OpenCV。
      剩下的工作就很简单了,代码是从stackoverflow借鉴(copy)的,交叉编译下就可以运行了:

      fbwrite_video.cpp

      /**
       * @file fbwrite_video.cpp
       * Displays OpenCV video on framebuffer.
       * Compile with
       * g++ -o fbwrite_video -lopencv_core -lopencv_highgui -lopencv_imgproc fbwrite_video.cpp
       *
       * Contains code from https://stackoverflow.com/questions/4722301/writing-to-frame-buffer
       */
      
      #include <iostream> // for std::cerr
      #include <opencv2/opencv.hpp>  // for cv::cvtColor
      #include <fstream>  // for ofstream
      
      // this is C :/
      #include <stdint.h> // for uint32_t
      #include <sys/ioctl.h> // for ioctl
      #include <linux/fb.h> // for fb_
      #include <fcntl.h> // for O_RDWR
      
      struct framebuffer_info {
          uint32_t bits_per_pixel; uint32_t xres_virtual;
      };
      struct framebuffer_info get_framebuffer_info(const char *framebuffer_device_path)
      {
          struct framebuffer_info info;
          struct fb_var_screeninfo screen_info;
          int fd = -1;
          fd = open(framebuffer_device_path, O_RDWR);
          if (fd >= 0) {
              if (!ioctl(fd, FBIOGET_VSCREENINFO, &screen_info)) {
                  info.xres_virtual = screen_info.xres_virtual;
                  info.bits_per_pixel = screen_info.bits_per_pixel;
              }
          }
          return info;
      };
      // C ends here
      
      int main(int, char **)
      {
          const int frame_width = 240;
          const int frame_height = 320;
          const int frame_rate = 10;
          framebuffer_info fb_info = get_framebuffer_info("/dev/fb0");
          cv::VideoCapture cap(0);
          if (!cap.isOpened()) {
              std::cerr << "Could not open video device." << std::endl;
              return 1;
          } else {
              std::cout << "Successfully opened video device." << std::endl;
              cap.set(cv::CAP_PROP_FRAME_WIDTH, frame_width);
              cap.set(cv::CAP_PROP_FRAME_HEIGHT, frame_height);
              cap.set(cv::CAP_PROP_FPS, frame_rate);
              std::ofstream ofs("/dev/fb0");
              cv::Mat frame;
              cv::Mat rotation_fream;
              while (true) {
                  cap >> frame;
                  if (frame.depth() != CV_8U) {
                      std::cerr << "Not 8 bits per pixel and channel." << std::endl;
                  } else if (frame.channels() != 3) {
                      std::cerr << "Not 3 channels." << std::endl;
                  } else {
                      // 3 Channels (assumed BGR), 8 Bit per Pixel and Channel
                      cv::transpose(frame, rotation_fream);
                      cv::flip(rotation_fream, frame, 0);
                      int framebuffer_width = fb_info.xres_virtual;
                      int framebuffer_depth = fb_info.bits_per_pixel;
                      cv::Size2f frame_size = frame.size();
                      cv::Mat framebuffer_compat;
                      switch (framebuffer_depth) {
                          case 16:
                              cv::cvtColor(frame, framebuffer_compat, cv::COLOR_BGR2BGR565);
                              for (int y = 0; y < frame_size.height ; y++) {
                                  ofs.seekp(y * framebuffer_width * 2);
                                  ofs.write(reinterpret_cast<char *>(framebuffer_compat.ptr(y)), frame_size.width * 2);
                              }
                              break;
                          case 32: 
                              {
                                  std::vector<cv::Mat> split_bgr;
                                  cv::split(frame, split_bgr);
                                  split_bgr.push_back(cv::Mat(frame_size, CV_8UC1, cv::Scalar(255)));
                                  cv::merge(split_bgr, framebuffer_compat);
                                  for (int y = 0; y < frame_size.height ; y++) {
                                      ofs.seekp(y * framebuffer_width * 4);
                                      ofs.write(reinterpret_cast<char *>(framebuffer_compat.ptr(y)), frame_size.width * 4);
                                  }
                              } 
                              break;
                          default:
                              std::cerr << "Unsupported depth of framebuffer." << std::endl;
                      }
                  }
              }
          }
      }
      

      这里分辨率是适配我的小屏幕的,如果用别的屏幕可以修改代码中的分辨率。

      CMakeLists.txt

      cmake_minimum_required(VERSION 2.8)
      project( fbwrite_video )
      SET(CROSS_COMPILE 1)
      set(CMAKE_SYSTEM_NAME Linux)
      SET(CMAKE_BUILD_TYPE "Release")
      set(CMAKE_C_COMPILER "/path/to/tina-d1-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gcc")
      set(CMAKE_CXX_COMPILER "/path/to/tina-d1-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-g++")
      find_package(OpenCV REQUIRED)
      include_directories(${OpenCV_INCLUDE_DIRS})
      add_executable(opencvTest fbwrite_video.cpp)
      target_link_libraries(opencvTest "/path/to//risc-v/install/lib/libopencv_world.so.4.5.2")
      

      效果:
      俺的B站

      本站播放:

      这里只是简单测试下,大家也可以跑点真正的CV代码,套路都差不多。

      posted in D1系列-RISC-V
      IAMLIUBO
      IAMLIUBO

    Latest posts made by IAMLIUBO

    • Reply: V853 设备树配置 2 mipi + 1 dvp 该怎么配置?

      @chengwei_peng 好的,感谢!

      posted in V853系列-AI视觉
      IAMLIUBO
      IAMLIUBO
    • Reply: V853 设备树配置 2 mipi + 1 dvp 该怎么配置?

      同问 DVP camera 怎么设置 还有 硬件怎么接😁

      是不是这一组管脚
      6d8167c7-1f1a-4df7-97a2-6f79006dbc99-image.png

      posted in V853系列-AI视觉
      IAMLIUBO
      IAMLIUBO
    • Reply: V853我们来了!!!

      我代表xxxx 发来贺电😊

      盼回礼(来块板子吧~)

      posted in V853系列-AI视觉
      IAMLIUBO
      IAMLIUBO
    • Reply: 全志V853开发板点亮啦

      😮 😮 😮

      哦吼,1T NPU的V853吗

      posted in V853系列-AI视觉
      IAMLIUBO
      IAMLIUBO
    • Reply: 作为一家艺术品公司,开发板只是副业。MQ-Pro V1.1 无bug版来了

      😁
      真的顶!树莓派缺货再也不怕~

      posted in D1系列-RISC-V
      IAMLIUBO
      IAMLIUBO
    • Reply: 全志神工具:DragonFace——可以动态修改固件的dts、sys_config.fex和分区配置等信息

      🤕 好多软件都没有Linux版本的....

      posted in 其它全志芯片讨论区
      IAMLIUBO
      IAMLIUBO
    • Reply: 开源!教你自制最精致的Pi!

      😁
      二代在计划了,用当下最流行的D1!(具体时间就不好说了,ahhhh

      posted in 其它全志芯片讨论区
      IAMLIUBO
      IAMLIUBO
    • Reply: 第二次调试MIPI屏幕,套路居然又不太一样?

      @lovexulu
      我也不是很清楚每一个参数改大或者改小会实际影响到显示的哪部分,等有时间还是要好好研究下,还是比较喜欢MIPI接口的,速度快,管脚少(其实别的就会个SPI😁 )

      posted in D1系列-RISC-V
      IAMLIUBO
      IAMLIUBO
    • Reply: 第二次调试MIPI屏幕,套路居然又不太一样?

      @mangogeek
      哈哈 快递明天就到了😁

      posted in D1系列-RISC-V
      IAMLIUBO
      IAMLIUBO
    • 开源!教你自制最精致的Pi!

      是什么
      M5Pi是我最近自制并开源的嵌入式Linux开发板,基于全志科技的F1C200s芯片,板载MPU6050姿态传感器,拥有一个320x240分辨率,2寸大小的全贴合电容触摸显示屏,一个1W的小喇叭可以用来播放声音,Wi-Fi用的是ESP8089,最重要的是有一个精美的外壳,这也是为什么我称它为最精致的“Pi”的原因,项目完全开源,PCB使用的开源软件KiCAD绘制,部分3D模型使用的开源软件FreeCAD绘制,系统使用的比较流行的buildroot制作,还用LVGL写了个简单的Launcher(还没完全写完)。

      01.jpg

      为什么做
      其实接触嵌入式Linux已经蛮久了,从最开始的树莓派,到后来NanoPi、香橙派、荔枝派等等,基本上也是都有玩过,还在B站录制过几集纯萌新入门视频,不过平常工作也不是主要做Linux相关的,所以理解的和讲的都很浅薄,真正让自己想要从零开始做一个属于自己的“Pi”,还是去年看到稚晖做的小电脑,当时觉得非常不错,自己也想去做一个,不过后面实际尝试了下,难度系数还是颇高的,所以当时用ESP32-S2做了个单片机版的小电视玩了玩,不过这个想法从未消失。

      02.jpg

      做了哪些尝试
      第二次想做,应该是在去年的十一月份左右,因为当时M5Core2玩了蛮久了,觉得这个尺寸,这个外壳,还有触摸的屏幕简直是太棒了,刚好我近水楼台先得月,手头也有外壳也有显示屏,所以当时又想去尝试一下,还特地选择了全志的H5,然后各种逛论坛,找资料,下载资料,真正开始要画PCB的时候,就觉得还是差点儿事了,因为H5没有内置DDR,我还想加一个eMMC,这部分属于高速PCB范畴了,挺难整的,只是简单打了一版布局的PCB,看了看主要元器件就放弃了,因为受制于外壳的尺寸,正面空间还是蛮小的,放背面我还不确定跟屏幕会不会有干涉,以及发热会不会影响屏幕等,就又咕掉了。

      背面还有两颗DDR,还没layout就觉得难整了

      04.jpg

      不过也没有完全咕掉,我还是成功曲线救国,做了一版试了试,不过是用的友善之臂的NanoPi NEO Air核心板,然后画了个扩展版,成功试制了一版,虽然曲线救国,尺寸也不太合适等等众多小问题,但是效果还是非常棒的!跑的是Armbian,驱动屏幕的时候也是翻车了很久,怎么搞都没法点亮,最后发现问题是FPC座子虚焊了… 当时差点儿想拍死自己。

      04.jpg

      正面看还是蛮不错的,但是看看背面就有点惨不忍睹了…

      05.jpeg

      怎么做的
      用NanoPi搞完后,就懒惰了(其实是菜),想用性能高点的CPU,PCB搞不定,PCB能搞定的,性能又不高,陷入了很长时间的CPU选型阶段,总体思想就是选内置DDR的,性能还要高点的,其实刚开始M5Pi没有准备用F1C200s,当时是看上了SSD202,因为刚好我司在做一个项目(Unit V2),刚好也了解一点,但是这个片子的资料需要签NDA,那我后期开源肯定会受到影响,所以还不如选择一款大家用的多,虽然官方也没公开release过任何资料的片子,最后的焦点就放在了F1C和V3s上,虽然V3s性能要比F1C高,但是价格还是要贵一丢丢,而且第一次做,还是找个便宜点的吧,于是就这样定了下来,四月底就正式开始搞了,内置DDR的片子画起来,要简单很多,基本上只要电源没问题,晶振没问题,就可以正常跑起来了…(省略几千字,开发记录可以在坑网看到,链接在文章最后)

      06.png

      07.png

      PCB第一版就可以正常运行,只不过触摸跟LED都画反了,别的没什么大碍,然后软件开发也就挺顺利的,因为aodzip大佬已经做了很多适配了,所以就简单改改设备树之类的,就平平无奇的运行起来了,不如上一次因为焊接问题,结果搞了好几天软件有意思(ahhhh),有点凡尔赛了,其实从开始做,到正常运行还是花了蛮久的时间的,基本都是周末搞,PCB其实也打了好几版,主要是布局好,为了看结构需要打板测试。开发过程中最崩溃的莫过于焊接了,说多了都是泪,焊接太费事了…

      08.jpg

      收获了什么
      M5Pi做了很久,做的还是非常开心的,这种感觉只有自己亲自去做,然后一点点调试,调试一个功能就行一个功能的感觉妙不可言~ 完整的做一个小项目还是比较爽的,建议大家也可以去尝试下,B站很多同学私信我是怎么学习,怎么开发的,我觉得还是多动手,多实践是最好的方法。M5Pi还没有完全开发完成,不过我已经开始着手准备下一个版本了!

      09.jpg

      大感谢
      做M5Pi的过程中也收到了很多人的帮助,首先感谢哇酷网(原坑网)的各位坛友,然后是我的BOSS,哈哈,免费提供了我几套外壳(遗憾的是显示屏仓库缺货),还有实验室可以让我在周末瞎搞,再然后是全志的Kirin,还送了我一个哪吒D1开发板,最后就是将各种问题记录并分享出来的网友们!

      最后,项目是开源的,可以在我的Github仓库找到。

      相关链接
      https://github.com/imliubo/M5Pi
      https://www.bilibili.com/video/BV1RV411W7eH
      https://whycan.com/viewtopic.php?id=6402&action=onlyshowauthor

      本文作者: IAMLIUBO @IAMLIUBO
      发表时间: Fri Aug 13 2021 12:49:59 GMT+0800
      本文链接: https://blogs.oopswow.com/2021/08/13/How-to-make-a-M5Pi/

      posted in 其它全志芯片讨论区
      IAMLIUBO
      IAMLIUBO