Øvelse+8+-+LDD+with+Timer

A) Implementer ioctl kald Start med at implementere et ioctl kald og et lille tilhørende testprogram
Starter med at tilføje ioctl til vores struct

code format="c" .ioctl = mygpio_ioctl, code

Vi skriver da følgende kode, i vores .c fil

code format="c" ssize_t mygpio_ioctl(struct inode * Inode, struct file *filep, unsigned int cmd, unsigned long arg) {   int minor = MINOR(filep->f_dentry->d_inode->i_rdev);

switch(cmd) {       case SET_TIMER: //test case printk(KERN_ALERT "set timer\n"); break; case SET_FRQ: printk(KERN_ALERT "set frequency\n"); break; case START_TIMER: init_timer(&my_timer); my_timer.expires = jiffies + arg*HZ; timer_delay = arg; my_timer.function = timer_funct; add_timer(&my_timer); my_timer.data = minor; break; case STOP_TIMER: del_timer(&my_timer); break; default: printk(KERN_ALERT "Unknown command\n"); }

return 0; } code

i toppen #definer vi SET_TIMER, SET_FRQ, START_TIMER og STOP_TIMER

code format="c" code
 * 1) define SET_TIMER   14
 * 2) define SET_FRQ       18
 * 3) define START_TIMER   15
 * 4) define STOP_TIMER   19

Vi laver da en lille test program der kan afprøve det.

code format="c"
 * 1) define SET_TIMER   14
 * 2) define SET_FRQ       18
 * 3) define START_TIMER   15
 * 4) define STOP_TIMER   19

int main {   int fd;

fd = open("/dev/mygpio", O_RDWR);

ioctl(fd, SET_TIMER, NULL); ioctl(fd, SET_FRQ, NULL);

close(fd); } code

B) Implementer toggler Implementer en periodisk timer til at styre GPIO outputtet
Som det kan ses på koden over, er timeren implamenteret i toppen har vi også defineret my_timer ved at skriver code format="c" struct timer_list my_timer; code

code format="c" init_timer(&my_timer);

my_timer.expires = jiffies + arg*HZ;

timer_delay = arg;

my_timer.function = timer_funct;

add_timer(&my_timer);

my_timer.data = minor; code

vi har da vores timer_funct function som bliver kaldt når tiden er gået den tænder og slukker for en lysdiode

code format="c" static void timer_funct(unsigned long timer_arg) {   gpio_set_value(gpio[my_timer.data].num, !gpio_get_value(gpio[my_timer.data].num)); my_timer.expires = jiffies + timer_delay*HZ; add_timer(&my_timer); } code