- 论坛徽章:
- 0
|
做了个简单的led驱动,网上和书上都说device和driver注册后,如果name匹配的话就会调用probe进行加载,可是当我注册了device和driver后没有调用probe,不知道为什么,请各位大大帮忙看看,感激不尽!:)
led.h- #include <linux/device.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/miscdevice.h>
- #include <linux/fs.h>
- #include <linux/slab.h>
- #include <linux/err.h>
- #include <asm/arch/regs-gpio.h>
- #include <asm/arch/hardware.h>
- #include <asm/hardware.h>
- #include <asm/delay.h>
- #define LED_MINOR 0
- #define LED_DRIVER "Led Driver For Test"
- #define DEV_NAME "LED"
- static int led_open (struct inode *node, struct file *filp);
- static int led_ioctl (struct inode *node, struct file *filp, unsigned int cmd, unsigned long arg);
- static ssize_t led_write (struct file *filp, const char __user *buf, size_t count, loff_t *f_ops);
- static int led_probe(struct device * dev);
- static int led_remove(struct device * dev);
- static int led_release (struct inode *node, struct file *filp);
- static struct file_operations led_fops = {
- .owner = THIS_MODULE,
- .open = led_open,
- .write = led_write,
- .ioctl = led_ioctl,
- .release = led_release,
- };
- static struct miscdevice led_miscdev = {
- MISC_DYNAMIC_MINOR,
- DEV_NAME,
- &led_fops,
- };
- struct platform_device *led_dev;
- static struct device_driver led_driver = {
- .name = DEV_NAME,
- .bus = &platform_bus_type,
- .probe = led_probe,
- .remove = led_remove,
- };
- static unsigned long led_table[] = {
- S3C2410_GPF4,
- S3C2410_GPF5,
- S3C2410_GPF6,
- S3C2410_GPF7,
- };
- static unsigned long led_cfg_table[] = {
- S3C2410_GPF4_OUTP,
- S3C2410_GPF5_OUTP,
- S3C2410_GPF6_OUTP,
- S3C2410_GPF7_OUTP,
- };
复制代码 led.c- #include "led.h"
- static void led_on_off(int led_num,int led_on_off){
- //1 for on,2 for off
- if (led_num>ARRAY_SIZE(led_table)-1)
- return;
- s3c2410_gpio_setpin(led_table[led_num],led_on_off );
- }
- static void all_led_on(void){
- int i;
- for(i=0;i<ARRAY_SIZE(led_table);i++){
- s3c2410_gpio_setpin(led_table[i],0);
- }
- }
- static void all_led_out(void){
- int i;
- for(i=0;i<ARRAY_SIZE(led_table);i++){
- s3c2410_gpio_setpin(led_table[i],1);
- }
- }
- static void leds_init(void){
- int i;
- for(i=0;i<ARRAY_SIZE(led_table);i++){
- s3c2410_gpio_cfgpin(led_table[i],led_cfg_table[i]);
- }
- }
-
- static ssize_t led_write (struct file *filp, const char __user *buf, size_t count, loff_t *f_ops){
- return 0;
- }
- static int led_ioctl (struct inode *node, struct file *filp, unsigned int cmd, unsigned long arg){
- return 0;
- }
- static int led_open (struct inode *node, struct file *filp){
- printk("led driver is opened.\n");
- return 0;
- }
- static int led_release (struct inode *node, struct file *filp){
- printk("led driver is closed.\n");
- return 0;
- }
- static int led_probe(struct device * dev){
- misc_register(&led_miscdev);
- printk("%s is installed.\n",LED_DRIVER);
- all_led_on();
-
- printk("%s probe!\n",DEV_NAME);
- return 0;
- }
- static int led_remove(struct device * dev){
- all_led_out();
-
- if(misc_deregister(&led_miscdev))
- printk("misc device is deregister!\n");
- printk("%s remove!\n",DEV_NAME);
- return 0;
- }
- static int __init led_init(void){
- int ret;
- led_dev = platform_device_register_simple(DEV_NAME,-1,NULL,0);
- if(IS_ERR(led_dev)){
- printk("failed to register device %s",DEV_NAME);
- return -EINVAL;
- }
- printk("Device is sucessfully registered.\n");
- ret = driver_register(&led_driver);
- if(ret){
- platform_device_unregister(led_dev);
- printk("failed to register driver %s",LED_DRIVER);
- return -EINVAL;
- }
- printk("Driver is sucessfully registered.\n");
- leds_init();
- return 0;
- }
- static void __exit led_exit(void){
- driver_unregister(&led_driver);
- platform_device_unregister(led_dev);
- printk("led modules exit!\n");
- }
- module_init(led_init);
- module_exit(led_exit);
- MODULE_AUTHOR("Jackie Cheung");
- MODULE_LICENSE("GPL");
复制代码 |
|