你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32MP157 Linux系统移植开发篇17:Linux内核摄像头驱动移植

[复制链接]
STMCU小助手 发布时间:2022-9-29 18:36
1.实验原理
DCMI(Digital Camera Interface),DCMI是一个同步并行接口,能够从外部8bit、10bit、12bit或14bit的CMOS摄像头接收高速数据流,支持不同的数据格式:YCbCr4:2:2/RGB565渐进式视频和压缩数据(JPEG)。

c83ba35897da73ecc13fccd18441b5c5.png

FS-MP1A可以外接8bit的COM Camera,接口定义如下:

de7288b4e7ec7ca3ed941f80959dcdd3.jpg

接口与MPU管脚对应关系如下:

dace904bf0152f1c6c35ebc915a678d9.png

a22998df2b22d90ac4b4e3b162976c22.png

a2f86ae0e16fe61dce68fd9711a691fc.png

c5413c4bca6751213094ef9c750f67b5.png

5dc626ee133525361696e9cc99621b5f.png
R2G%IMP~0O[RTRK_3R7C1EB.png


内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:

arch/arm/boot/dts/stm32mp151.dtsi

stm32mp151中dcmi定义如下:

dcmi: dcmi@4c006000 {

compatible = "st,stm32-dcmi";

reg = <0x4c006000 0x400>;

interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;

resets = <&rcc CAMITF_R>;

clocks = <&rcc DCMI>;

clock-names = "mclk";

dmas = <&dmamux1 75 0x400 0xe0000001>;

dma-names = "tx";

status = "disabled";

};

上述代码只对dcmi做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。

参考帮助文档及内核中其它STM32MP157设备树中对于dcmi的定义,修改dcmi内容如下:

&dcmi {

status = "okay";

pinctrl-names = "default", "sleep";

pinctrl-0 = <&dcmi_pins_a>;

pinctrl-1 = <&dcmi_sleep_pins_a>;

port {

dcmi_0: endpoint {

remote-endpoint = <&ov5640_0>;

bus-width = <8>;

hsync-active = <0>;

vsync-active = <0>;

pclk-sample = <1>;

pclk-max-frequency = <77000000>;

};

};

};

由于stm32mp15-pinctrl.dtsi中对于DCMI管脚的定义与FS-MP1A实际使用管脚一致,所以无需修改

1.CMOS Camera设备树节点
FS-MP1A支持多款COMS Camera,本节以ov5640为例:

参考帮助文档及内核中其它STM32MP157设备树中对于ov5640的定义,修改dcmi内容如下:

ov5640: camera@3c {

compatible = "ovti,ov5640";

reg = <0x3c>;

clocks = <&clk_ext_camera>;

clock-names = "xclk";

DOVDD-supply = <&v2v8>;

powerdown-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PUSH_PULL)>;

reset-gpios = <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PUSH_PULL)>;

rotation = <180>;

status = "okay";

port {

ov5640_0: endpoint {

remote-endpoint = <&dcmi_0>;

bus-width = <8>;

data-shift = <2>; /* lines 9:2 are used */

hsync-active = <0>;

vsync-active = <0>;

pclk-sample = <1>;

pclk-max-frequency = <77000000>;

};

};

};

2.2.8V电源定义
前文已经说过如何添加电源节点,本节不再重复,在根节点添加&v2v8节点,内容如下:

v2v8_audio: regulator-v2v8 {

compatible = "regulator-fixed";

regulator-name = "v2v8";

regulator-min-microvolt = <2800000>;

regulator-max-microvolt = <2800000>;

regulator-always-on;

regulator-boot-on;

};

3.24M时钟定义
参考文档:

Documentation/devicetree/bindings/clock/fixed-clock.yaml

参考帮助文档或内核中其他设备树文件,对于时钟的定义,增加内容如下:

clocks {

clk_ext_camera: clk-ext-camera {

#clock-cells = <0>;

compatible = "fixed-clock";

clock-frequency = <24000000>;

};

};

2.实验目的

熟悉基于Linux操作系统下的摄像头设备驱动移植配置过程。

3.实验平台
华清远见开发环境,FS-MP1A平台;

4.实验步骤
导入交叉编译工具链
linux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

1.增加DCMI设备树节点
修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容:

&dcmi {

status = "okay";

pinctrl-names = "default", "sleep";

pinctrl-0 = <&dcmi_pins_a>;

pinctrl-1 = <&dcmi_sleep_pins_a>;

port {

dcmi_0: endpoint {

remote-endpoint = <&ov5640_0>;

bus-width = <8>;

hsync-active = <0>;

vsync-active = <0>;

pclk-sample = <1>;

pclk-max-frequency = <77000000>;

};

};

};

2.增加OV5640节点
修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,在I2C5节点中添加OV5640设备信息,红色字体为增加内容:

&i2c5 {

pinctrl-names = "default", "sleep";

pinctrl-0 = <&i2c5_pins_a>;

……

ov5640: camera@3c {

compatible = "ovti,ov5640";

reg = <0x3c>;

clocks = <&clk_ext_camera>;

clock-names = "xclk";

DOVDD-supply = <&v2v8>;

powerdown-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PUSH_PULL)>;

reset-gpios = <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PUSH_PULL)>;

rotation = <180>;

status = "okay";

port {

ov5640_0: endpoint {

remote-endpoint = <&dcmi_0>;

bus-width = <8>;

data-shift = <2>; /* lines 9:2 are used */

hsync-active = <0>;

vsync-active = <0>;

pclk-sample = <1>;

pclk-max-frequency = <77000000>;

};

};

};

};

3.增加2.8V电源和24M时钟
修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点最后添加2.8V电源和24M时钟,红色字体为增加内容:

/ {

memory@c0000000 {

device_type = "memory";

reg = <0xc0000000 0x20000000>;

};

……

v2v8: regulator-2p8v {

compatible = "regulator-fixed";

regulator-name = "v2v8";

regulator-min-microvolt = <2800000>;

regulator-max-microvolt = <2800000>;

regulator-always-on;

regulator-boot-on;

};

clocks {

clk_ext_camera: clk-ext-camera {

#clock-cells = <0>;

compatible = "fixed-clock";

clock-frequency = <24000000>;

};

};

};

4.配置内核
配置内核支持ov5640,并列出主要选项,如下

linux@ubuntu make menuconfig

Device Drivers --->

<*> Multimedia support --->
V4L platform devices --->

<*> STM32 Digital Camera Memory Interface (DCMI) support

I2C Encoders, decoders, sensors and other helper chips --->

<*> OmniVision OV5640 sensor support
5.编译内核及设备树linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC20000406.重启测试
将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,系统启动后启动信息中包含如下信息:

1d703fec11332a88fa825882a1fc9803.jpg

在屏幕的界面上选择“Camera preview”应用进入摄像头预览程序,启动界面后即可看到摄像头实时采集的图像。

6dabb1436e2984f787dbd53b5eb4d109.jpg

————————————————
版权声明:华清远见IT开放实验室


收藏 评论0 发布时间:2022-9-29 18:36

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版