S5P6818开发板移植OV5640摄像头
此文章是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摄像头相关推荐
- 乐鑫Esp32学习之旅 23 安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...
- [2021]Linux下C语言qrencode二维码生成库的基本使用和ARM开发板移植
文章目录 一.前言 二.准备所用到的环境以及版本信息 1.Ubuntu和内核版本 2.gcc和g++版本 3.交叉编译gcc和g++版本 4.开发板信息 三.开发环境编译&安装qrencode ...
- arm开发板移植 curl
arm开发板移植 curl 一,下载curl源码 二,配置curl 三,移植到arm平台上 三,arm平台curl测试 一,下载curl源码 地址:https://curl.haxx.se/downl ...
- RK3399-NanoPC-T4-Android10开发板移植AAOS
基于RK3399-NanoPC-T4-Android10开发板移植AAOS工作.碰到的问题,调试思路,和修改记录整理如下. 方案一,把目前RK3399-T4开发板对应的驱动(喇叭,相机,蓝牙,LCD等 ...
- linux usb视频开发板,ARM开发板上USB 摄像头图像采集实现
开发板上的arm是AT91RM9200,摄像头选用的是网眼的pc350,主控芯片是ov511+.系统内核是2.4,宿主机是fedora core 6,交叉编译器是2.95.3.就是这些家底了,:-). ...
- imx6ull 开发板移植mjpg-streamer
imx6ull 移植mjpg-streamer 参考链接:https://blog.csdn.net/mucheni/article/details/109447610 前期准备: PC端:Ubunt ...
- 飞凌OK6410开发板移植u-boot官方最新版u-boot-2012.10.tar.bz2
Part0 准备知识 0.1 关键参数说明 0.1.1 开发板说明 OK6410是飞凌公司发布的一款开发板,当前有2个版本,OK6410-A和OK6410-B,我当前使用的是前者:前者也经历过升级,所 ...
- jz2440开发板移植U-boot之修改代码支持DM9000网卡
今天我们来移植U-boot到jz2440开发板,修改代码支持DM9000网卡.查看之前写的移植记录请点击链接:点击查看之前的移植记录 现在大多数开发板都支持DM9000网卡.我们的U-boot源码里面 ...
- 操作系统实验读者写者程序源码_SAST Weekly | STM32F103系列开发板移植华为LiteOS操作系统...
SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普.研究前沿热点介绍.科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享 ...
- LVGL的PC端移植和STM32F429阿波罗开发板移植
LVGL 8.1_学习总结 LVGL介绍 LVGL开发环境 LVGL的GitHub的代码介绍 LVGL8.1 在F429上面的移植 准备 修改lv_port_disp.c文件中的 修改lv_port_ ...
最新文章
- 一文看尽2018全年计算机视觉大突破
- debian10新建文档_Debian 10(Buster)安装过程图文详解
- python不能处理excel文件-python处理excel文件(xls和xlsx)
- MySQL第8天:MySQL索引优化分析之SQL慢
- 若依前后端分离版怎样去掉登录验证码
- c 对一个mysql数据库进行操作_C/C++对MySQL操作
- 大数据WEB阶段(九)Servlet+Request
- 小心!你家的 IoT 设备可能已成为僵尸网络“肉鸡”
- 蓝桥杯单片机DS1302时钟芯片驱动代码注释
- POJ 1694 An Old Stone Game ★(排序+树+递归)
- AMD平台下在Windows虚拟机中安装Mac10.8.3的注意事项
- 小程序{errcode:40029,errmsg:invalid code, hints: [ req_id: 8H_oSa0564ns12 ]}
- 计算机会议论文EI检索,ei检索会议论文算期刊_ei论文检索_ei会议论文算核心吗...
- LOAD the data R语言-如何加载数据?
- 简单10步,建立一个完美的商业网站
- java中上转型概念_Java中上转型和重写有什么区别?
- NUMECA/FineTurbo计算中自动调用CFview实时数据处理
- ai人工智能相关职业_2020年及以后的5个人工智能最佳职业
- 三维空间曲线参数方程曲率半径公式
- React 测试教程
热门文章
- IE主页被https://hao.360.cn/?a1004劫持,如何解决
- 计算机网络 第五章 课后题答案
- apk编辑器找Android,教你用安卓神器APK编辑器去除程序广告
- windows 远程桌面连接 bat
- Radon变换主要知识点
- html文本特效代码逐个出现,JS特效文字逐个显示
- mysql如何防止幻读
- 淘宝签名分析之一(反编译和利用frida快速找点)
- 《237 Gbit ps unrolled hardware polar decoder》237 Gbit / s展开的硬件极化解码器
- 《基于PAM4调制的50Gbit_s_BIDI光模块设计_陈春山》论文错别字