
1.实验原理9 A" s7 v2 _" k" I FS-MP1A开发板蓝牙采用AP6236,WIFI蓝牙二合一芯片。蓝牙部分通过usart3与SoC进行数据交互。 ![]() P* F. e7 {% w1 E$ E- I 蓝牙部分移需要配置usart3的设备树与AP_CK32KO管脚,可参考stm32mp157c-dk2.dts中的相关配置。 % n; R* [, t0 m6 J" u& v ![]() ![]() 查看原理图得出AP6236数据管脚与STM32MP157A的管脚对应关系如下:9 r8 `& _" ^' u) _ ] ![]() 1.蓝牙设备树节点0 o" L: G. E$ C# ^( x2 X& k 内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见: arch/arm/boot/dts/stm32mp151.dtsi/ _3 \- T- ~3 f4 H/ J stm32mp151中usart3定义如下:# t5 V9 w3 g' ?0 \+ @% ` 0 i- O, m! z5 J( ]% J# P usart3: serial@4000f000 {2 U) j& V# o* b2 \& C/ x compatible = "st,stm32h7-uart"; 9 _* W- K6 X0 R: `: w* i: I2 ` reg = <0x4000f000 0x400>;1 O e2 q0 v3 l! ], w! _; o' @ interrupts-extended = <&exti 28 IRQ_TYPE_LEVEL_HIGH>; clocks = <&rcc USART3_K>;" N: I% n$ ^. S3 o - d1 [8 P. w; @ resets = <&rcc USART3_R>;8 P- j3 E4 }+ G/ f! E, n wakeup-source; ; X( Z3 } y: S/ z+ O& g3 S power-domains = <&pd_core>;1 ~% w$ F( p. C1 ] dmas = <&dmamux1 45 0x400 0x5>,7 o9 y, A) s3 {% g7 W* p3 j0 L <&dmamux1 46 0x400 0x1>; 4 z8 J7 |3 `" W! x3 s dma-names = "rx", "tx";( U# y H' u6 \) a 2 T ]5 h' w2 G* K, A status = "disabled";' D; z, |5 u% e6 [9 L7 O. y }; - X/ k8 j. X! V/ N6 e' q 上述代码只对usart3做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。, g: `# d( k8 ^* E; O- I+ h r 8 A1 i5 c* n5 g- |" ?0 v7 k2 K! d 参考文档或stm32mp157c-dk2.dts对于usart2设备节点的描述,增加usart3内容如下: &usart3 {- l- G4 x( Y" B% D7 J! \ pinctrl-names = "default", "sleep", "idle"; - f1 \ r3 I6 O pinctrl-0 = <&usart3_pins_bt>;! s' H/ V; |& s ]! Y pinctrl-1 = <&usart3_idle_pins_bt>; pinctrl-2 = <&usart3_sleep_pins_bt>;' y; {- f+ x8 _% H uart-has-rtscts; ' N1 d& ^( U4 I" g! A3 R! ^5 e O status = "okay"; ( f M$ u/ M. ~2 V4 [" Q* k bluetooth { " s% b2 e& P& I# J shutdown-gpios = <&gpiod 13 GPIO_ACTIVE_HIGH>;, L# }4 r- e6 {/ ~ D & h( _; s3 W, c- a6 } compatible = "brcm,bcm43438-bt"; ; R5 g* a( d1 q9 x" H2 }* p max-speed = <3000000>;( Q# j/ A# [; J8 g. I4 V % z( x% \" a1 Q% V+ y vbat-supply = <&v3v3>;7 ~2 W/ Y7 T: {4 ^" ` ; Z# {: H( b$ x) N8 h5 O- V vddio-supply = <&v3v3>;$ ~4 o* X3 L1 Q* I% q 4 ^$ k. i' j2 [( b };) c9 t4 ^+ ^& l2 y 2 z9 J r" [- S+ X }; % ]+ c9 u) A0 o4 ~ 同时stm32mp15-pinctrl.dtsi对于usart3的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容: n4 e" C3 n' K# w6 x S9 w- ` * f1 T9 B, `0 a6 z* D: \7 j5 E usart3_pins_bt: usart3-bt-0 { x1 J7 F# V1 w4 |8 f$ t: | - H% l \5 i- q1 N* ]2 z# y pins1 {; K- m- C+ R+ o pinmux = <STM32_PINMUX('D', 8, AF7)>, /* USART3_TX */, }, z, E" m1 h5 h) D$ l, E <STM32_PINMUX('D', 12, AF7)>; /* USART3_RTS */ bias-disable;/ @) j( ~2 a$ z5 S( G/ ^; G; N3 S1 e drive-push-pull; slew-rate = <0>; " w+ |/ D# e3 P1 I, f5 h }; L6 U" v' I% L pins2 {, @2 U3 O7 }+ V: K) H. u 8 n6 p* c$ ~6 m( W9 g pinmux = <STM32_PINMUX('D', 9, AF7)>, /* USART3_RX */4 e5 R U9 \2 i3 c ) s( Y. J. ], G5 H- g% a5 x3 |* A <STM32_PINMUX('D', 11, AF7)>; /* USART3_CTS_NSS */7 d8 [# E+ T: C8 K3 p2 e! G bias-disable;8 z3 J) e! I- \0 d* v8 f ! |0 A$ h( D3 M7 [, Z };" O8 e! Q! b* M, N }; ' E" x/ S* W5 h5 V, F- q usart3_idle_pins_bt: usart3-idle-bt-0 {- J) J4 i B8 ^ . R$ `( |% Y; R pins1 { B6 m/ n _: v& m. j3 n pinmux = <STM32_PINMUX('D', 8, ANALOG)>, /* USART3_TX */ <STM32_PINMUX('D', 12, ANALOG)>, /* USART3_RTS */+ s) h# d- K* k7 g. C' V 8 c- G( ~; E9 l <STM32_PINMUX('D', 11, ANALOG)>; /* USART3_CTS_NSS */9 w& I4 @$ C7 Z# W7 U6 K6 F' c/ A };% I) R8 j' O$ @, a2 @4 t7 e& y * Z; ]: o- J! S9 J) | pins2 { 7 o$ |! P( g& w3 U+ r/ m; E0 C pinmux = <STM32_PINMUX('D', 9, AF7)>; /* USART3_RX */% n6 w! M4 J( t- d0 b5 | 3 R1 [* j" y$ j; T( v+ o4 ` bias-disable; # I& z; O1 Y( J# m& t3 x }; # B5 ^+ X# {/ M) B9 h7 O }; $ g5 l. w6 Z' M9 J usart3_sleep_pins_bt: usart3-sleep-bt-0 {' X6 @" P% z5 t; @$ L N pins {0 b: q8 m& T: Q7 W( V X2 L7 O3 T& M# O: Q pinmux = <STM32_PINMUX('D', 8, ANALOG)>, /* USART3_TX */3 Z7 P7 g$ L/ I3 c6 f8 v" b 8 n ~: i. @, B2 e$ V <STM32_PINMUX('D', 12, ANALOG)>, /* USART3_RTS */2 z4 \* ^' N g0 y <STM32_PINMUX('D', 11, ANALOG)>, /* USART3_CTS_NSS */ <STM32_PINMUX('D', 9, ANALOG)>; /* USART3_RX */ }; };2 x# N' F% ~( C) \0 ~! X- n: k+ } " C, ~: z/ B) i' e5 b5 z 2)RTC节点 AP6236需要使用一个外部输入的32.768KHz的时钟源,因此我们需要使能RTC的外部32.768KHz功能3 O* A t8 E V8 P : b! s# v! I- S4 }3 Y7 f7 [7 T 内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见: P# e2 Q5 s& P" u, k arch/arm/boot/dts/stm32mp151.dtsi stm32mp151中rtc定义如下: rtc: rtc@5c004000 {6 D) | B9 {+ K! I compatible = "st,stm32mp1-rtc"; 9 v U& |& d; |8 G4 k! R reg = <0x5c004000 0x400>; clocks = <&scmi0_clk CK_SCMI0_RTCAPB>, " E: K' Z! X0 n9 M1 j <&scmi0_clk CK_SCMI0_RTC>; {- |# `0 M- Y1 k2 H 2 ~6 K6 r7 g* y y* f clock-names = "pclk", "rtc_ck";; ?1 ?( U7 Z$ V% K# M# S+ \2 l interrupts-extended = <&exti 19 IRQ_TYPE_LEVEL_HIGH>;1 L3 w# D8 z& T. u# { ( _# B# G1 Y2 H status = "disabled";, ?0 M) F Y/ u& h };1 x! |! X- B( a / n$ e5 V4 Z" o$ f# f, Z% W 上述代码只对rtc做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。 参考stm32mp157f-dk2.dts对于rtc设备节点的描述,需增加内容如下:8 _* l+ b+ `1 q1 M1 W+ P rtc { : D3 w% a( T5 `$ A; R st,lsco = <RTC_OUT2_RMP>;1 R2 D8 K& h4 [9 V# ~2 ` 6 c& @# Q* A! j. k$ \- {" ? pinctrl-0 = <&rtc_out2_rmp_pins_a>; $ h# e% `7 h3 A, @5 _7 i pinctrl-names = "default";% V+ N7 u) t% U" y( ]8 e: W status = "okay"; G8 s; z: d0 \' V/ U+ z# N8 M }; 2.实验目的+ c$ Y' |( T$ u1 [ 熟悉基于Linux操作系统下的蓝牙设备驱动移植配置过程。 3.实验平台/ |3 J& A5 T9 q3 Q 华清远见开发环境,FS-MP1A平台;2 e9 n" z0 l/ ^ 4.实验步骤$ S! |+ v" n+ ~: b% } 1.开启32.768KHz时钟: X/ F1 |8 i) C& Y9 i7 v9 m 修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件中的rtc节点添加如下内容: c- ^/ k, G6 a7 A: O rtc { st,lsco = <RTC_OUT2_RMP>; 7 m) f/ V/ c. ?1 ^- b pinctrl-0 = <&rtc_out2_rmp_pins_a>;; h4 M, e( ]# K pinctrl-names = "default"; status = "okay";7 O- Y; H6 _; w; ~. i; y8 Z- d! y }; ; u6 t9 m" U! D, k# V3 S; n 其中红色字体部分为要添加的内容。; v/ ?/ i: O, E+ t/ e 添加rtc相关头文件。: K. o- P9 d$ c) X! O 1 G8 C$ N" K& D0 R; i #include <dt-bindings/rtc/rtc-stm32.h>! c/ R7 Y) f5 J. J0 D* V: B 2.添加usart3配置 修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容: 4 Y s @! P! k: e9 v+ S &usart3 { 4 y4 |. i' H$ e0 W5 | pinctrl-names = "default", "sleep", "idle";7 I3 n" T9 f6 j4 i% ] K8 w* l pinctrl-0 = <&usart3_pins_bt>;( X% `2 q J) Y' P pinctrl-1 = <&usart3_idle_pins_bt>;& \% t' v1 [# O pinctrl-2 = <&usart3_sleep_pins_bt>;3 ?3 n$ v, A8 X& i . \' I0 Z$ M7 J2 K; Q7 F" d% I' | uart-has-rtscts; status = "okay";! [5 z8 \+ `9 y( M bluetooth { shutdown-gpios = <&gpiod 13 GPIO_ACTIVE_HIGH>;, m# ]8 E. W0 h ) |7 [; ^& `, a# O! v1 T compatible = "brcm,bcm43438-bt";& V! o6 M& P; F5 s2 C# O max-speed = <3000000>;# P9 W7 ~2 J5 ~4 J8 \! s vbat-supply = <&v3v3>;7 \9 E8 K0 s7 v4 i4 k7 f * I) m6 n3 Y3 P3 G vddio-supply = <&v3v3>; };: r" a4 U4 R9 ?/ y 4 r( N" f) M5 G/ F) t3 t }; ! \. G; K& E0 D% S, s 3.添加功能管脚配置* k2 x( h/ f: a! z0 u 要添加管脚配置需要有pinctrl节点,如果之前已经做了MIPI LCD移植或者RGB LCD则在arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件下找到pinctrl节点添加如下配置,如果之前没有做MIPI LCD移植或者RGB LCD那么需要新建一个pinctrl节点,然后添加如下配置。 &pinctrl {4 [+ A" m5 w, ?, Y) p 4 ?; b) i& P6 O- V+ ?, ^# \ ... ...# |" j. j' v) n7 n& `, Z usart3_pins_bt: usart3-bt-0 { pins1 { pinmux = <STM32_PINMUX('D', 8, AF7)>, /* USART3_TX */" o/ _% y; }& r) D* k( ^ <STM32_PINMUX('D', 12, AF7)>; /* USART3_RTS */. d# f& _7 g, A' v7 Y bias-disable;+ M8 n& [5 ^! L$ X3 a4 B# ? drive-push-pull; 0 v" a* U ^0 n' s. \ slew-rate = <0>;! G/ H7 z' E3 \% Y- k `* n- T, x! f* ]+ @- i( L7 j9 ] };! n% u- o/ y0 H# f' a5 ` 0 V% _4 @! ?- B/ X' f& v% h pins2 {( l3 v4 N' W2 u7 c" [ pinmux = <STM32_PINMUX('D', 9, AF7)>, /* USART3_RX */ 3 j: S4 Z8 z* c <STM32_PINMUX('D', 11, AF7)>; /* USART3_CTS_NSS */ bias-disable; / S9 N9 _( r1 e }; * A4 y5 K1 B5 m1 R) q9 n8 t" H }; : r+ R; R" X' K* q+ X usart3_idle_pins_bt: usart3-idle-bt-0 {( s: M" B2 M2 V! H5 b. E : I+ ?7 u. v' B pins1 { ) Q3 q4 v+ L# _4 F$ g3 h2 Q pinmux = <STM32_PINMUX('D', 8, ANALOG)>, /* USART3_TX */ - _$ \8 ~" f1 L% s5 a* z g <STM32_PINMUX('D', 12, ANALOG)>, /* USART3_RTS */ <STM32_PINMUX('D', 11, ANALOG)>; /* USART3_CTS_NSS */ }; $ Q# E# `3 Z1 h pins2 { pinmux = <STM32_PINMUX('D', 9, AF7)>; /* USART3_RX */ 9 _- g X+ V5 s' U bias-disable; ' b" i4 U# `5 n# L3 O };% h6 I0 J2 J9 {& h" p , y) A; d* B* C4 z };4 Z9 w/ x+ r N* L usart3_sleep_pins_bt: usart3-sleep-bt-0 {; H) a! A9 g9 ]2 N+ P% m& T 5 {6 r4 R( N0 k! V pins { pinmux = <STM32_PINMUX('D', 8, ANALOG)>, /* USART3_TX */ 8 J% ?; P! k, q; o9 J8 b a9 |$ G <STM32_PINMUX('D', 12, ANALOG)>, /* USART3_RTS */ 5 Z% }4 _/ W' e& x; O; H! P <STM32_PINMUX('D', 11, ANALOG)>, /* USART3_CTS_NSS */ * ~: y% ]0 ?1 ^9 y <STM32_PINMUX('D', 9, ANALOG)>; /* USART3_RX */ }; };/ g, [$ l, Y* V9 _. \) b: _ ... ... * u. L6 i, ^6 @) C; M }; ; \- P1 F+ j/ P 4.修改串口名称映射关系 修改arch/arm/dts/stm32mp157a-fsmp1a.dts文件,在aliases节点中添加如下内容: 5 u- l! h/ r" N& ~7 M- U aliases { / w# S* X V$ @. ]" F serial0 = &uart4;# c( z' n6 D- u9 P4 ^' j5 m # ?' f, n. b8 S serial5 = &usart3;) D# R+ j! T% A6 E4 Z };7 j% G4 T: D7 |: Q 其中红色字体部分为要添加的内容。0 R$ o- t: s, N + j" p% Q" W+ J! }) t 5.配置内核% ^( K- P9 s, F+ r# s 由于内核源码默认配置以及支持AP62xx,本节列出主要选项,如下: linux@ubuntu ![]() & G2 U. m2 a$ Q. d" Q8 A& } Device Drivers --->3 t$ n- a3 R1 ^4 f* E+ n % S# m$ G3 H8 q* p! V <*> Broadcom specific AMBA --->! s# w+ t5 {" E& [ Support for BCMA in a SoC, p; E8 b* f) w2 _: D8 H) ~* V! } ChipCommon-attached serial flash support1 a* D0 U4 r4 R3 v6 L BCMA Broadcom GBIT MAC COMMON core driver5 v5 I) @0 b: K$ `4 E4 u BCMA GPIO driver 6)编译内核及设备树6 Q2 \1 g4 J5 C: j linux@ubuntu ![]() 7)重启测试$ A) q# a% R& p7 c 将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,系统启动后查看/lib/firmware/brcm目录下是否包含BCM.hcd固件,如果没有发现这个文件可从【华清远见-FS-MP1A开发资料\02-程序源码\04-Linux系统移植\04-移植相关文件\02-Linux内核移植\AP6236固件】下拷贝到/lib/firmware/brcm目录下。 V4 Z' y- M+ p: X% j# G. A 开启蓝牙设备 root@fsmp1a:# hciconfig hci0 up ( z' @* M& h+ M# _8 v% v 查看设备地址5 o8 j/ q5 J9 a root@fsmp1a:# hcitool dev 扫描蓝牙设备- H6 i0 }2 t) z P F( {# a- h2 q+ X8 l! p! K( L root@fsmp1a:# hcitool scan : \3 k; A. ]( Y; M- J ![]() 9 f1 ]$ z3 |: G, a- H/ v% J+ ?0 k ————————————————$ [: s" q1 m' Z- H7 Y* u 版权声明:华清远见IT开放实验室 |
基于STM32MP1和STM32MP2在嵌入式Linux平台上部署有效的安全保护机制
利用STM32MP1和STM32MP2为嵌入式Linux提供有效的安全措施:供当今决策者参考的3条宝贵经验
STM32MP1 WiFi连接
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【STM32MPU 安全启动】 TF-A BL2 TrustedBoot原理学习
《STM32MPU安全启动》学**结
《STM32MPU安全启动》学习笔记之optee 如何加载CORTEX-M核和使能校验
《STM32MPU安全启动》学习笔记之TF-A BL2校验optee和uboot的流程以及如何使能
《STM32MPU 安全启动》课程学习心得+开启一扇通往嵌入式系统安全领域深处的大门。
《STM32MPU安全启动》 课程学习心得