此文章是S5P6818开发板移植OV5640摄像头的记录

开发平台:DMATEK  EIS-680

内核:Linux3.4.39

系统:Android5.0

作者:lyp461340781

此文章记录S5P6818开发板移植OV5640摄像头的过程,可参考此流程在S5P6818开发板上进行其他摄像头的移植。

OV5640摄像头支持DVP接口和MIPI接口,我们平台采用的是DVP接口,即8位并行数据传输。

camera与CPU连接的原理图如下图所示:

1、首先,修改内核中文件,kernel采用NEXELL提供的版本

  • 修改内核中初始化配置文件\kernel\arch\arm\plat-s5p6818\dmatek\device.c

此处将OV5640初始化为后置摄像头

static struct i2c_board_info back_camera_i2c_boardinfo[] = {

I2C_BOARD_INFO("OV5640", 0x78>>1),

};

后置摄像头GPIO控制函数,上电和断电,此函数在下面结构体capture_plat_data[] 中调用

static int back_camera_power_enable(bool on)
{
    unsigned int io = CFG_IO_CAMERA_BACK_POWER_DOWN;
    unsigned int reset_io = CFG_IO_CAMERA_RESET;
    PM_DBGOUT("%s: is_back_camera_enabled %d, on %d\n", __func__, is_back_camera_enabled, on);
    if (on) {
        front_camera_power_enable(0);
        if (!is_back_camera_enabled) {
            camera_power_control(1);

//OV5640     add by lyp
            /* First RST signal to low */
            nxp_soc_gpio_set_out_value(reset_io, 0);
            nxp_soc_gpio_set_out_value(io, 1);  //ok;hdc 20150718;PN's status is important
            mdelay(5);

nxp_soc_gpio_set_out_value(io, 0);  //ok;hdc 20150718
            mdelay(1);
            nxp_soc_gpio_set_out_value(reset_io, 1);
            mdelay(1);

camera_common_set_clock(24000000);
            is_back_camera_enabled = true;
            mdelay(20);
            is_back_camera_power_state_changed = true;
        }

else

{
            is_back_camera_power_state_changed = false;
        }
    } else {
        if (is_back_camera_enabled) {
            nxp_soc_gpio_set_out_value(io, 0);
            is_back_camera_enabled = false;
            is_back_camera_power_state_changed = true;
        } else {
            nxp_soc_gpio_set_out_value(io, 0);
            is_back_camera_power_state_changed = false;
        }
        if (!(is_back_camera_enabled || is_front_camera_enabled)) {
            camera_power_control(0);
        }
    }

return 0;
}

该结构体初始化摄像头的一些参数

static struct nxp_capture_platformdata capture_plat_data[] = {
{
        .module = 0, //VIP0
        .sensor = &sensor[0],
        .type = NXP_CAPTURE_INF_PARALLEL,
        .parallel = {
            .is_mipi        = false,                              //是否采用MIPI接口
            .external_sync  = false,                         //是否采用外部同步信号
            .h_active       = 800,
            .h_frontporch   = 0, 
            .h_syncwidth    = 0, 
            .h_backporch    = 2, 
            .v_active       = 600,
            .v_frontporch   = 0, 
            .v_syncwidth    = 0, 
            .v_backporch    = 13,
            .clock_invert   = false, 
            .port           = 0,
            .data_order     = NXP_VIN_CBY0CRY1,    //输出YUV顺序
            .interlace      = false, 
            .clk_rate       = 24000000,
            .late_power_down = true,
            .power_enable   = back_camera_power_enable,   //电源使能,调用刚才上面的函数
            .power_state_changed = back_camera_power_state_changed,
            .set_clock      = camera_common_set_clock,
            .setup_io       = camera_common_vin_setup_io,
        },
        .deci = {
            .start_delay_ms = 0,
            .stop_delay_ms  = 0,
        },

},

};

  • OV5640驱动程序的修改

移植过程发现OV5640寄存器配置必须支持CCIR656格式输出,即0x4730寄存器的配置。OV5640部分驱动程序如下:

