mini6410 矩阵键盘接口驱动移植


做了矩阵键盘驱动移植,虽然步骤简单还是来记录下,顺便整理下思路。贵人多忘事  虽然咱不是贵人也记性不好啊

水平有限,此文档只供自己参考,但也欢迎扔砖。

2.6.38 中6410键盘接口驱动对应的是 samsung-keypad.c位于driver/input/keyboard目录。

另外 Dev-key.c 定义了keypad设备 samsung_device_keypad,及resource samsung_keypad_resources。

除此之外还有系统板文件 mach-mini6410.c,把 samsung_device_keypad 设备加入 mini6410_devices数组,及开机时设置键盘参数 samsung_keypad_set_platdata。

系统开机后调用 mini6410_machine_init(void) 函数 ,在此函数中调用了platform_add_devices(mini6410_devices, ARRAY_SIZE(mini6410_devices));像系统添加了一系列平台设备,我们把keypad设备也加到数组中

 

 &s3c_device_fimc1,

 &s3c_device_g2d,

 &s3c_device_g3d,

 #endif

 &samsung_device_keypad,

而这个keypad设备定义是在 Dev-key.c中 注册为平台设备
struct platform_device samsung_device_keypad = {
.name = "samsung-keypad",
.id = -1,
.num_resources = ARRAY_SIZE(samsung_keypad_resources),
.resource = samsung_keypad_resources,
};
KEYPAD设备资源同样定义在 Dev-keypad.c中
static struct resource samsung_keypad_resources[] = {
[0] = {
 .start = SAMSUNG_PA_KEYPAD,
 .end = SAMSUNG_PA_KEYPAD + 0x20 - 1,
 .flags = IORESOURCE_MEM,
},
[1] = {
 .start = IRQ_KEYPAD,
 .end = IRQ_KEYPAD,
 .flags = IORESOURCE_IRQ,
 },
};
mini6410_machine_init函数把 设备keypad设备加入系统后调了
samsung_keypad_set_platdata(&smdk6410_keypad_data);
 对设备参数进行了初始化
static struct samsung_keypad_platdata smdk6410_keypad_data __initdata = {
 .keymap_data = &smdk6410_keymap_data, //按键映射表
 .rows = 2,       //矩阵键盘行数
 .cols = 2,        //矩阵键盘列数
};
按键映射表是上传事件报告中用到的,具体后面再来讨论。呵呵 其实我也没看到
在 Dev-keypad.c中
void __init samsung_keypad_set_platdata(struct samsung_keypad_platdata *pd)
{
struct samsung_keypad_platdata *npd;
//此函数就是把 smdk6410_keypad_data 复制了一份给了 samsung_device_keypad->dev.platform_data
npd = s3c_set_platdata(pd, sizeof(struct samsung_keypad_platdata),
&samsung_device_keypad);
//配置矩阵键盘接口用到的 GPIO
if (!npd->cfg_gpio)
npd->cfg_gpio = samsung_keypad_cfg_gpio;
}
在setup-keypad.c中
void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols)
{
/* Set all the necessary GPK pins to special-function 3: KP_ROW[x] */
// s3c_gpio_cfgrange_nopull(S3C64XX_GPK(8), rows, S3C_GPIO_SFN(3));
//从GPN0开始的rows个端口设置为功能三 即键盘接口
s3c_gpio_cfgrange_nopull(S3C64XX_GPN(0), rows, S3C_GPIO_SFN(3));
/* Set all the necessary GPL pins to special-function 3: KP_COL[x] */
// s3c_gpio_cfgrange_nopull(S3C64XX_GPL(0), cols, S3C_GPIO_SFN(3));
s3c_gpio_cfgrange_nopull(S3C64XX_GPH(0), cols, S3C_GPIO_SFN(3));
}
6410 键盘接口可以用 K/L口或 N/H口

到此 divice 工作基本完成 。  休息下。

  • 1
  • 2
  • 3
  • 下一页

相关内容