在定时器驱动中使用timer函数,出现报错,请问这是什么问题?

问题遇到的现象和发生背景

在定时器驱动中使用timer函数,出现报错,请问这是什么问题,怎么解决?

遇到的现象和发生背景,请写出第一个错误信息

img

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
#include module.h>
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include of.h>
#include 
#include 
#include 
#include 
#include 
#include 

#define     TIMER_CNT   1
#define     TIMER_NAME      "timer"

/*timer设备结构体*/
struct      timer_dev{
        dev_t   devid;
        int     major;
        int     minor;
        struct  cdev    cdev;
        struct  class   *class;
        struct  device  *device;
        struct  device_node     *nd;
        struct timer_list   timer;          /*定时器*/
        int led_gpio;
};

struct  timer_dev   timerdev;  /*timerdev*/

static    int   timer_open(struct inode *inode,     struct file *filp)
{
   filp->private_data  =   &timerdev;
    return  0;
}

static  int   timer_release(struct  inode   *inode,struct   file    *filp)
{
    //struct  timer_dev   *dev    =   filp->private_data;
    return  0;
    
}

static  ssize_t   timer_write(struct    file    *filp,  const   char    __user    *buf,size_t   count,loff_t    *ppos)
{
    //struct  timer_dev   *dev    =   filp->private_data;
    return  0;

}

/*操作集*/
static  const   struct  file_operations     timerdev_fops  ={
    .owner          =       THIS_MODULE,
    .write            =       timer_write,
    .open            =       timer_open,
    .release        =       timer_release,
};

/*定时器处理函数*/
static  void    timer_func(unsigned     long    arg)
{
    struct timer_dev    *dev    =   (struct timer_dev*)arg;
    static  int     sta =   1;
    
    sta     =!  sta;
    gpio_set_value(dev->led_gpio,   sta);
    mod_timer(&dev->timer,   jiffies +   msecs_to_jiffies(500));
}

/*初始化led*/
int    led_init(struct timer_dev   *dev)
{
    int     ret =   0;

    dev->nd     =   of_find_node_by_path("/gpioled");
    if(dev->nd  ==  NULL){
        ret     =   -EINVAL;    
        goto    fail_fd;
    }

    dev->led_gpio   =   of_get_named_gpio(dev->nd,"led_gpios",  0);
    if(dev->led_gpio<0){
        ret =   -EINVAL;    
        goto    fail_gpio;
    }
        ret =   gpio_request(dev->led_gpio,"led");
        if(ret){
            ret =   -EBUSY; 
            printk("IO  %d  can't   request!\r\n",dev->led_gpio);
            goto    fail_request;
        }

        ret =   gpio_direction_output(dev->led_gpio,    1); /*设置输出,默认关灯*/
            if(ret<0){
                ret =   -EINVAL;   
                goto    fail_gpioset;
            }
        return  0;
fail_gpioset:
            gpio_free(dev->led_gpio);
fail_request:
fail_gpio:
fail_fd:
            return  ret;
}

/*驱动入口函数*/
static   int __init     timer_init(void)
{
    int     ret =   0;
    /*注册字符设备驱动*/
    timerdev.major     =   0;
    if(timerdev.major){        /*给定主设备号*/
        timerdev.devid  =   MKDEV(timerdev.major,0);
      ret   =    register_chrdev_region(timerdev.devid, TIMER_CNT,   TIMER_NAME);
    }else{              /*没给定设备号*/
           ret  =    alloc_chrdev_region(&timerdev.devid,     0,TIMER_CNT,    TIMER_NAME);
            timerdev.major     =       MAJOR(timerdev.devid);
            timerdev.minor     =       MINOR(timerdev.devid);
    }
    if(ret<0){
        goto    fail_devid;
    }
    printk("timer    major     =    %d,minor    =   %d\r\n",timerdev.major,    timerdev.minor);

    /*2.初始化cdev*/
    timerdev.cdev.owner    =   THIS_MODULE;
    cdev_init(&timerdev.cdev,  &timerdev_fops);

    /*3.添加cdev*/
    ret =   cdev_add(&timerdev.cdev,   timerdev.devid,    TIMER_CNT);
    if(ret)
            goto    fail_cdevadd;
    /*4.创建类*/
    timerdev.class =   class_create(THIS_MODULE,   TIMER_NAME);
    if(IS_ERR(timerdev.class)){
        ret =  PTR_ERR(timerdev.class);
        goto    fail_class;
    }

    /*5.创建设备*/
    timerdev.device    =   device_create(timerdev.class,  NULL,   timerdev.devid,    NULL ,  TIMER_NAME);
    if(IS_ERR(timerdev.device)){
        ret     =     PTR_ERR(timerdev.device);
        goto    fail_device;
    }
    /*6.初始化led灯*/
    ret =   led_init(&timerdev);
    if(ret<0){
        goto    fail_ledinit;
    }

    /*7.初始化定时器*/
    init_timer(&timerdev.timer); 

    timerdev.timer.function = timer_func;
    timerdev.timer.expires = jiffies +   msecs_to_jiffies(500);
    timerdev.timer.data = (unsigned   long)&timerdev;
    add_timer(&timerdev.timer);         /*添加到系统*/


    return  0;
fail_ledinit:
fail_device:
        class_destroy(timerdev.class);
fail_class:
        cdev_del(&timerdev.cdev);
fail_cdevadd:
        unregister_chrdev_region(timerdev.devid,    TIMER_CNT);
fail_devid:
        return  ret;
}


/*驱动出口函数*/
static    void  __exit  timer_exit(void)
{
    /*关灯*/
    gpio_set_value(timerdev.led_gpio,   1);

    /*删除定时器*/
    del_timer(&timerdev.timer);

    /*注销字符设备*/
    cdev_del(&timerdev.cdev);
    unregister_chrdev_region(timerdev.devid,   TIMER_CNT);

    device_destroy(timerdev.class, timerdev.devid);
    class_destroy(timerdev.class);

    /*释放GPIO*/
    gpio_free(timerdev.led_gpio);
}

module_init(timer_init);
module_exit(timer_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ty");


运行结果及详细报错内容

主要是这三个语句出错:

init_timer(&timerdev.timer); 

timerdev.timer.function = timer_func;


 timerdev.timer.data = (unsigned   long)&timerdev;
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”