dljaye 发表于 2009-4-14 16:24:12

触摸屏

请教:skyeye 上怎么模拟触摸屏?

lurker0 发表于 2009-4-14 20:29:10

用鼠标事件来模拟触摸屏的按下松开操作
用GUI来模拟显示

dljaye 发表于 2009-4-14 22:20:40

我在skyeye 上模拟 ts ,显示如下:
mice: PS/2 mouse device common for all mice
ts: Compaq touchscreen protocol output
ERROR: s3c2410x_io_write_word(0x58000000) = 0x00004c40
ERROR: s3c2410x_io_write_word(0x58000008) = 0x00002710
ERROR: s3c2410x_io_write_word(0x58000004) = 0x000000d3
s3c2410 TouchScreen successfully loaded
input: device s3c2410 TouchScreen is statically allocated, will not register
Please convert to input_allocate_device() or contact [email protected]
不知是什么问题,ts 不好使,请指教。。。

lurker0 发表于 2009-4-14 22:48:49

指教谈不上其实我也不大懂^_^
大家一起研究一下好了

你能不能提供更加详细的信息,比如
skyeye模拟的目标平台
模拟的linux版本号,是否为uclinux 等等

还有你贴的打印,是linux启动的时候就挂在那儿了呢,还是能够进入到shell,但是针对ts的demo不能正常工作.

lurker0 发表于 2009-4-14 23:11:17

另外我google了一下.

http://blogimg.chinaunix.net/blog/upfile2/080712033140.pdf
这个文档有你提到的信息

应该是linux内核的Touchscreen驱动tsdev.c中的函数 input_register_device 打印的
你的驱动是不是自己移植的

input_register_device函数会检查dev->dynalloc标记,如果为空,就会出现你提供的信息里描述的
Please convert to input_allocate_device() or contact [email protected]
而这个标记是在input_allocate_device做的初始化.

一般input类型的驱动程序在调用input_register_device注册之前会input_allocate_device
做分配之类的初始化操作, 如果没有这一步, 就会出现上述打印.

http://blog.21ic.com/user1/2437/archives/2009/57228.html
这个网址里说的就是s3c2410的ts驱动,你可以注意一下他的static int __init s3c2440ts_probe(struct device *dev)
函数中有一行ts.dev = input_allocate_device();

[ 本帖最后由 lurker0 于 2009-4-14 23:12 编辑 ]

dljaye 发表于 2009-4-16 15:44:55

谢谢你,我修改之后还有如下错误,ts 还是不能用,
ts: Compaq touchscreen protocol output
Entering s3c2410ts_init
got and enabled clock
ERROR: s3c2410x_io_write_word(0x58000000) = 0x00004c40
ERROR: s3c2410x_io_write_word(0x58000008) = 0x00002710
ERROR: s3c2410x_io_write_word(0x58000004) = 0x000000d3
s3c2410 TouchScreen successfully loaded
input: s3c2410 TouchScreen as /class/input/input0
另外: 我用的skyeye 1.2.6,
armlinux 2.6.18
模拟 s3c2410
s3c2410ts_probe()如下

static int __init s3c2410ts_probe(struct device *dev)
{
struct s3c2410_ts_mach_info *info;

info = ( struct s3c2410_ts_mach_info *)dev->platform_data;

if (!info)
{
   printk(KERN_ERR "Hm... too bad : no platform data for ts\n");
   return -EINVAL;
}


#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
printk(DEBUG_LVL "Entering s3c2410ts_init\n");
#endif

memset(&ts, 0, sizeof(struct s3c2410ts));                                                       
ts.dev = *(input_allocate_device());
if (!&ts.dev)
{
printk(KERN_ERR "%s:%s allocate_device\n", __FUNCTION__, __FILE__);
return -ENOMEM;
}

adc_clock = clk_get(NULL, "adc");
if (!adc_clock)
{
   printk(KERN_ERR "failed to get adc clock source\n");
   return -ENOENT;
}
//clk_use(adc_clock);
clk_enable(adc_clock);


#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
printk(DEBUG_LVL "got and enabled clock\n");
#endif

base_addr=ioremap(S3C2410_PA_ADC,0x20);                //映射触摸屏的控制寄存器

if (base_addr == NULL)
{
   printk(KERN_ERR "Failed to remap register block\n");
   return -ENOMEM;
}

/* Configure GPIOs */

s3c2410_ts_connect();

if ((info->presc&0xff) > 0)
writel(S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(info->presc&0xFF),base_addr+S3C2410_ADCCON);
else
writel(0,base_addr+S3C2410_ADCCON);

/* Initialise registers */

if ((info->delay&0xffff) > 0)
writel(info->delay & 0xffff, base_addr+S3C2410_ADCDLY);
writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);