static int ov5640_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
 struct ov5640_priv *priv;
 struct v4l2_subdev *sd;
 int ret;

priv = kzalloc(sizeof(struct ov5640_priv), GFP_KERNEL);
 if (!priv)
  return -ENOMEM;

printk("...................................%s %d\n",__func__,__LINE__);
 ov5640_priv_init(priv);

sd = &priv->subdev;
 strcpy(sd->name, MODULE_NAME);

//ov5640_video_probe(client);

/* register subdev */
 v4l2_i2c_subdev_init(sd, client, &ov5640_subdev_ops);

sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 priv->pad.flags = MEDIA_PAD_FL_SOURCE;
 sd->entity.type = MEDIA_ENT_T_V4L2_SUBDEV_SENSOR;
 sd->entity.ops  = &ov5640_media_ops;
 if (media_entity_init(&sd->entity, 1, &priv->pad, 0)) {
  dev_err(&client->dev, "%s: failed to media_entity_init()\n", __func__);
  kfree(priv);
  return -ENOENT;
 }

ret = ov5640_initialize_ctrls(priv);
 if (ret < 0) {
  printk(KERN_ERR "%s: failed to initialize controls\n", __func__);
  kfree(priv);
  return ret;
 }

return 0;
}

static int ov5640_remove(struct i2c_client *client)
{
 struct v4l2_subdev *sd = i2c_get_clientdata(client);
 v4l2_device_unregister_subdev(sd);
 v4l2_ctrl_handler_free(sd->ctrl_handler);
 media_entity_cleanup(&sd->entity);
 kfree(to_priv(sd));
 return 0;
}

static const struct i2c_device_id ov5640_id[] = {
 { MODULE_NAME, 0 },
 { }
};

MODULE_DEVICE_TABLE(i2c, ov5640_id);

static struct i2c_driver ov5640_i2c_driver = {
 .driver = {
  .name = MODULE_NAME,
 },
 .probe    = ov5640_probe,
 .remove   = ov5640_remove,
 .id_table = ov5640_id,
};

module_i2c_driver(ov5640_i2c_driver);

MODULE_DESCRIPTION("SoC Camera driver for ov5640");
MODULE_AUTHOR("lyp(ping@dmatek.com.tw)");
MODULE_LICENSE("GPL v2");

2、修改Android系统层

  • 修改BSP包目录下找device\nexell\dmatek_s5p6818\camera\board-camera.cpp

修改NXCameraBoardSensor *get_board_camera_sensor(int id) 函数,

if (id == 0) {
        if (!backSensor) {
            backSensor = new OV5640(nxp_v4l2_sensor0);      //后置摄像头调用OV5640
            if (!backSensor)
                ALOGE("%s: cannot create BACK Sensor", __func__);
        }
        sensor = backSensor;
    }

  • 在BSP包目录下找hardware\samsung_slsi\slsiap\libcamerasensor目录,在libcamerasensor目录下创建OV5640.cpp和OV5640.h

OV5640.cpp部分代码如下:(可参考SP2518.cpp进行修改)

修改完成后进行编译烧写测试。

此处只是大概记录一下移植过程,具体的源码下载链接如下:

http://download.csdn.net/detail/lyp461340781/9648855



