|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近,我收到了一个使用OK1028A-C输出pwm方波的需求.但是发现OK1028平台没有相关的说明,于是我着手写下了这篇文章。
: f4 _1 N/ k1 ~9 ]/ S" b1 N, D! b
& o0 _% o4 I4 U8 c {在查阅OK1028A-C原理图和《QorIQ LS1028A Reference Manual》后得知,LS1028默认有8个FlexTimer (FTM) ,每个FTM有8路pwm。) w1 y0 x" V8 i! m
7 p n( l! ^& W2 Q/ o+ _![]()
( |2 C4 q/ |* K0 Z) w! N
9 X y1 J) i: U5 l( I
/ m) ^* ~9 Z) ]$ i, \
! N! Q# D/ A2 h3 T/ o默认背光采用的是FTM1产生的pwm,我们使用FTM7做pwm测试。
( j2 Y1 k% l9 Q: E! C2 H. S9 O- u( g" L' ~$ p
如下图所示:( C2 J" ^" B& H, `4 [8 U
7 H( R7 A( b) R6 G5 L; s, }![]()
1 I- N I; O7 v; y3 _3 Q" ?; y0 {# U% E% \1 D# }. j8 L
' s8 C5 l9 H5 c L
9 o9 f; x& i3 |5 {5 V3 yLS1028 RCWSR12寄存器的12-14为I2C4的管脚复用。
' S, H5 ~5 d0 e0 J+ _4 x1 k6 t& c1 o. E
如下图所示:+ W: V K0 X+ b& g/ k
5 m& p1 |6 B; z9 v V2 n ! L- V* J4 Y, f0 F8 F& h& B: L
3 X: v7 P M( [, w0 L2 K7 j, Y2 B
3 `1 x. n8 v+ H3 K/ r; o, [
3 h& Q0 ?: `9 WI2C4管脚可以复用为六种管脚功能。OK1028A-C将管脚设置为can2 的rx 和tx ,在原理图《OK1028A-C_V1.1》中可以看到T6_CAN2_RX、U7_CAN2_TX。4 }1 L7 B. `7 }2 x+ [
D. O3 P" o% i) e3 x
我们可以通过修改rcw文件,将I2C4设置为pwm管脚。
+ r1 C" ]+ K+ F4 d6 ^6 V7 v+ U* e
OK1028A-C默认是支持pwm功能的,所以我们无需移植驱动,所做的工作只是修改pinmux和在设备树中增加pwm的相应设备节点即可。修改packages/firmware! Z3 J/ i7 n! b: A2 {
6 ?6 U3 U8 U, ~0 C" }3 g! ~. b {9 _9 M/rcw/ls1028ardb/RSQPP0x85bb/rcw1500gpu600.rcw中IIC4_PMUX的设置,将pin设置为pwm输出。
- k! O7 v5 e0 L
, C+ {8 C; V5 ?# }! y5 w将IIC4_PMUX=2修改为 IIC4_PMUX=4: D& Z9 F9 g9 Q1 w9 b# C9 G6 p! C
( V2 M, \0 \- g& O' B. i) [如下图所示:
+ g$ H6 y! g( v* c# C
. q+ G9 `" G# ~8 P& c2 e3 e7 X * D$ G2 @. |- E8 \
* n8 o0 ^# g, w o4 x
. _- S& J# Q O: j- t6 p: j- y0 B2 B! K6 @1 g6 h
完成上述设置后我们需要修改设备树代码,增加PWM配置。我们的修改的文件路径如下:
6 n5 [; a5 x5 \3 c+ k5 Z+ u' ] v( ^( T; a( p
packages/linux/linux/arch/ARM64/boot/dts/freescale/fsl-ls1028a.dtsi。% s5 D. ~! E0 e H
, A' Z4 M5 D/ ~! ?7 [, {( \然后添加pwm7设备
9 c8 D2 m( @% p" s4 p5 |
$ L& s; Q% R4 C1 kPwm7: pwm@2860000 {7 l. F8 S4 i0 P8 d4 b) n
- O, I. f$ d( V compatible = "fsl,ls1028a-ftm-pwm";
6 a6 q! D1 y. r0 U
* Q ], @" Y* X" n. H# ^* x3 r reg = <0x0 0x2860000 0x0 0x10000>;5 D+ B8 e W- H4 _! n1 ?
8 X, i! d3 F: V6 N2 J3 {8 y# l
#pwm-cells = <3>;- ~+ W J6 j \& r6 `& k& o
: l9 r( _( p3 p4 ~" A
clock-names = "ftm_sys";
2 G+ B* u5 k( ~7 w8 X6 S$ L% y3 n$ S+ b7 ^. v
clocks = <&ftm_sysclk>;: q9 j) C( Y/ N# Y& _
8 H/ w: _7 A' s3 |% t };
9 l9 c6 X6 l0 A" P2 S4 Y' ~
# `3 C! N: @% W1 u如下图所示:
1 N' ?/ A) _- q/ g" R7 x j2 E6 ]4 k Z, |) e. f% s
![]()
5 E0 o$ d% m' b. K2 e
; N- ^. @- Z. K8 m- @0 x- j5 x7 S! }9 L0 N7 \) ]
+ K, u" Y8 h, R7 E5 j0 h
▐ 启动OK1028A-C系统. C! M8 |8 d; ~5 H# H: ^* M
! m5 c$ t; V# _3 r) O& ]' u& Wroot@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备5 G$ g$ p' {) P/ k. c4 B# [
* g/ V5 V( D# a
如下图所示:- O* A% H) S! C7 p* l3 |3 N
+ r7 `5 `% z, l! T+ B6 R( Y
![]()
7 D/ M- t! H3 X$ N5 Y8 l+ r6 B( j- [- v& f% p9 l# p
/ S5 q+ Z$ H# B9 Y
9 k# C$ _2 r$ H O, A
我们现在打开了一个pwm控制器,可以看到FTM1支持8个通道,而背光使用的是pwm-1通道。将我们修改后的设备树文件和firmware编译,烧写到飞凌LS1028A-C开发板,启动系统。
, z/ e) K9 g" `. b: t# h
! C+ P+ L* \; ~7 n$ [root@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备。2 O1 p! L5 A( ?( h! Q- A7 v8 Q
; M* N( Z5 G! _4 k: I, R( r, f6 D( g
如下图所示:* q: J6 [( @' z M2 }
" E# w% J) s% q
( m. r$ e' \8 i
- f& j. i+ W7 t; T
% U; A7 G: K: b2 }* M! | r9 ?: R4 A% v0 b( [3 |
此时,虽然我们添加的pwm设备打开了,但和pwm0设备还是有差别的,新添加的pwm设备的每一路通道都没有设置周期和占空比。
$ T5 M$ _% k' x5 t; V0 p: k3 l5 M9 M; L- h2 e" @
所以下一步我们不需要再增加驱动代码,而是利用sys即可直接设置pwm参数。Pwmchip8是我们添加的pwm设备。5 {# l7 P, p3 {8 }# r, a
) }0 c0 N7 p0 L% D/ n
% t' t5 P8 H& t7 ^+ R* n' I
: n5 c9 A4 }6 l0 T8 k" \2 S1 F3 ?& f* l' E
) F1 B1 q& @; O3 b( G7 \6 H/ b8 P& H4 K▐ 使能使用的pwm通道* q% r+ p. r; T/ F/ [
3 I8 S* h& M5 S3 P8 u; Croot@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/export 初始化 pwm通道1 2 k, j- L% x4 M4 Z
1 }5 r4 c9 B4 W$ U! t4 d9 g0 w
root@forlinx:~#echo 2 > /sys/class/pwm/pwmchip8/export 初始化 pwm通道27 d, f9 [) |0 c. M( q+ ~
: \/ x, u6 I G3 H* J% Mroot@forlinx:~#cat /sys/kernel/debug/pwm命令查看我们当前的pwm设备: e1 ?' \& T$ r9 T9 ]
9 L. C1 H/ Y j. O8 P8 W
![]()
! G! G7 p5 C% {, F! B# g3 d% I& n, f X5 `8 L; x. g+ F
8 b1 {" b( l% G% K5 ]
. |2 ~& d0 [7 W( s- M. g$ z如果想取消相应pwm通道的话,可以使用“echo 1 > /sys/class/pwm/pwmchip8/unexport”
+ L) m4 Y( p9 U) Q/ V2 H3 ?# B, d) i0 t$ `& t9 B! p! u9 Q, u
“echo 2 > /sys/class/pwm/pwmchip8/unexport”命令。; o4 f: d: E9 E( N
) ?* U" X1 p$ D* Y& G因为我们每次只能使能一路pwm,所以先配置和打开pwm1。$ N0 Q7 }- Q! w+ p* e
# ?( C$ X$ `: _- ~
root@forlinx:~#echo 1000000 > /sys/class/pwm/pwmchip8/pwm1/period 配置pwm1 period为1000000,单位为ns,即1kHZ。
" u( V/ z C8 T/ V+ Z
' d0 J9 n, @6 b4 d! R5 c5 vroot@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm1/duty_cycle 配置 duty_cycle 为500000,一个周期中on的时间即占空比,单位为ns,占空比50%
6 |3 u X/ x$ U" x) P% I- B! e; z- C: o7 k
root@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/pwm1/enable 使能
- y# G" T1 f+ c) J) E0 b( W& n; j8 N. I3 a; B1 x5 U7 T$ L# x5 b' p
root@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm1/{enable,period,duty_cycle} 命令可以查看我们的pwm使能状态,周期,和占空比。! ^2 d& x4 F( v' n/ {/ A1 H
4 X! j/ l: Q. j1 Q* G* {' [如下图所示:( Z3 M( a/ a" F6 a( d7 _8 D- o
7 O! v& k w5 O) t
![]()
" y8 |7 f1 H ?2 n& H% q6 q8 J/ `4 |. N1 M
* r' P3 p; F/ x! T: u) h, u
! d, C8 ]" }1 u# i7 D9 [- g, ^▐ 用示波器测试T6_CAN2_RX产生1khz的方波
% L, |. U* o0 i- f* F% i2 O1 M
& N( F. Y/ `+ `% ^5 {( ]. j由于每次只能使能一路pwm,所以我们要使能pwm2,就需要先关闭pwm1。
. u/ E0 {, `+ V* @) t* S W; i
6 ?% Z7 c7 ^& O8 K; O# uroot@forlinx:~#echo 0 > /sys/class/pwm/pwmchip8/pwm1/enable
/ I- n- G1 O+ l# q+ G8 y/ j" A1 c! c2 c- o- |
root@forlinx:~#echo 1000000 > /sys/class/pwm/pwmchip8/pwm2/period 配置period为1000000
$ J7 ~4 c3 \* a! ?7 I! @* B; y
. [* p2 N0 q; u& ?2 u: c6 |root@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm2/duty_cycle 配置duty_cycle为500000。root@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/pwm2/enable 使能
5 ^& Y7 Z( `4 f" D6 O; Q8 R: \6 K! O$ o6 F3 p6 X0 Y
root@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm2/{enable,period,duty_cycle}1 s) ^4 D' D B) _: N' p$ V6 @
6 T" @) k5 r- E: P% g/ Q9 \% \% h- o![]()
0 q1 `- A! x! O* s
~& F. ?# C) v, F9 B: M8 T6 a% z+ r' ]. m7 a- {3 |
% p9 f, E7 ?) ~1 r▐ 用示波器测试U7_CAN2_TX产生1khz的方波4 H% a9 H2 L" x* ]- b0 H* f
9 f2 V( `9 m1 X在我们使用OK1028A-C时,由于管脚复用,很多功能模块的管脚没有引出,但是模块的驱动是支持的。这种情况下,我们只需要修改rcw相应的pinmux配置和设备树文件就可以使用相应的功能了。# S" Y" f( X* N% B
, [( q# |& I* x* j. X* J6 L3 ~3 ]- k
|
|