STMCU小助手
发布时间:2022-9-29 18:26
|
1.实验原理1 D% s1 w. _, J% m6 L4 I+ I FS-MP1A开发板蓝牙采用AP6236,WIFI蓝牙二合一芯片。蓝牙部分通过usart3与SoC进行数据交互。- o, F8 i, ^4 W$ Z6 U# W. |4 p 8 h' [6 o* E3 u( j
蓝牙部分移需要配置usart3的设备树与AP_CK32KO管脚,可参考stm32mp157c-dk2.dts中的相关配置。 : Z: R# c! ~" d
/ B- W* [) {$ ~1 q5 U 查看原理图得出AP6236数据管脚与STM32MP157A的管脚对应关系如下:3 y. C1 p2 f, ~0 H* G7 j. N
+ `5 P& o F& v 1.蓝牙设备树节点 & }% `% j) ?# q 内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见: ) J8 @4 L2 e4 t) X( y5 t% B arch/arm/boot/dts/stm32mp151.dtsi ' X& |6 Q, f+ d; J stm32mp151中usart3定义如下: O% s9 ?0 Z9 l # s$ p2 m+ V4 P2 e) n usart3: serial@4000f000 {2 E9 w! _+ w% q, D# ^# T$ s! ~0 Z 0 f0 }9 _9 r0 |6 P) w% z compatible = "st,stm32h7-uart"; $ ]$ s- g& L+ T4 V4 L reg = <0x4000f000 0x400>;9 G. \3 I4 k5 @ ( G8 Q, [% s" \& e0 z8 L% f( g interrupts-extended = <&exti 28 IRQ_TYPE_LEVEL_HIGH>; 6 h/ a! d; [5 G6 @, Y2 T clocks = <&rcc USART3_K>;- I; g- s* p K " J+ O( Q$ z0 ^, d9 x resets = <&rcc USART3_R>;# m# ]2 h$ {8 i2 n( X 7 z/ f! J1 g" y& W! n8 ^' k) X wakeup-source;2 U3 [* n, E' E " Z( v( v8 i" N1 C7 f1 } power-domains = <&pd_core>; dmas = <&dmamux1 45 0x400 0x5>, # O7 c/ _: k$ W4 K/ G$ c9 X. I <&dmamux1 46 0x400 0x1>; 5 Z- h2 N/ L- {' h1 y" b dma-names = "rx", "tx";' ?: v4 t7 U, E status = "disabled"; 8 y) ~) ?0 t/ c) U) j% K$ {: g1 _ }; 1 a/ g" C/ ~, ?, w; f0 Z 上述代码只对usart3做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。( R* k9 ~7 @- ?% }/ y( b% Q8 R6 x2 Y 参考文档或stm32mp157c-dk2.dts对于usart2设备节点的描述,增加usart3内容如下: &usart3 { pinctrl-names = "default", "sleep", "idle";; E8 a B) [! m$ D3 a8 B pinctrl-0 = <&usart3_pins_bt>; pinctrl-1 = <&usart3_idle_pins_bt>;2 l7 @( l& p7 `5 E/ c, V) v pinctrl-2 = <&usart3_sleep_pins_bt>;5 @( v8 v% z# ^) d2 @, j/ b $ P! Z4 B# | _- q+ v uart-has-rtscts;8 G7 F3 v# e' V- R/ y- ~& j% a status = "okay";" Y9 P" u6 p& p& N! V$ z 2 @6 v6 Y+ N% g4 m! S bluetooth {( p9 |/ [" A; o6 h0 y" B5 C 9 T$ k4 F/ t6 I! G shutdown-gpios = <&gpiod 13 GPIO_ACTIVE_HIGH>; " }% h- e; S( T1 }) u compatible = "brcm,bcm43438-bt"; 8 C" g6 m I7 \% m max-speed = <3000000>; ! N0 w! d. t) t: u* Q vbat-supply = <&v3v3>; 0 }% a; }5 O l, B vddio-supply = <&v3v3>; 2 s* G, F4 O6 G }; }; $ y& \% n8 O+ L/ I 同时stm32mp15-pinctrl.dtsi对于usart3的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容: usart3_pins_bt: usart3-bt-0 { pins1 { 8 l: Y% p% c: D: u% _/ \ pinmux = <STM32_PINMUX('D', 8, AF7)>, /* USART3_TX */8 [" c& t! x; z4 I + |. A0 {! O r1 o" L( z( N <STM32_PINMUX('D', 12, AF7)>; /* USART3_RTS */ # C% T! Z9 O5 w0 A6 W bias-disable; 9 i- }2 L ~9 m u% R# ~0 _ drive-push-pull;9 c4 D) r0 v7 K( b- ~ slew-rate = <0>; . L' t7 v. h4 O) X9 ~2 K1 H, _* H }; + o+ ^7 T: M4 @, i9 X0 f; ~ pins2 { pinmux = <STM32_PINMUX('D', 9, AF7)>, /* USART3_RX */ + Z5 ^9 y" [2 d/ Z <STM32_PINMUX('D', 11, AF7)>; /* USART3_CTS_NSS */2 y r' A+ R e- ^8 d1 A bias-disable; , v- |$ H" }- M r- N9 z };7 }4 ?( x; x4 Z: X/ D `1 e };5 v! w$ B ?) a. t/ }2 m usart3_idle_pins_bt: usart3-idle-bt-0 { $ f/ \& m! {( A+ y! T; b pins1 {. T' t/ A6 w" f# J% O* _ pinmux = <STM32_PINMUX('D', 8, ANALOG)>, /* USART3_TX */! y+ k3 Y* z6 a5 z% ~' C <STM32_PINMUX('D', 12, ANALOG)>, /* USART3_RTS */4 y( q. n3 M. ^ e/ n; k <STM32_PINMUX('D', 11, ANALOG)>; /* USART3_CTS_NSS */ }; pins2 {* S0 c4 j! }- G/ @' v9 O' h 6 w0 E8 C1 W: E& @& D pinmux = <STM32_PINMUX('D', 9, AF7)>; /* USART3_RX */* y* }, D3 h! } bias-disable; }; # q+ a( W( L; v, E7 N1 [ }; usart3_sleep_pins_bt: usart3-sleep-bt-0 { 4 Z% O0 l) n& t7 ~ L( _( y _2 Y pins {; _$ K# S* D& J8 Q pinmux = <STM32_PINMUX('D', 8, ANALOG)>, /* USART3_TX */ - q9 J: A' X% b k" M6 \+ I <STM32_PINMUX('D', 12, ANALOG)>, /* USART3_RTS */ <STM32_PINMUX('D', 11, ANALOG)>, /* USART3_CTS_NSS */# {. @9 D# k9 z9 l, Q. T7 i8 ? <STM32_PINMUX('D', 9, ANALOG)>; /* USART3_RX */ ' g1 @+ u" g; p8 x* B. H };$ c1 k' I$ @1 u) W }; X. {) Z# u0 \- `5 Q' i; ~ 2)RTC节点- q- [, y/ z* @8 W' K6 c" U AP6236需要使用一个外部输入的32.768KHz的时钟源,因此我们需要使能RTC的外部32.768KHz功能7 X4 |* {9 z; ] 内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见: arch/arm/boot/dts/stm32mp151.dtsi( c* X7 P8 u* t* V& Z stm32mp151中rtc定义如下: ( Q9 O: e$ `# |0 I( [2 g; s rtc: rtc@5c004000 { compatible = "st,stm32mp1-rtc"; reg = <0x5c004000 0x400>; clocks = <&scmi0_clk CK_SCMI0_RTCAPB>, 0 S. ~1 l1 l% v <&scmi0_clk CK_SCMI0_RTC>; clock-names = "pclk", "rtc_ck";; z+ H6 k) \+ W G 4 @% M$ M) ?+ F" C3 Z interrupts-extended = <&exti 19 IRQ_TYPE_LEVEL_HIGH>; 3 V3 F/ P- b' B/ [ ^ status = "disabled"; & P! D' G0 V# m" e }; 上述代码只对rtc做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。0 K: l6 F7 v4 g3 h; F 参考stm32mp157f-dk2.dts对于rtc设备节点的描述,需增加内容如下:" x* s/ s5 M$ h. E9 z5 x# u, H: n. D - |; P: n) y- [3 l rtc { 1 D2 c Y/ p% D$ M( } st,lsco = <RTC_OUT2_RMP>; ( E. c, V: r' i8 Z1 N pinctrl-0 = <&rtc_out2_rmp_pins_a>; ( [# ~5 t9 F& @ X4 Z pinctrl-names = "default"; 0 `, X; k+ C: s/ S: _4 R) ] status = "okay"; }; 5 V$ T7 A |8 O: M4 r 2.实验目的* E# E0 W5 u6 i- S- {& l; \ 熟悉基于Linux操作系统下的蓝牙设备驱动移植配置过程。, y* J+ \2 v: t" l9 `0 K* ]# z 4 v g# W; r( G9 W. r 3.实验平台# O% J8 ^: `$ \" v7 Q/ j 华清远见开发环境,FS-MP1A平台;3 _: a! d9 S% w- t8 n C; ^0 G9 C# I3 a 4.实验步骤 0 n, ?* X" p0 X6 {- u0 Z5 ?: [ 1.开启32.768KHz时钟 修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件中的rtc节点添加如下内容: rtc {/ M h- n$ c& v* j 1 l) K$ `' `- U: U! b) }" D( U st,lsco = <RTC_OUT2_RMP>;. G- e+ y7 U: i ^7 ?7 \0 N m5 v ; B$ y: `2 L2 c+ V0 d1 p pinctrl-0 = <&rtc_out2_rmp_pins_a>; pinctrl-names = "default"; 5 N, i: z8 d' l* V2 [ status = "okay"; }; * U" J3 \8 M( b 其中红色字体部分为要添加的内容。 添加rtc相关头文件。 #include <dt-bindings/rtc/rtc-stm32.h>( [, A7 q) w( f' I7 K* a; a& E# T 2.添加usart3配置 修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容:; I. j& \' p# B2 R1 S0 I' {( E &usart3 {8 v# [& ~# v1 q, M7 u' { pinctrl-names = "default", "sleep", "idle"; pinctrl-0 = <&usart3_pins_bt>;7 r! v' z b5 [6 d$ |- M& i0 d pinctrl-1 = <&usart3_idle_pins_bt>; * q) {6 I0 ?4 `( [5 F, c7 z6 o pinctrl-2 = <&usart3_sleep_pins_bt>;% k0 Y0 b8 p* l" M% k6 J' P. b5 E + }2 J$ M3 Z# r" B6 i2 b- d uart-has-rtscts; status = "okay";* P3 f H8 T8 g$ x, \5 @. f0 z5 v bluetooth {6 q0 n0 [* }) y3 }# @/ a shutdown-gpios = <&gpiod 13 GPIO_ACTIVE_HIGH>; compatible = "brcm,bcm43438-bt"; max-speed = <3000000>; vbat-supply = <&v3v3>; ' F; V: c( q+ c6 l; L! D vddio-supply = <&v3v3>; }; }; : P K( {- G8 ?( c 3.添加功能管脚配置9 f& y9 O/ o" Q0 f 要添加管脚配置需要有pinctrl节点,如果之前已经做了MIPI LCD移植或者RGB LCD则在arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件下找到pinctrl节点添加如下配置,如果之前没有做MIPI LCD移植或者RGB LCD那么需要新建一个pinctrl节点,然后添加如下配置。8 R% S# G$ P: s ; u2 L7 I! e( x4 D \ &pinctrl { 2 F) d: a% n4 U/ ^( f ... ...2 }" z. v' g1 t. `2 U6 Y/ R 0 \# a5 B1 N' W" D3 o K usart3_pins_bt: usart3-bt-0 {* \, f" v2 a8 ~$ g: t" R5 U & @& U1 Y9 j. X; S pins1 { pinmux = <STM32_PINMUX('D', 8, AF7)>, /* USART3_TX */ <STM32_PINMUX('D', 12, AF7)>; /* USART3_RTS */ bias-disable; drive-push-pull; slew-rate = <0>;; v' h1 ?8 C `1 @ B2 V; g. y" J) K, R5 B };, [# I. Z: g x) u0 u& Y pins2 {! e0 L7 ~% b$ W* M, L: K+ [ pinmux = <STM32_PINMUX('D', 9, AF7)>, /* USART3_RX */ <STM32_PINMUX('D', 11, AF7)>; /* USART3_CTS_NSS */ $ @* @2 K3 _% T& `* l9 A bias-disable; }; }; - w; `/ L. a" Y4 a6 |9 t usart3_idle_pins_bt: usart3-idle-bt-0 { : L* w, v5 ^* ~8 U pins1 {8 m3 G7 D% v; U$ l T& p6 d; [' S' R0 b0 C pinmux = <STM32_PINMUX('D', 8, ANALOG)>, /* USART3_TX */, L' j2 Q c. ?4 a5 a <STM32_PINMUX('D', 12, ANALOG)>, /* USART3_RTS */ <STM32_PINMUX('D', 11, ANALOG)>; /* USART3_CTS_NSS */& \, y) f z/ l) o * ?" b6 p: b; y };& f2 ?# [" H2 E; F/ q2 w pins2 { pinmux = <STM32_PINMUX('D', 9, AF7)>; /* USART3_RX */ 9 O9 {8 \" z0 N1 H7 J bias-disable;: R) S. h4 i2 W& B! c; h5 t 1 n Q" Z+ g5 ~0 i2 {4 V };4 j& |7 L6 A6 P2 O+ z0 W ! K- P' E! {+ K7 s) @1 s. @ }; usart3_sleep_pins_bt: usart3-sleep-bt-0 { g( K, K! L4 D0 R% _- `2 E3 d pins {$ j) r, p, ^6 e3 z: J; p- Q2 _ 7 E# D9 T0 M3 s/ V- r pinmux = <STM32_PINMUX('D', 8, ANALOG)>, /* USART3_TX */ <STM32_PINMUX('D', 12, ANALOG)>, /* USART3_RTS */ <STM32_PINMUX('D', 11, ANALOG)>, /* USART3_CTS_NSS */ ) q5 L. I3 v8 u! ` <STM32_PINMUX('D', 9, ANALOG)>; /* USART3_RX */; c; e$ b" I$ p ' c$ P& f. M6 n( s% E8 r# n+ c( c };! H. j" C$ P0 d. h7 ]5 s };2 O4 U0 I; J9 b& S C 2 _9 t# z8 T: R9 D; |4 J ... .../ \+ V+ Z8 |6 P, b( J) _ 2 S9 W+ ]+ j0 ~5 G }; 4.修改串口名称映射关系! H" S \/ }4 B5 A$ w" ?5 @ 修改arch/arm/dts/stm32mp157a-fsmp1a.dts文件,在aliases节点中添加如下内容: & a# W% l+ |1 G. m aliases {4 `) \! Q" |3 l* d% T* o6 M5 W- f+ B7 [ serial0 = &uart4; serial5 = &usart3; }; 其中红色字体部分为要添加的内容。/ m. {) p& _4 ]2 z 5.配置内核 由于内核源码默认配置以及支持AP62xx,本节列出主要选项,如下:6 P3 F% o4 N1 ~. o7 B 9 `% K6 d ^ v2 H3 v linux@ubuntu make menuconfig: m0 |3 y K; Y3 W1 |Device Drivers ---> <*> Broadcom specific AMBA ---> Support for BCMA in a SoC ChipCommon-attached serial flash support BCMA Broadcom GBIT MAC COMMON core driver BCMA GPIO driver , h$ O" A* }" j5 I( f9 _ 6)编译内核及设备树 n/ p7 [1 p3 f& z6 b' t' V 8 O6 P- O" N- [ linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC20000407)重启测试( s3 w6 {4 j! P 将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,系统启动后查看/lib/firmware/brcm目录下是否包含BCM.hcd固件,如果没有发现这个文件可从【华清远见-FS-MP1A开发资料\02-程序源码\04-Linux系统移植\04-移植相关文件\02-Linux内核移植\AP6236固件】下拷贝到/lib/firmware/brcm目录下。# S1 G) A4 Z) W, t& t 开启蓝牙设备 " w2 f- H3 r9 ]& [- \1 j, q root@fsmp1a:# hciconfig hci0 up 6 n: B& k) A8 X7 Y 查看设备地址- s% C( \% Q6 d3 z root@fsmp1a:# hcitool dev + E. ~) K" X7 M8 _, `/ y 扫描蓝牙设备- n& }$ a+ P r2 v9 a) Q: J9 ~ 6 c8 a' u w/ ^ Y" @( P- x root@fsmp1a:# hcitool scan, A2 q! S1 p8 t% b' | 0 ^$ t' }- }" q B0 h. o- P9 T
———————————————— 版权声明:华清远见IT开放实验室) O2 c" F" m g 9 j8 e- [7 m$ N" o; D# _% `1 f |
STM32MP157双A核Linux + 自研RTOS双系统镜像免费下载
扩展STM32微处理器,实现高性价比、低功耗和灵活性能
STM32MP1 自举程序编程:USB DFU/USART 协议全解析
兔哥心中的ST中文论坛
我心中的ST中文论坛
STM32 开发者指南:ST.com 全新 MCU 产品阵容视觉布局深度解析
深度拆解 STM32MP1 Boot 链路
STM32串口自动识别波特率的原理
STM32MP135 MP157 MP257 CoreMark移植&&跑分对比&&多核心负载不均衡问题排查与解决
STM32--STM32 微控制器详解
微信公众号
手机版