STMCU小助手
发布时间:2022-9-29 18:36
|
1.实验原理 DCMI(Digital Camera Interface),DCMI是一个同步并行接口,能够从外部8bit、10bit、12bit或14bit的CMOS摄像头接收高速数据流,支持不同的数据格式:YCbCr4:2:2/RGB565渐进式视频和压缩数据(JPEG)。 % ?( M' F3 W8 x' |2 {/ A- G
FS-MP1A可以外接8bit的COM Camera,接口定义如下:& |& F: U$ b' h4 ^+ ]
接口与MPU管脚对应关系如下:
1 j4 B1 V+ _' B0 d! ]( Y- j
+ C1 V5 P7 S0 K0 t ; i) N/ B @+ y, O" Y3 z 内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:" I$ P5 ^2 t: L8 o5 N! q- H5 W arch/arm/boot/dts/stm32mp151.dtsi + x' @( b% q( s2 Y; x7 G: H stm32mp151中dcmi定义如下:4 z( b+ p8 l0 m4 V 5 K1 u, i) a: w. F dcmi: dcmi@4c006000 { 0 u% _& ~2 v; K B8 l9 Y compatible = "st,stm32-dcmi"; ( D0 ?6 ~2 y% ^2 ~0 a! g3 R reg = <0x4c006000 0x400>;1 k* g# A/ q/ J ( p9 O5 Z1 D+ S# V interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;1 R3 y1 o1 w" E `3 }( r 5 ^8 m( y r/ c, F resets = <&rcc CAMITF_R>; clocks = <&rcc DCMI>; 9 R2 y4 t4 w3 e: }( L- G clock-names = "mclk";6 X0 Y, }2 A6 @) ~ dmas = <&dmamux1 75 0x400 0xe0000001>; 6 ]4 V' i0 R! B6 |' b) W) j6 H/ L dma-names = "tx"; status = "disabled"; - m" f6 I9 |6 B/ J- N }; 上述代码只对dcmi做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。: [8 ^& d9 }! f; b1 r1 Q% { " v9 v% o5 K* d) W8 C3 Y 参考帮助文档及内核中其它STM32MP157设备树中对于dcmi的定义,修改dcmi内容如下:7 R! G8 @5 o/ Y8 M1 r- O 8 _, d" Y8 v( a1 y &dcmi {1 T8 ?. Z" _( D7 x1 s status = "okay";2 @% w( Z9 }1 \& C/ n X pinctrl-names = "default", "sleep"; pinctrl-0 = <&dcmi_pins_a>; ) P/ k5 \9 A7 n" A, d/ X; A. e/ L pinctrl-1 = <&dcmi_sleep_pins_a>; - z9 D1 E* r$ S/ | port { dcmi_0: endpoint {* C ^( `5 P! P) e/ f& l0 Y5 N1 L remote-endpoint = <&ov5640_0>; bus-width = <8>; 4 S. \3 w. M6 S hsync-active = <0>;) l9 C& f/ u( v S N/ L vsync-active = <0>; - W' a/ r- U* d" U {6 _ pclk-sample = <1>;; u4 y6 }8 m4 }7 [$ k3 i( G+ s ' V2 T0 U/ r i- ^, m' g7 c pclk-max-frequency = <77000000>; }; ( k3 R* h" u+ b };" ]9 v. ^3 `3 `- H+ G) R 8 [& h) H f/ Z% |% k( M };7 ?% o; Y% V2 F* q 由于stm32mp15-pinctrl.dtsi中对于DCMI管脚的定义与FS-MP1A实际使用管脚一致,所以无需修改$ M; w1 \) j* p( l5 n: X- D7 v 1.CMOS Camera设备树节点( u: j' b$ K" j1 m1 b" ` FS-MP1A支持多款COMS Camera,本节以ov5640为例: 参考帮助文档及内核中其它STM32MP157设备树中对于ov5640的定义,修改dcmi内容如下:9 d. A, s# M* h. [ ov5640: camera@3c { 5 |9 _8 I. u4 e) I0 T$ B3 l compatible = "ovti,ov5640"; : p% s" f* ~; @" l6 Z! X reg = <0x3c>; clocks = <&clk_ext_camera>;3 U. w6 c" r! D3 F5 g; h clock-names = "xclk"; DOVDD-supply = <&v2v8>; 5 V( s" z" ]9 i( `9 I powerdown-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PUSH_PULL)>; reset-gpios = <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PUSH_PULL)>;6 ]$ W2 ]$ e. J/ Q1 ]* m K rotation = <180>;3 L, ?; p: | j status = "okay";+ G& S; y/ o5 f' G, R ( \! s, P& S! ` port {( Q7 ?+ o2 a- u4 S( q) F+ Y. }" `2 H ov5640_0: endpoint {4 e* B. D3 R6 B: i* m9 m remote-endpoint = <&dcmi_0>; bus-width = <8>;$ S0 n+ p% i! D! o1 W 2 Y2 F. Z' ~! J5 L7 L; F data-shift = <2>; /* lines 9:2 are used */! U% c' T, Q! z( \. v hsync-active = <0>;# ]8 ]! Y% @' x* {/ @# ?7 ] 0 N! \/ L0 X* `' u5 O, W vsync-active = <0>; pclk-sample = <1>; 8 J+ r7 _9 b- ^5 E/ t" V6 w pclk-max-frequency = <77000000>;5 o) U+ Y. s5 w) l' ~$ } ) s& |$ |7 [- J0 I5 K% X/ {' c0 m };$ d9 Y3 O. I0 P6 G6 I+ Y 5 B, m, H3 k& u' m) B7 w }; };0 }1 E' w6 i6 W0 A6 R; p 2.2.8V电源定义0 J% l) C: G$ |' f0 ~ 前文已经说过如何添加电源节点,本节不再重复,在根节点添加&v2v8节点,内容如下:, g! s( ~& i" L v2v8_audio: regulator-v2v8 {' D* {2 @& ^& U6 p O, H! i; u5 } compatible = "regulator-fixed";- G: p3 _- E$ {. m regulator-name = "v2v8";! v( W! _( F6 s0 c+ @- L# s2 {: p+ ` regulator-min-microvolt = <2800000>;/ \* Q* R9 j) F2 B4 \1 X 1 ^: B: {' d9 l$ y regulator-max-microvolt = <2800000>;! q1 {" R- f6 c# `- ?( G5 A' Z regulator-always-on; " t& R; k) a& b2 J+ s regulator-boot-on; };, M8 a- m* p7 Z. P) H 4 d$ h( E+ {( ^" Z# {% q 3.24M时钟定义 l& Z2 C+ ?/ d, L0 S 参考文档:0 Q5 ?7 k. w% T! J; J - j, ~( P' U+ L3 D) o& K Documentation/devicetree/bindings/clock/fixed-clock.yaml r* j$ p" C! q6 h# k 9 u9 Z5 F9 D9 f7 `( u 参考帮助文档或内核中其他设备树文件,对于时钟的定义,增加内容如下: clocks {: b4 E& J8 K0 }$ \0 C) B3 y$ P clk_ext_camera: clk-ext-camera { #clock-cells = <0>; ( R/ ]/ Y' i* p1 u( d I compatible = "fixed-clock";: W& A2 n# _$ X- K clock-frequency = <24000000>;2 l- V- |1 X4 v" \6 O6 h+ R ] ( R$ Z9 K3 p3 R! d9 w: F }; }; 8 A* l$ F, M7 t- e1 c2 e 2.实验目的# t4 s* T% }- U' ^ 熟悉基于Linux操作系统下的摄像头设备驱动移植配置过程。 3.实验平台 华清远见开发环境,FS-MP1A平台;) _' k. h: T% D+ I, l! E ) K! G: n# P6 \3 e# A( m: Q2 y# E, V 4.实验步骤% M' W" O5 I; X. H; T" L 导入交叉编译工具链+ t0 j$ Z5 a' g7 L3 I7 y; F) v- Z linux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi) ^8 U- F3 f" l# U0 k0 U" O; [6 g+ W4 R8 Y9 D4 j2 x" J+ Z! e3 j 1.增加DCMI设备树节点 修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容:# h3 ~ S4 ~8 l. ?* J, ^+ N; k" D &dcmi { 5 f! m5 L; X* d" [' z4 n6 w6 f& U status = "okay"; pinctrl-names = "default", "sleep"; & H; V$ D# j. X; A4 | pinctrl-0 = <&dcmi_pins_a>;2 w+ v: I" \ [/ H9 k! d pinctrl-1 = <&dcmi_sleep_pins_a>; : N0 O/ y: j% A2 e port { dcmi_0: endpoint { remote-endpoint = <&ov5640_0>;8 z5 \! u- _/ ] ( |5 E/ E9 s+ x bus-width = <8>;7 L7 W+ e# D( P f% `- W7 U" e2 i& t hsync-active = <0>;, O7 W/ ]% U* Z: u1 x `# h( o" l4 F# ~ vsync-active = <0>;; L9 V5 d0 o- ]8 M * V. H. \+ g6 G! l2 ]* D" j pclk-sample = <1>; pclk-max-frequency = <77000000>;. y; e0 D: i/ U9 P4 ^* _ 9 p$ N% \( t* O5 C };# i, `# @, p5 g6 P! m- E* l0 `: q% Q };4 v* A, T" W. S# H0 D( z- y7 G: g };) b0 [9 m1 ~5 i& v0 w# S* O2 p 2.增加OV5640节点 修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,在I2C5节点中添加OV5640设备信息,红色字体为增加内容: &i2c5 {* A9 Y# Y* ]; G' M( S; ? pinctrl-names = "default", "sleep"; 5 @6 i& b" }% r* k( s! R+ K& ^ pinctrl-0 = <&i2c5_pins_a>;0 {/ F- T( R& o/ C3 r0 M9 c7 x …… - Z N# T8 k- I& @ E* U ov5640: camera@3c { compatible = "ovti,ov5640"; reg = <0x3c>; clocks = <&clk_ext_camera>; # G4 b2 m }! ^) D clock-names = "xclk"; 8 q# a, n# f/ n DOVDD-supply = <&v2v8>;( Y2 i; T- @6 Q9 G powerdown-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PUSH_PULL)>; . B1 S y4 A/ y$ s2 i% X reset-gpios = <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PUSH_PULL)>;: H% `) R/ N" I9 Y5 h$ A2 A, b rotation = <180>; & P6 m2 b0 P) ]; s! X status = "okay";9 u M$ `: W- n1 g port {) F0 l/ g+ ~( ]$ z" ^6 I; W ov5640_0: endpoint { * q- N! f: P1 y* x7 W- ?. j- V- j remote-endpoint = <&dcmi_0>; bus-width = <8>;" [* z7 u4 L4 y data-shift = <2>; /* lines 9:2 are used */ hsync-active = <0>; 0 q. ~3 y1 e) X6 o vsync-active = <0>;5 |0 }3 ?: D5 Z$ `% u+ z! P' W ' }" @7 Q! W$ z6 W pclk-sample = <1>;6 F6 _ w, V1 i2 R1 X pclk-max-frequency = <77000000>;6 N5 T) r4 ~0 F8 d; y9 v 4 T$ d3 [6 S3 s3 D4 T/ q) H }; };( s! |5 O) Z8 C" D" k- | };, Q7 K. [5 f7 h j# _. I , l& K3 _" E+ E# @; l# U }; / l J6 R( g* ~* F. D9 { B) q9 p 3.增加2.8V电源和24M时钟 修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点最后添加2.8V电源和24M时钟,红色字体为增加内容:# X9 l! `2 k& h% P' u$ N/ K9 @' ? 9 V% _& a; m0 R7 K' [' @) t, M Q! l. Y / { memory@c0000000 { device_type = "memory"; $ N$ s1 y$ w* j# q2 I reg = <0xc0000000 0x20000000>;: G# d2 S' O; g+ z; S$ _ + U. i' |0 t: f4 E2 X. k9 ~ }; ……- V) h& N1 K( X/ g 3 m: H0 V, q9 B+ v+ H1 G v2v8: regulator-2p8v {' j, h- g/ E4 ~! L5 @, w5 Q) o' Y * v, f! D$ `* [, y compatible = "regulator-fixed"; regulator-name = "v2v8"; 9 E) J5 _( Q% T# }4 A8 J. d regulator-min-microvolt = <2800000>;" l0 _& ]. _$ R/ x4 H regulator-max-microvolt = <2800000>; ( x- O- {. B5 n) S% C# U8 L3 w% N regulator-always-on; regulator-boot-on; 2 c( t( s2 U) ~# T! E5 { }; clocks {" x' A; `& o( O+ a3 p; {, Z# ? 7 m3 D0 Y' |' ^6 ^* t clk_ext_camera: clk-ext-camera {. C9 [0 L- a3 `) N% y# M2 i5 w2 M #clock-cells = <0>;3 C0 ^( p) O& I2 @ $ v6 P. ?9 Q8 @8 O _ compatible = "fixed-clock";. q. ~2 N% T8 V$ Y, n* H clock-frequency = <24000000>; }; }; }; ; |- {6 C' c, F: [ D" ]7 N 4.配置内核 配置内核支持ov5640,并列出主要选项,如下 linux@ubuntu make menuconfig9 R8 c- K5 j# \1 @( [# @& L/ j3 _6 Q: X Device Drivers --->+ ?, i! [& b* ?% X( C / L, }- F2 l( X2 v7 h ]) l <*> Multimedia support ---> V4L platform devices ---> ' G) I% J- U. q' F$ h- G <*> STM32 Digital Camera Memory Interface (DCMI) support6 w: T' z" |7 X3 Z$ |1 k I2C Encoders, decoders, sensors and other helper chips ---> <*> OmniVision OV5640 sensor support# C3 z! c* p- D y+ t w5 e/ X 5.编译内核及设备树linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC20000406.重启测试" m" u, G0 e0 `2 \6 L将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,系统启动后启动信息中包含如下信息:& A' m0 r/ O9 ~ 8 r5 k) V2 Q5 s) u3 f( x
在屏幕的界面上选择“Camera preview”应用进入摄像头预览程序,启动界面后即可看到摄像头实时采集的图像。
———————————————— 版权声明:华清远见IT开放实验室6 {5 {) |7 ]% H0 q, ` . R7 t8 | Y' N4 I6 o4 g 8 F+ y: o' H4 |9 a |
STM32MP157双A核Linux + 自研RTOS双系统镜像免费下载
扩展STM32微处理器,实现高性价比、低功耗和灵活性能
STM32MP1 自举程序编程:USB DFU/USART 协议全解析
兔哥心中的ST中文论坛
我心中的ST中文论坛
STM32 开发者指南:ST.com 全新 MCU 产品阵容视觉布局深度解析
深度拆解 STM32MP1 Boot 链路
STM32串口自动识别波特率的原理
STM32MP135 MP157 MP257 CoreMark移植&&跑分对比&&多核心负载不均衡问题排查与解决
STM32--STM32 微控制器详解
微信公众号
手机版