首页 > 系统相关 >移远通信SC200L芯片Linux平台摄像头应用开发

移远通信SC200L芯片Linux平台摄像头应用开发

时间:2024-06-20 18:01:34浏览次数:23  
标签:int virtual 移远 编译 源码 fd 摄像头 Linux SC200L

一、交叉编译器        

        对于Linux平台的开发,官方只提供了yocto工程的源码,没有SDK,yocto工程也不能制作SDK包,可能是我自己的问题,最后只能在yocto中自建layer来进行开发。

        由于官方源码编译采用arm-unisoc-linux-gnueabi-gcc,32位arm,所以整个软件包工程均为32位,包括生成的镜像。源码中有一个aarch64的交叉编译链安装脚本,好像是用来做chipram的编译。

        

        对于简单的应用开发,可以使用linaro提供的arm-linux-gnueabihf来做交叉编译,但是对于依赖较多的复杂应用,例如摄像头开发,需要sysroot的支持。因此本次实验需要在yocto工程中新建自己的meta来实现,根据源码中已经编译过的库来进行编译。

二、源码移植

        开发板的主摄像头为三星的s5k4h7,出场源码烧录至开发板后,/dev目录下看不到video设备:

        使用常规的USB方式open系统调用无法打开,因为确实没有这个设备节点。使用官方提供的摄像头demo却可以正常运行,拍照和视频都可以。

        翻看源码后发现,demo程序封装了一个V4l2AdapterInterface的接口:

class V4l2AdapterInterface {
  public:
    virtual ~V4l2AdapterInterface(){};
    virtual int open(const char *__path, int __flags) = 0;
    virtual long ioctl(int fd_, unsigned long request, void *argp) = 0;
    virtual void *mmap(void *addr, size_t length, int prot, int flags, int fd,
                       off_t offset) = 0;
    virtual int munmap(void *addr, size_t length) = 0;
    virtual int poll(struct pollfd *fds, nfds_t nfds, int timeout) = 0;
    virtual int close(int __flags) = 0;
    virtual int write_i2c_t(int fd_, void *reg, int count) {
        return this->write_i2c_t(fd_, reg, count);
    };
    virtual int read_i2c(int fd_, unsigned short reg_addr) {
        return this->read_i2c(fd_, reg_addr);
    };

    template<class T,int N> int write_i2c(int fd_, T (&array)[N]){
        int count = 0;
        for(int i=0;i<N;i++) {
            if(!array)
              break;
            if(!((struct sensor_reg_info)array[i]).reg_addr &&
               !((struct sensor_reg_info)array[i]).reg_value)
              continue;
            count++;
        }
        return write_i2c_t(fd_, (void *)array, count);
    };
    const char *name_;
};

class V4l2Client {
  public:
    V4l2Client(const char *name);
    virtual ~V4l2Client() {}

    static V4l2AdapterInterface *create();
    static void registerType(V4l2Client *factory);
    const std::string &name() const { return name_; }

  private:
    virtual V4l2AdapterInterface *createInstance();
    std::string name_;
};
class V4l2Adapter : public V4l2AdapterInterface {
public:
  V4l2Adapter() { std::cout << "constructor V4l2Adapter" << std::endl; }
  ~V4l2Adapter() { std::cout << "deconstructor  ~V4l2Adapter" << std::endl; }
  int open(const char *__path, int __flags) { return ::open(__path, __flags); }
  long ioctl(int fd_, unsigned long request, void *argp) {
    return ::ioctl(fd_, request, argp);
  }
  void *mmap(void *addr, size_t length, int prot, int flags, int fd,
             off_t offset) {
    return mmap(addr, length, prot, flags, fd, offset);
  }

  int munmap(void *addr, size_t length) {
      return munmap(addr, length);
  }

  int poll(struct pollfd *fds, nfds_t nfds, int timeout) {
    return poll(fds, nfds, timeout);
  }

  int close(int __flags) {
    return close(__flags);
  }
};

        这个接口也只是对常用的几个系统调用做了封装,并没有施加什么魔法,我引入这个头文件重新封装了自己的app,结果还是不行,依然无法打开,于是直接复制源码到自己的meta中,干脆在源码上做修改。

        编译时只需要添加 -b 参数来指定单个bb文件编译即可,注意指定输出的路径,方便push到开发板。

三、数据格式

        不改变最基本的摄像头开发框架,只在数据读取时,根据需要写入文件。先快速编写一个应用,再去深入了解每一个ioctl操作。

        网上有很多开发框可参考,例如:

