|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近,我收到了一个使用OK1028A-C输出pwm方波的需求.但是发现OK1028平台没有相关的说明,于是我着手写下了这篇文章。! D9 |9 u6 g5 p' |* i" a0 J" d0 H9 X
) b5 M2 Y/ j7 g2 R( i
在查阅OK1028A-C原理图和《QorIQ LS1028A Reference Manual》后得知,LS1028默认有8个FlexTimer (FTM) ,每个FTM有8路pwm。$ Y8 p8 Z3 I3 s0 q: v: q+ @, Y
3 V @: C$ w* o/ W
![]()
9 N/ D8 C' W4 G$ Z+ i! D
[1 O# `. z$ q8 g4 l( {9 d8 |* G& _' B' {9 m. T- G
; l6 r& X" I3 i4 Z0 |0 w1 w4 I默认背光采用的是FTM1产生的pwm,我们使用FTM7做pwm测试。
1 ]+ ~* P. x, o/ L7 a% @$ z& z C: f+ u [5 F9 W
如下图所示:2 a7 `& j" a! H% k9 ?
2 N. |" \& P& X) T$ E8 |' c- H
# s8 |0 d# l% f9 v2 f: I- x/ l
" X; }+ a4 u+ z6 L0 R) k+ ~
+ B( l$ {* \7 i" `5 q3 P8 b0 k, _5 p6 S! d; k. T, b% r5 f0 q
LS1028 RCWSR12寄存器的12-14为I2C4的管脚复用。
" X r& f( v0 c: o2 l$ z
& k2 @$ H3 c9 M+ D n$ f4 d如下图所示:, ]& T) _- F3 G" F( p0 s
" H* o2 n( ?0 ^6 t6 e9 c1 _
. J3 ~; a' ?! u6 X, C7 S
5 g' B0 S1 [: ?$ v
! X S7 V7 U, m/ G, I1 c
7 x8 e r' X# |3 R& r5 w$ x- c4 g* ~I2C4管脚可以复用为六种管脚功能。OK1028A-C将管脚设置为can2 的rx 和tx ,在原理图《OK1028A-C_V1.1》中可以看到T6_CAN2_RX、U7_CAN2_TX。 L0 T* F. }& W2 U# ? V( Y
& A( b R5 j, Q1 O% O' u我们可以通过修改rcw文件,将I2C4设置为pwm管脚。
- v( I o& J# x" L5 f* u+ ^) ]# b0 A' X4 P2 b0 i5 I; ^
OK1028A-C默认是支持pwm功能的,所以我们无需移植驱动,所做的工作只是修改pinmux和在设备树中增加pwm的相应设备节点即可。修改packages/firmware
" O7 H' }6 w {/ A i- r+ n# d# L4 p( L% i* i0 U+ r& g
/rcw/ls1028ardb/RSQPP0x85bb/rcw1500gpu600.rcw中IIC4_PMUX的设置,将pin设置为pwm输出。
- v, ?& g9 y/ o7 H5 h' f- S
7 h1 d, t' b% j) ]5 L9 d, c) L将IIC4_PMUX=2修改为 IIC4_PMUX=4
4 s, v5 `* v: |7 r) K) `6 J2 u! X9 Y0 {
如下图所示:
4 R9 g: F1 F' B9 I
/ B/ v, B8 F3 O! j, A( o) [![]()
) j5 I( ?. L; H0 s9 y0 S ^/ ]( @/ i& X6 V
" R \! s; k( r4 [3 P* d
+ Y* j( @ N( g, C) }8 p完成上述设置后我们需要修改设备树代码,增加PWM配置。我们的修改的文件路径如下:5 s. f4 H4 i$ F) J8 W
& Y2 ], m# |& l3 n& }
packages/linux/linux/arch/ARM64/boot/dts/freescale/fsl-ls1028a.dtsi。
. V S2 B1 U7 E$ u2 Z( L% J! }
. W2 s7 A& f0 b6 Y, c' S然后添加pwm7设备
$ V) I$ @0 l2 C# f! y& A/ D7 b8 d1 _; i( j+ v% |8 V- [6 `8 d( E
Pwm7: pwm@2860000 {" P2 r* V6 u9 V9 s" V/ j
* k; K% r4 x7 R$ R" \9 j
compatible = "fsl,ls1028a-ftm-pwm";
& O5 I( d9 e+ q2 T4 Z: O
& R: ?2 v' g" e5 \6 T x3 T. c- z reg = <0x0 0x2860000 0x0 0x10000>;; U# |: P) j$ ~) ~+ L; ]
. M1 c1 C$ U8 [
#pwm-cells = <3>;( {0 d- h% G3 v
- Y. t; |8 T w/ B
clock-names = "ftm_sys";) L4 o9 Q! I: L* e Y6 w
- H; f# ?& b. O% F/ U clocks = <&ftm_sysclk>;2 n! h; O) P+ H* L: X
. P% H6 M! L5 z6 I2 J };& D: o( i8 M% Y4 O9 i
9 Z* S. ?2 W) K
如下图所示:. E: d' B& x2 I
5 ]4 c7 v! N& l( o9 K" m% F + h* e. z/ e' b* D; Q0 h: I
& k3 b. I' u$ {3 U7 O* s: E! K2 \7 ], m4 p4 W+ k0 |. Q
) W, q0 P* c/ k
▐ 启动OK1028A-C系统
/ x( ~: L; n! \; a9 ^& w
2 X$ Z; @9 r4 z& Y) C. M$ R. g( eroot@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备
; Z( _% r- X$ V* h1 o9 i6 {* J) \( [# ]: b3 a9 ^* ?3 ^
如下图所示:# x7 ?+ L8 x* s
2 B% y$ J3 K' b# Q" c 1 m8 ^# u' c# \6 l9 h. [
! e J# w& D( q+ ^. V
% K7 a6 q, v, B0 l8 {6 R1 ~
7 f' H) B" l" M+ i W, V. q2 @我们现在打开了一个pwm控制器,可以看到FTM1支持8个通道,而背光使用的是pwm-1通道。将我们修改后的设备树文件和firmware编译,烧写到飞凌LS1028A-C开发板,启动系统。
/ i# t4 B: K4 `/ s
1 [0 n, {7 D0 Wroot@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备。
) w: W6 x* v& |# `5 c
% ^5 X! n* Z0 i- ?# O! r* Y如下图所示:4 U) t/ F Z ]2 O& d
9 K2 b3 [! x6 r3 ?![]()
' H, z9 I$ [. j+ s3 S. s+ T/ {# u' S8 i# q. k; X! e" `: G
% `( N0 P8 A+ h& y" R
0 m' i7 h3 m$ L. M: F9 `此时,虽然我们添加的pwm设备打开了,但和pwm0设备还是有差别的,新添加的pwm设备的每一路通道都没有设置周期和占空比。+ w: j* K! n+ {) W7 d
- z& p# E/ v" w, s! G4 U
所以下一步我们不需要再增加驱动代码,而是利用sys即可直接设置pwm参数。Pwmchip8是我们添加的pwm设备。
* @& L' O) U! m3 O0 A: z. W3 C6 S# O1 ?3 V& ^% `& u. v* q
![]()
3 Z* k. u6 q1 H2 c9 t
9 Z+ l- o: r, a0 G% U) `: K' e9 U0 A& Q2 K
. ~# D6 |+ p2 } `: ]8 \▐ 使能使用的pwm通道" W n. A. e8 ~ p! M8 l- h
' M C# v# P' p8 E! ^. ~ Hroot@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/export 初始化 pwm通道1 4 I) _+ q. `4 j
* z1 [% s+ r7 y1 R7 e
root@forlinx:~#echo 2 > /sys/class/pwm/pwmchip8/export 初始化 pwm通道2
5 B+ \9 \! O8 u: S1 f
, a1 S! X g7 G5 K$ ]root@forlinx:~#cat /sys/kernel/debug/pwm命令查看我们当前的pwm设备:
1 b3 {3 Z3 ^9 J
* O9 f4 c, K* S ' i3 l1 C( Y$ U" U
: v9 B/ f+ {* T" ~! e. x' `
- m$ {( b& a, b( h3 [9 X: \) z6 T9 a( V! f2 [
如果想取消相应pwm通道的话,可以使用“echo 1 > /sys/class/pwm/pwmchip8/unexport”
7 l2 d" P9 s/ c& Y2 c/ a F; D# U ?1 L1 d1 M4 P
“echo 2 > /sys/class/pwm/pwmchip8/unexport”命令。) V, W% ^& @5 I) O w3 z
$ W' }+ j: n1 M$ |* l3 ^+ z- f1 }因为我们每次只能使能一路pwm,所以先配置和打开pwm1。
! i; k' q" J- ]& q4 _' h |* M, s1 r' Q- d, Y5 T
root@forlinx:~#echo 1000000 > /sys/class/pwm/pwmchip8/pwm1/period 配置pwm1 period为1000000,单位为ns,即1kHZ。
8 D& a* e/ K7 Y( ~. E5 K, ]9 H
; s7 M4 N6 @; d6 vroot@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm1/duty_cycle 配置 duty_cycle 为500000,一个周期中on的时间即占空比,单位为ns,占空比50%# s7 m6 n4 x& a. o
% ?' n' `, q/ M8 m$ [5 p/ B- g' jroot@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/pwm1/enable 使能
4 G8 P& j/ ^: ?% b6 r. t7 A
! h+ g$ `0 T& N7 o+ h. o8 Zroot@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm1/{enable,period,duty_cycle} 命令可以查看我们的pwm使能状态,周期,和占空比。
1 w! L9 G1 i c3 E
# X X$ G0 q" o5 D& x6 n如下图所示:
7 S: L t! r4 n! Z4 d
# o9 O3 j: E+ u$ `+ _: f& d![]()
3 @- w6 [% t8 c. X+ [# X0 b
: S. X; ?3 E) v4 a+ {1 |
$ }) g1 ^4 Q6 T& p1 \% F$ U+ {
- W2 Q& K4 ~' F( G▐ 用示波器测试T6_CAN2_RX产生1khz的方波
9 ^2 e+ }- Q$ V. Z' I6 A' j- M6 X% A+ l" U) ?6 j. N, o
由于每次只能使能一路pwm,所以我们要使能pwm2,就需要先关闭pwm1。5 r' {7 B, K& t; ?6 Z
' B: c) O+ e7 P" _ X K
root@forlinx:~#echo 0 > /sys/class/pwm/pwmchip8/pwm1/enable
0 D' E; p2 P! \7 s
3 t, `2 ?7 C0 [- e0 s7 j3 k8 }9 Nroot@forlinx:~#echo 1000000 > /sys/class/pwm/pwmchip8/pwm2/period 配置period为10000005 _6 z1 }& ?+ c6 l5 D
2 o L% H1 U1 K6 X2 r1 k
root@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm2/duty_cycle 配置duty_cycle为500000。root@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/pwm2/enable 使能
1 o( u, J2 n# Y9 |5 Q" Q4 Y( I/ V$ \1 {2 L" U: c4 w
root@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm2/{enable,period,duty_cycle}0 D7 X) z- n& c1 r; C* k
1 g5 k" e! t3 ?! j) |' [3 o# f![]()
; |$ d" L3 z# A) e& ~- Y) G5 Y+ V/ [1 p% a/ X; U
3 s8 Q- X1 }; Z1 R
( f7 C9 t$ p9 C0 |. z$ u▐ 用示波器测试U7_CAN2_TX产生1khz的方波
. z/ F I; j) H! T2 }0 y/ O& Q0 ~6 c k) c6 l+ z. T8 r5 B
在我们使用OK1028A-C时,由于管脚复用,很多功能模块的管脚没有引出,但是模块的驱动是支持的。这种情况下,我们只需要修改rcw相应的pinmux配置和设备树文件就可以使用相应的功能了。
6 |- ^8 J U# }$ z3 |0 C
2 M0 L* }8 F' q( ]7 Z9 g0 x5 C2 ]
K J/ b& n7 U$ m, K' P9 v) n. I+ u |
|