TCU定时器单元

模块功能介绍

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

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

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

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

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

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

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

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

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

TCU通道GPIO0GPIO1
ch0 pwm0 pwm1
ch1 pwm2 pwm3
ch2 pwm4 pwm5
ch3 pwm6 pwm7
ch4 pwm8 pwm9
ch5 pwm10 pwm11
ch6 pwm12 pwm13
ch7 pwm14 pwm15

驱动位置

驱动源码所在位置

module_drivers/drivers/mfd/ingenic-tcu.c

设备树配置

设备树所在位置:

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

module_driver/dts-stage/x2000/x2000.dtsi

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

module_driver/dts/x2000/x2000.dtsi

TCU控制器述:

tcu: tcu@0x10002000 {

compatible = "ingenic,tcu";

reg = <0x10002000 0x1000>;

interrupt-parent = <&core_intc>;

interrupt-names = "default";

interrupts = <IRQ_TCU0>;

status = "ok";

};

设备树默认配置

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

&tcu {

 status =“ok”;

};

设备树自定义配置

用户可根据实际需求关闭tcu设备,将该节点配置为disable。

&tcu {

 status = "disable";

};

内核编译配置

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

Symbol: MFD_INGENIC_TCU [=y]

Type : boolean

Prompt: [TCU] Ingenic tcu driver

 Location:

 -> Ingenic device-drivers Configurations

 Defined at module_drivers/drivers/mfd/Kconfig:43

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

 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通道的pwm0(gpio0)。

在使用QUADRATURE_MODE模式的时候请先配置对应tcu通道的pwm0(gpio0)和pwm1(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 函数赋值就好了,每一类的宏也定义好了,能够方便的配置使用,不同的使用场景请修改相应的配置。