瑞芯微Rockchip开发者社区
直播中

YYXIAO

8年用户 1163经验值
擅长:接口/总线/驱动
私信 关注
[经验]

对基于RK3308开发板的PS2 Joystick摇杆模块进行调试

最近本人又调试了一款比较有趣的传感器模块--PS2 Joystick摇杆模块。下面将本人的测试方法分享于大家,下文仅个人见解,若有不足之处,望指出,不胜感激。
一、模块介绍
PS2双轴游戏摇杆模块采用了PS2游戏手柄上优质金属按键摇杆电位器,模块集成电源指示灯,可以显示工作状态;坐标标识符清晰简明、定位准确。
我们先来看下它的工作原理吧,那样我们也知道它里面到底是怎么回事,这对我们对它的使用很有帮助,下面是模块的功能示意图:

由上图可见的,模块设有二路模拟输出和一路数字输出接口,输出值分别对应(X,Y)双轴偏移量,其类型为模拟量;另一数字表示用户是否在Z轴按下,其类型为数字开关量。通过控制器编程,传感器扩展板插接,完成具有创意性的互动作品或者游戏。

二、代码简述
按照惯例,在了解模块后,先在kernel/arch/arm64/boot/dts/rockchip/rk3308-firefly.dtsi设备树中添加设备的节点信息。

代码中使用了ADC通道0与ADC通道2,还有一个GPIO口。所使用的ADC时钟为saradc。下面将进行驱动代码的编写:首先在kernel/drivers/adc/下创建一个对应的文件夹,加入Kconfig、Makefile、ps2.c其中。


在此就不对驱动的框架进行赘述,在初始化函数中将驱动申请为杂项设备,还有相关的设备信息。下面将对probe函数进行解析:

其中需要一提的是iio_channel_get()函数,功能作用为:获取 iio 通道描述。参数为:设备描述指针、所用通道描述指针。of_get_named_gpio_flags()功能为:获取GPIO信息。gpio_is_valid()功能为:判断GPIO是否合法。下面为ps2_read()函数:

在read()函数中调用的ps2_get_value()是获取所需值的函数。具体如下:

其中iio_read_channel_raw()函数的功能为:读取 chan 通道 AD 采集的原始数据。参数为:通道指针、数据存放指针。此处的STANDARD_VOL与CONVERSION_NUM分别表示标准电压、转换位数。关于ADC的使用方法,可以参照firefly官方wikADC使用

gpio_get_value()函数的功能为:获取GPIO的IO值。代码写到此处,驱动算是基本已经完成,对其进行编译,生成固件,烧入开发板。以下为应用层测试程序的编写:


测试程序较为简单,访问读取/dev/PS2数据即可。再使用strtok()函数分割data,得到每个轴的数据。完成之后,使用指定的交叉编译链进行编译,将可执行文件传输至开发板中。

三、效果展示
一切准备工作处理完成之后,即可执行程序,查看代码效果!!

(此文仅个人见解,若有不足之处,望指出,不胜感激)


原作者:Demon

更多回帖

发帖
×
20
完善资料,
赚取积分