Hello All, I want to implement an interrupt based timer at the low level for WinCE 6.0 . Do you have any sample driver for that? Or do you have suggestions? Thank you... O.Karalica
Timer Interrupt
Hi, I've the same problem too. I want to read adc with an interval lower than 1ms (best winCe timer performance). is this possible? please help
See the module
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/serio.h>
#include <linux/delay.h>
#include <linux/clk.h>
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-gpio.h>
#include <plat/regs-timer.h>
#include <plat/regs-adc.h>
#define __TIMREG(name) (*(volatile unsigned long *)(BaseAddr + name))
#define TIMCON __TIMREG(S3C2410_TCON)
#define DEVICE_NAME "tim"
typedef struct {
int delay;
} TIM_DEV;
static TIM_DEV TimDev;
int RUNNED = 0;
int test;
static irqreturn_t TimerINTHandler(int irq,void *TimDev)
{
unsigned TimerINTControl;
TimerINTControl = readl(S3C_TINT_CSTAT);
RUNNED ++;
TimerINTControl |= S3C_TINT_CSTAT_T2INT;
writel(TimerINTControl, S3C_TINT_CSTAT);
return IRQ_HANDLED;
}
static ssize_t TimerRead(struct file *filp, char *buffer, size_t count,
loff_t *ppos)
{
char str[20];
size_t len;
len = sprintf(str, "%d\n", RUNNED);
copy_to_user(buffer, str, len);
if (*ppos == 0) {
*ppos+=len;
return len;
} else {
return 0;
}
}
static struct file_operations dev_fops = {
owner: THIS_MODULE,
read: TimerRead,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
int ret;
unsigned TimerControl;
unsigned TimerINTControl;
unsigned TimerCNTB;
unsigned TimerCMPB;
RUNNED = 0;
TimerControl = readl(S3C_TCON);
TimerINTControl = readl(S3C_TINT_CSTAT);
TimerCNTB = readl(S3C_TCNTB(2));
TimerCMPB = readl(S3C_TCMPB(2));
TimerCNTB = 0x0000100;
TimerCMPB = 0x0000100;
writel(TimerCNTB, S3C_TCNTB(2));
writel(TimerCMPB, S3C_TCMPB(2));
//TimerControl |= S3C_TCON_T2RELOAD;
TimerControl |= S3C_TCON_T2MANUALUPD;
TimerControl &= ~S3C_TCON_T2INVERT;
//TimerControl |= S3C_TCON_T2START;
TimerINTControl |= S3C_TINT_CSTAT_T2INTEN;
writel(TimerControl, S3C_TCON);
writel(TimerINTControl, S3C_TINT_CSTAT);
TimerControl = readl(S3C_TCON);
TimerControl |= S3C_TCON_T2RELOAD;
TimerControl &= ~S3C_TCON_T2MANUALUPD;
TimerControl |= S3C_TCON_T2START;
writel(TimerControl, S3C_TCON);
ret = request_irq(IRQ_TIMER2, TimerINTHandler, IRQF_SHARED, DEVICE_NAME,
&TimDev);
if (ret) {
return ret;
}
ret = misc_register(&misc);
printk (DEVICE_NAME"\tinitialized\n");
return ret;
}
static void __exit dev_exit(void)
{
free_irq(IRQ_TIMER2, &TimDev);
misc_deregister(&misc);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Muhammad Usama Masood");