/* Initialise input stuff */

//memset(&ts, 0, sizeof(struct s3c2410ts));
//init_input_dev(&ts.dev);
ts.dev.evbit = ts.dev.evbit = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);
ts.dev.keybit = BIT(BTN_TOUCH);
input_set_abs_params(&ts.dev, ABS_X, 0, 0x3FF, 0, 0);
input_set_abs_params(&ts.dev, ABS_Y, 0, 0x3FF, 0, 0);
input_set_abs_params(&ts.dev, ABS_PRESSURE, 0, 1, 0, 0);

sprintf(ts.phys, "ts0");

ts.dev.private = &ts;
ts.dev.name = s3c2410ts_name;
ts.dev.phys = ts.phys;
ts.dev.id.bustype = BUS_RS232;
ts.dev.id.vendor = 0xDEAD;
ts.dev.id.product = 0xBEEF;
ts.dev.id.version = S3C2410TSVERSION;
ts.shift = info->oversampling_shift;

/* Get irqs */

if (request_irq(IRQ_ADC, stylus_action, SA_SAMPLE_RANDOM,"s3c2410_action", &ts.dev))
{
   printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_ADC !\n");
   iounmap(base_addr);
   return -EIO;
}

if (request_irq(IRQ_TC, stylus_updown, SA_SAMPLE_RANDOM,"s3c2410_updown", &ts.dev))
{
   printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_TC !\n");
   iounmap(base_addr);
   return -EIO;
}

printk(KERN_INFO "%s successfully loaded\n", s3c2410ts_name);

/* All went ok, so register to the input system */
input_register_device(&ts.dev);

return 0;
}

AnthonyLee 发表于 2009-4-17 00:54:49

回复 6# dljaye 的帖子

个人所知 SkyEye 目前尚无 S3C2410 的触摸屏模拟。

dljaye 发表于 2009-4-17 12:37:18

谢谢,我看了一下,的确是没有s3c2410触摸的模拟,要是自己添加触摸屏的模拟,不知道怎么做,有没有相关资料啊?

[ 本帖最后由 dljaye 于 2009-4-18 15:57 编辑 ]

ksh 发表于 2009-4-18 18:37:24

目前我们的touchscreen的模拟实现了一个简单的触摸屏器件,具体代码参考device/touchscreen/ 的文件。

有一份旧的安装文档,你可以参考http://staff.ustc.edu.cn/~xlanchen/EmbeddedOperatingSystems2007Spring/installguide.html

建议你可以用已有的那个touchscreen结合2410来运行一些图形应用,做为初步的探索。然后你可以再尝试自己实现2410的触摸屏模拟。

lurker0 发表于 2009-4-21 15:56:53

实在不好意思,误导了一下 :P
不知道dljaye有没有最新的进展
有什么可以帮的上忙的

lurker0 发表于 2009-4-26 16:12:01

我最近检查了一下qemu的模拟屏模拟.
没有找到直接模拟.Qemu当前的方法好像是通过模拟wacom手写板(USB接口)方式实现.
可以使用tslib.但是总感觉这样怪怪的,毕竟不是正式的触摸屏.   不知道触摸屏模拟的难点在什么地方?

dljaye 发表于 2009-4-26 21:19:36

我在skyeye 上用ts ,但一直没成功,不知到你有没有成功?(2.6的内核)

lurker0 发表于 2009-4-28 11:50:21

我没有在skyeye上试过ts
页: [1]
查看完整版本: 触摸屏