TCU定时器单元

模块功能介绍

定时计数单元(TCU)芯片设计包含8个tcu通道分别是0~7标号,每个通道可以有三个时钟输入源pwm(gpio0,gpio1),extal,可以使用其中的任意组合进行功能的使用。

按照spec描述可以分为7种功能模式分别是:

常规模式:计数器在时钟的上升沿或是下降沿进行计数,也可以上升下降同时采集计数。

门模式:门为0时,计数器计数。

正交模式:计数器由于正交输入而计数。

方向模式:由输入信号决定计数器的递增还是递减。

pos模式:由于上升沿或是下降沿,计数器开始从0开始计数。

捕获模式:计数器对周期进行计数并输出高电平时间和周期时间。

过滤模式:该模式用于去除用户不希望的gpio输入(例如毛刺)。

gpio存储模式:该模式在检测到gpio的电平变化时,会存储计数值。

TCU通道GPIO0GPIO1
ch0input0input0
ch1input1input1
ch2input2input2
ch3input3input3
ch4input4input4
ch5input5input5
ch6input6input6
ch7input7input7

驱动位置

驱动源码所在位置

module_drivers/drivers/mfd/ingenic-tcu.c

设备树配置

设备树所在位置:

kernel内核(version <= 5.10)dts文件路径:

module_drivers/dts-stage/x1600/x1600.dtsi

kernel内核(version > 5.10)dts文件路径:

module_drivers/dts/x1600/x1600.dtsi

TCU控制器述:

tcu: tcu@0x10002000 {

compatible = "ingenic,tcu";

reg = <0x10002000 0x1000>;

interrupt-parent = <&core_intc>;

interrupt-names = "default";

interrupts = <IRQ_TCU0 IRQ_TCU1>;

status = "ok";

};

设备树默认配置

设备树默认编译不会产生tcu设备

设备树自定义配置

用户可根据实际需求开启tcu设备,将该控制器配置为ok。

内核编译配置

内核配置MFD_INGENIC_TCU,配置说明如下:

Symbol: MFD_INGENIC_TCU [=y] 

Type : boolean 

Prompt: [TCU] Ingenic tcu driver 

 Location: 

(1) -> Ingenic device-drivers Configurations 

 Defined at module_drivers/drivers/mfd/Kconfig:43 

 Depends on: SOC_X2000 [=n] || SOC_M300 [=n] || SOC_X2100 [=n] || SOC_X1600 [=y]

 Selects: MFD_CORE [=y] && GENERIC_IRQ_CHIP [=y]

内核默认编译配置

内核默认配置TCU驱动,配置界面如下:

img_01.png

内核自定义编译配置

用户可根据实际需求去掉该驱动的配置。

设备节点生成

驱动加载成功后生成以下节点:

cd sys/devices/platform/apb/10002000.tcu/

disable enable power

driver modalias subsystem

driver_override of_node uevent

应用程序使用说明

1、使用主要用到的是disable和enable

2、驱动中有一个配置的函数默认为module_drivers/drivers/mfd/ingenic-tcu.c

/This is a simple configuration test demo/

static void ingenic_tcu_config_attr(int id,enum tcu_mode_sel mode_sel)

{

int i = 0;

g_tcu_chn[id].mode_sel = mode_sel; 

g_tcu_chn[id].irq_type = FULL_IRQ_MODE;

……

for(i = 0; i < 20 ;i++)

sws_pr_debug(&g_tcu_chn[id]);

}

说明:具体应用场景还没有,系统接口没有留太多,此函数的配置结合spec能够进行快速的验证功能,后续会留更多的系统配置接口。

在使用DIRECTION_MODE、POS_MODE、CAPTURE_MODE、FILTER_MODE模式之前请先配置对应tcu通道的gpio0或gpio1。

在使用QUADRATURE_MODE模式的时候请先配置对应tcu通道的gpio0和gpio1为正交信号。

3、使用过程就是把对应的通道写入enable该通道就开始工作

\# cat enable 

mode_sel :

0:GENERAL_MODE 1:GATE_MODE 2:DIRECTION_MODE 3:QUADRATURE_MODE

4:POS_MODE 5:CAPTURE_MODE 6:FILTER_MODE

####################example####################

## echo channel_id mode_sel > enable 

## echo channel_id > disable 

channel: 00 disable

channel: 01 disable

channel: 02 disable

channel: 03 disable

channel: 04 disable

channel: 05 disable

channel: 06 disable

channel: 07 disable

\# echo 0 0 > enable 

[ 164.485676] mode_id = 0 

...

...

[ 165.896941] ----------------------------------------count N0.20----------------------------------------------------

[ 165.896941] 

[ 165.912304] -stop-----addr-b000201c-value-00000000-----------

[ 165.918236] -mask-----addr-b0002030-value-00ff80fe-----------

[ 165.924181] -enable---addr-b0002010-value-00000001-----------

[ 165.930120] -flag-----addr-b0002020-value-00010000-----------

[ 165.936048] -Control--addr-b000204c-value-00010004-----------

[ 165.941990] -full-----addr-b0002040-value-0000ffff-----------

[ 165.947925] -half- -addr-b0002044-value-00005000-----------

[ 165.953874] -TCNT-----addr-b0002048-value-0000b5bf-----------

[ 165.959811] -CAP reg_base-------value-00000000-----------

[ 165.965399] -CAP_VAL register---value-00000000-----------

4、把对应的通道写入disable就停止计数工作了

\# echo 0 > disable

\# cat disable

channel: 00 disable

channel: 01 disable

channel: 02 disable

channel: 03 disable

channel: 04 disable

channel: 05 disable

channel: 06 disable

channel: 07 disable

说明:tcu使用的功能模式比较多,以至于没有留有太多的接口,但是内部逻辑都已经写好了,只需要按照spec中的不同模式的使用方式对ingenic_tcu_config_attr函数赋值就好了,每一类的宏也定义好了,能够方便的配置使用,不同的使用场景请修改相应的配置。