手把手教你使用linux摄像头(V4L2框架)_linux摄像头 v4l2-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/small_po_kid/article/details/119913184

         需要注意camera支持的pixelformat,也就是数据流格式,大部分摄像头都支持YUV 4:2:0格式,参数为V4L2_PIX_FMT_YUV420,部分camera支持V4L2_PIX_FMT_MJPEG直接导出jpg图片。如果是YUV格式可能会需要转码至RGB色彩空间,编码为jpg图片方便其他设备打开,可参考:yuv420p转jpg linux(纯C语言实现) - quinncy - 博客园 (cnblogs.com)icon-default.png?t=N7T8https://www.cnblogs.com/zhq-blog/p/8832157.html

        最后生成的yuv文件可用 YUView 软件打开,github上开源的。

四、总结

        网上很少有移远通信智能模组相关的社区讨论与学习资料(毕竟正经学生谁玩移远), 本篇博客在于学习记录与提供应用开发的思路,很多知识没有细讲,我也是Linux新鸟,欢迎广大读者交流学习。

标签:int,virtual,移远,编译,源码,fd,摄像头,Linux,SC200L
From: https://blog.csdn.net/plmm__/article/details/139838226

相关文章

  • 【网络调优】Linux网络端口随机分配问题
    1.Linux端口基础1.端口号0不使用2.端口号1-1023,系统默认只给root使用3.端口号1024-4999由客户端程序自由分配4.端口号5000-65535由服务器程序自由分配2.Linux默认随机端口范围一般Linux的默认随机端口范围是:32768-60999(可以通过查看配置文件的方式来获取)当客户端port......
  • linux重启后SSH无法启动,报/var/empty/sshd must be owned by root and not group or w
    问题:Linux上的SSH无法启动,执行/usr/sbin/sshd报 /var/empty/sshdmustbeownedbyrootandnotgrouporworld-writable。解决办法:查看发现这个目录的属主不是root,所以启动ssh报错#ls-ld/var/empty/sshd/  d——x——x——x2meifuroot1024Feb192024/var/emp......
  • Linux kernel版本升级实例
    内核版本漏洞           内核离线升级     https://elrepo.org/linux/kernel/el7/x86_64/RPMS/    1.下载内核相关的rpm包            2.安装内核源        rpm-ihvkernel*--nodeps--force  ......
  • linux可视化监控:Grafana+Prometheus+node_exporter
    原理node_exporter:它的作用主要是收集性能测试的数据,如cpu、内存磁盘网络等信息,然后将数据保存到prometheus,相当于将数据存入到数据库中;想要监控不同的内容,就使用不同的exporter,比如mysqld_exporterPrometheus:虽然说是监控平台,但是实际上是一套数据库,用于做数据存储,不能做展......
  • Linux学习笔记(一)(以Ubuntu为例)
    Linux操作命令的笔记(一)(Ubuntu)其实Linux不同发行版的基础命令区别不大。Linux命令基础格式命令通用格式:command[-options][parameter][]表示可选的意思command:命令本身-options:[可选,非必填]命令的一些选项,可以通过选项控制命令的行为细节parameter:[可选,非必填]命令......
  • linux修改shell导致无法登录
    linux修改shell导致无法登录我之前在切换shell的时候执行了chsh-sbashroot结果后面就无法登录系统了,当时不知道怎么一回事,只能先放到一边了。今天没什么事,突然福至心灵,为什么不试试进到单用户模式里面修改shell呢?然后我就得到了这样的提示:chsh:PAM:Authenticationfailure......
  • linux 内存和cpu信息
    free#free[root@VM-0-14-centos~]#freetotalusedfreesharedbuff/cacheavailableMem:101482027236082932512659528577780Swap:000#-h以合适......
  • 在Linux中,什么是中间件?什么是jdk?
    在计算机科学中,中间件(Middleware)和Java开发工具包(JDK)是两个不同的概念,它们在软件开发和运行环境中扮演着不同的角色。1.中间件(Middleware)中间件是位于客户端和服务器之间的软件层,它提供了通信和数据管理的服务。中间件使得不同的应用程序能够通过标准的通信协议进行交互,而不必......
  • 在Linux中,Tomcat和Resin有什么区别,工作中怎么选择?
    Tomcat和Resin是两种流行的Java应用服务器,用于运行JavaServlet、JSP(JavaServerPages)和其他基于Java的Web应用程序。下面是它们的一些区别和特点:Tomcat开发者:由Apache软件基金会开发和维护。特点:开源免费,拥有庞大的社区支持。轻量级,主要设计用于Servlet和JSP......
  • 在Linux中,什么叫网站灰度发布?
    网站灰度发布是一种软件发布策略,用于在全面推出新版本之前,逐步向用户群体推送更新。这种方法可以降低新版本引入的潜在风险,同时收集用户反馈以优化产品。以下是灰度发布的一些关键概念和步骤:用户分群:首先,将用户群体按照某种标准(如地理位置、用户行为、设备类型等)分成不同的组别......