S5P6818开发板移植OV5640摄像头相关推荐

  1. 乐鑫Esp32学习之旅 23 安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  2. [2021]Linux下C语言qrencode二维码生成库的基本使用和ARM开发板移植

    文章目录 一.前言 二.准备所用到的环境以及版本信息 1.Ubuntu和内核版本 2.gcc和g++版本 3.交叉编译gcc和g++版本 4.开发板信息 三.开发环境编译&安装qrencode ...

  3. arm开发板移植 curl

    arm开发板移植 curl 一,下载curl源码 二,配置curl 三,移植到arm平台上 三,arm平台curl测试 一,下载curl源码 地址:https://curl.haxx.se/downl ...

  4. RK3399-NanoPC-T4-Android10开发板移植AAOS

    基于RK3399-NanoPC-T4-Android10开发板移植AAOS工作.碰到的问题,调试思路,和修改记录整理如下. 方案一,把目前RK3399-T4开发板对应的驱动(喇叭,相机,蓝牙,LCD等 ...

  5. linux usb视频开发板,ARM开发板上USB 摄像头图像采集实现

    开发板上的arm是AT91RM9200,摄像头选用的是网眼的pc350,主控芯片是ov511+.系统内核是2.4,宿主机是fedora core 6,交叉编译器是2.95.3.就是这些家底了,:-). ...

  6. imx6ull 开发板移植mjpg-streamer

    imx6ull 移植mjpg-streamer 参考链接:https://blog.csdn.net/mucheni/article/details/109447610 前期准备: PC端:Ubunt ...

  7. 飞凌OK6410开发板移植u-boot官方最新版u-boot-2012.10.tar.bz2

    Part0 准备知识 0.1 关键参数说明 0.1.1 开发板说明 OK6410是飞凌公司发布的一款开发板,当前有2个版本,OK6410-A和OK6410-B,我当前使用的是前者:前者也经历过升级,所 ...

  8. jz2440开发板移植U-boot之修改代码支持DM9000网卡

    今天我们来移植U-boot到jz2440开发板,修改代码支持DM9000网卡.查看之前写的移植记录请点击链接:点击查看之前的移植记录 现在大多数开发板都支持DM9000网卡.我们的U-boot源码里面 ...

  9. 操作系统实验读者写者程序源码_SAST Weekly | STM32F103系列开发板移植华为LiteOS操作系统...

    SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普.研究前沿热点介绍.科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享 ...

  10. LVGL的PC端移植和STM32F429阿波罗开发板移植

    LVGL 8.1_学习总结 LVGL介绍 LVGL开发环境 LVGL的GitHub的代码介绍 LVGL8.1 在F429上面的移植 准备 修改lv_port_disp.c文件中的 修改lv_port_ ...

最新文章

  1. 一文看尽2018全年计算机视觉大突破
  2. debian10新建文档_Debian 10(Buster)安装过程图文详解
  3. python不能处理excel文件-python处理excel文件(xls和xlsx)
  4. MySQL第8天:MySQL索引优化分析之SQL慢
  5. 若依前后端分离版怎样去掉登录验证码
  6. c 对一个mysql数据库进行操作_C/C++对MySQL操作
  7. 大数据WEB阶段(九)Servlet+Request
  8. 小心!你家的 IoT 设备可能已成为僵尸网络“肉鸡”
  9. 蓝桥杯单片机DS1302时钟芯片驱动代码注释
  10. POJ 1694 An Old Stone Game ★(排序+树+递归)
  11. AMD平台下在Windows虚拟机中安装Mac10.8.3的注意事项
  12. 小程序{errcode:40029,errmsg:invalid code, hints: [ req_id: 8H_oSa0564ns12 ]}
  13. 计算机会议论文EI检索,ei检索会议论文算期刊_ei论文检索_ei会议论文算核心吗...
  14. LOAD the data R语言-如何加载数据?
  15. 简单10步,建立一个完美的商业网站
  16. java中上转型概念_Java中上转型和重写有什么区别?
  17. NUMECA/FineTurbo计算中自动调用CFview实时数据处理
  18. ai人工智能相关职业_2020年及以后的5个人工智能最佳职业
  19. 三维空间曲线参数方程曲率半径公式
  20. React 测试教程

热门文章

  1. IE主页被https://hao.360.cn/?a1004劫持,如何解决
  2. 计算机网络 第五章 课后题答案
  3. apk编辑器找Android,教你用安卓神器APK编辑器去除程序广告
  4. windows 远程桌面连接 bat
  5. Radon变换主要知识点
  6. html文本特效代码逐个出现,JS特效文字逐个显示
  7. mysql如何防止幻读
  8. 淘宝签名分析之一(反编译和利用frida快速找点)
  9. 《237 Gbit ps unrolled hardware polar decoder》237 Gbit / s展开的硬件极化解码器
  10. 《基于PAM4调制的50Gbit_s_BIDI光模块设计_陈春山》论文错别字