|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近,我收到了一个使用OK1028A-C输出pwm方波的需求.但是发现OK1028平台没有相关的说明,于是我着手写下了这篇文章。
# c" b3 ^% \, {: S
7 J: v) k6 E( `+ c/ D在查阅OK1028A-C原理图和《QorIQ LS1028A Reference Manual》后得知,LS1028默认有8个FlexTimer (FTM) ,每个FTM有8路pwm。
; D5 F" l4 w4 O. {% O3 T
- H- {: }8 N: J 1 w1 i ~8 K# |2 {3 {- h. G8 v: j
6 a3 y/ O) k2 d$ }' c n6 y! m% l8 {+ c/ Y( \9 G% l; o
& }# `; U8 r& E' \1 @5 z2 L默认背光采用的是FTM1产生的pwm,我们使用FTM7做pwm测试。
) |; s( E; z: } Y
4 J& B' P$ l- S U8 @7 P如下图所示:; t5 G1 K0 ?* U# d% M
4 I8 f" J4 V) ~. s! H7 x
![]()
$ F# S8 _+ l# f' i6 ]# ]& u: ^, Q9 J7 y, q* R( P
) L% a4 O8 P# u5 i6 e
# e9 a- A0 m& ELS1028 RCWSR12寄存器的12-14为I2C4的管脚复用。
' h$ D0 d* b% E6 q0 w4 n
9 o8 Z' |1 f9 \如下图所示:
2 T3 b+ s6 c" i9 n* b5 W% v5 @
![]()
% X, p! b U" N h
& \3 W& \- `) Q- I
- t8 d( p3 Z/ b9 A# U0 G: t9 f }* v* m; I
I2C4管脚可以复用为六种管脚功能。OK1028A-C将管脚设置为can2 的rx 和tx ,在原理图《OK1028A-C_V1.1》中可以看到T6_CAN2_RX、U7_CAN2_TX。
: f; E0 o/ ?8 K1 a+ Y Q9 b) R. \- [9 ?/ m( Q" C
我们可以通过修改rcw文件,将I2C4设置为pwm管脚。" V& i7 M. F/ b0 H3 I
8 p2 E$ {9 D) k6 O8 G7 {/ _: T1 V
OK1028A-C默认是支持pwm功能的,所以我们无需移植驱动,所做的工作只是修改pinmux和在设备树中增加pwm的相应设备节点即可。修改packages/firmware3 Y+ N$ x) e' M! u
& I+ Z. C" N2 |3 R% z" x/rcw/ls1028ardb/RSQPP0x85bb/rcw1500gpu600.rcw中IIC4_PMUX的设置,将pin设置为pwm输出。
$ i9 E3 g) i e# Z% S: t/ E# f
9 E; Z3 Q6 M4 K9 k7 b' ~# d将IIC4_PMUX=2修改为 IIC4_PMUX=4 I2 B3 p1 U. x8 a2 F; ]- E* y
- o+ x' t- m8 }如下图所示:% r* O7 \0 K" O. { _
0 J. x1 B+ d% t![]()
! S1 Z+ V3 F: O* k. H) v) H1 F
2 @5 J4 I" K0 O) {
0 k" d& M* k% a. A0 Z) G5 H8 k9 D
7 s/ U; G# _+ W& _完成上述设置后我们需要修改设备树代码,增加PWM配置。我们的修改的文件路径如下:
$ r: R0 i+ P" @( U
5 q+ j. d+ Y. X# n4 I( a- Qpackages/linux/linux/arch/ARM64/boot/dts/freescale/fsl-ls1028a.dtsi。" |/ D2 w. ~7 ?7 _
/ M% ?0 A* H) H0 S! U然后添加pwm7设备
! @0 b: J% H' D4 H; J! D; ]6 Y
, N5 P9 A" w; u4 u+ k0 ?/ p9 o( r0 P$ CPwm7: pwm@2860000 {, q. k: b4 u: A" L. m4 P8 g
6 D6 o: k' n8 i& e- g8 @2 z1 N compatible = "fsl,ls1028a-ftm-pwm";6 I$ C i+ U" g
) ?2 T* v" ~( a0 Y reg = <0x0 0x2860000 0x0 0x10000>;
1 u, O" [7 {6 i, n* x
a. D) l3 C' o0 G0 g #pwm-cells = <3>;
) V u5 q# M, |2 N' L; m
9 \( j7 m: w2 N4 O' l9 I0 O7 ?( o% R clock-names = "ftm_sys";0 t: p8 n, c. n0 W
: H4 W: n% e- d5 C
clocks = <&ftm_sysclk>;
- R3 p/ P& I- P9 e+ u4 L/ X4 W8 I* Y; E8 {7 Y& e+ m
};
7 ]! k- ~; F" u* a7 w% _
2 L3 |: U3 V# t* [8 e8 Z! l如下图所示:) c: T) c- t: [1 E# Y+ |. T
5 V3 d ]8 ^1 ^# U Y3 J % R9 T5 Z: y" f% c2 j: G$ A* s
! O: r+ R0 i0 V4 W0 ?9 X9 ~' f
3 `% @7 m6 c9 t" b8 l9 n$ L
2 {8 C7 Y% L* ^, v
▐ 启动OK1028A-C系统
/ z9 r" _* x4 _' A2 L9 }9 {
2 {3 e1 x2 x: s( o# E3 Wroot@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备9 ^8 v$ s5 g6 V2 i; m8 _1 e
. j$ _! \3 ^& ]如下图所示:! w! Y/ K& ]0 ?
# H0 }, e3 ^3 l- W
![]()
4 F* J* b& |# s+ {0 \: Y2 z7 x$ `
9 `4 d6 h1 v* w* D
3 E* n1 \1 d$ |* y: z- S9 V& J$ z2 b' Q2 E# t) v, V" B' @3 k
我们现在打开了一个pwm控制器,可以看到FTM1支持8个通道,而背光使用的是pwm-1通道。将我们修改后的设备树文件和firmware编译,烧写到飞凌LS1028A-C开发板,启动系统。
7 a& I0 d5 k3 Y% f- W
& J/ {$ j ~2 hroot@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备。 [1 J: V" U; y
& M* x; \) }% M如下图所示:
8 ^: c" E" d8 y: `
9 n* K7 A' C8 O8 {* W![]()
5 |7 L, V4 Y9 a) P/ S2 z8 h, Z
9 Y" k ?; g1 v9 q: n9 t
1 [5 M3 E! L3 l; ~! ~ S$ w
此时,虽然我们添加的pwm设备打开了,但和pwm0设备还是有差别的,新添加的pwm设备的每一路通道都没有设置周期和占空比。
5 o5 c; t# ^( \8 p
& b4 X4 I& F# D4 U" p所以下一步我们不需要再增加驱动代码,而是利用sys即可直接设置pwm参数。Pwmchip8是我们添加的pwm设备。, g. a$ h6 K1 s
: \, S- T$ C9 h7 \![]()
& [ l; ^/ ~6 D. [2 d$ Y( n0 }) B9 z
9 Y; N7 K# y9 ?( E/ w9 h3 P
; _ ~2 A8 Z: Z! i▐ 使能使用的pwm通道
1 O# ?+ |9 R; o- V( I% J7 e- p6 D5 G W, S5 Y6 v
root@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/export 初始化 pwm通道1
9 T3 r/ C& Q5 k$ a( y4 @! i$ I: e2 X" j* q0 y4 \* m
root@forlinx:~#echo 2 > /sys/class/pwm/pwmchip8/export 初始化 pwm通道2
, S0 E! F+ B! m4 l6 E# E4 Z4 ]$ |4 h8 ^
root@forlinx:~#cat /sys/kernel/debug/pwm命令查看我们当前的pwm设备:' a! ~. u0 m& v* j- V/ D
% N* j3 l2 Z; M, P, S![]()
/ g7 `: z6 Y8 R& c/ \9 n/ }+ s4 {" k" `% P( k
( V6 @( k/ u' E+ q( f8 l
% K9 j5 O# o+ N# H3 M如果想取消相应pwm通道的话,可以使用“echo 1 > /sys/class/pwm/pwmchip8/unexport”
5 G+ W$ W; C6 L( [+ ~. [ |9 n+ t# ~
“echo 2 > /sys/class/pwm/pwmchip8/unexport”命令。7 f' `% q) G5 I3 l" D. h, }* d
7 ?& g6 j. h2 S8 y% w
因为我们每次只能使能一路pwm,所以先配置和打开pwm1。
- ]8 W8 j' E* d+ j- P! p! C& n& z
root@forlinx:~#echo 1000000 > /sys/class/pwm/pwmchip8/pwm1/period 配置pwm1 period为1000000,单位为ns,即1kHZ。
8 _! M7 z' z; p2 A, r ?: Y0 r/ H6 B- M: C0 z! Q) @
root@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm1/duty_cycle 配置 duty_cycle 为500000,一个周期中on的时间即占空比,单位为ns,占空比50%- @& D6 b/ H. X5 q9 v) j: Y
6 V+ v0 l7 U0 L0 w9 ~1 yroot@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/pwm1/enable 使能! e. ^( Z9 h& k6 m
6 L6 j) }1 i$ _1 l) C5 m& eroot@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm1/{enable,period,duty_cycle} 命令可以查看我们的pwm使能状态,周期,和占空比。
% W- m7 ^- w8 {* J( D$ r
' M/ z& j. J5 n) r+ W如下图所示:
8 V0 g( k, k+ X- O8 L2 U3 U1 d$ ^
1 w0 d. {! y' x6 s& [ 8 P/ X1 v: ^2 D/ P/ k
8 h; f6 T9 { S) c9 V6 i+ R7 c
9 s8 s/ g" ~" \2 d3 d! o0 L) {
4 S; [% v- b! L. Q" h. m▐ 用示波器测试T6_CAN2_RX产生1khz的方波
/ B$ J% V1 r) p8 x, B- |% w! O+ Z- ]* [ ?! ~
由于每次只能使能一路pwm,所以我们要使能pwm2,就需要先关闭pwm1。9 P1 B! y: d$ A
: S; p+ V0 e4 d" Z- _, F( }* d
root@forlinx:~#echo 0 > /sys/class/pwm/pwmchip8/pwm1/enable
8 B" n- K* n, j* K) W" J- a) h$ Z& A/ C( Y
root@forlinx:~#echo 1000000 > /sys/class/pwm/pwmchip8/pwm2/period 配置period为1000000 _. [5 B4 I0 k
& A9 B0 W4 O- r4 r1 w: t
root@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm2/duty_cycle 配置duty_cycle为500000。root@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/pwm2/enable 使能) }4 _1 M/ i5 G, Q- R
' ^ I. ~/ r* Y1 P& [7 r3 i
root@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm2/{enable,period,duty_cycle}
6 _2 W# C- ]! O! h6 c* V# S- X; r1 B- b. Q
![]()
( V* q+ b2 k# Q$ n: {
, Q; T9 k: s7 u5 g
8 e! G) W; x, E3 G) E# P. R( i
! b7 T- h) a& J6 }+ C# V) ?▐ 用示波器测试U7_CAN2_TX产生1khz的方波
6 U F. B* n- u! `2 t/ i( k3 \/ M M/ s& G
在我们使用OK1028A-C时,由于管脚复用,很多功能模块的管脚没有引出,但是模块的驱动是支持的。这种情况下,我们只需要修改rcw相应的pinmux配置和设备树文件就可以使用相应的功能了。; ~" y8 K- _3 V/ a) A: z+ |) s- B
7 l( K7 g. v; ]$ P
: p$ _8 e* \ T9 l; D
|
|