主题 : 驅動程式問題 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 18795
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2010-04-13
最后登录: 2010-09-03
楼主  发表于: 2010-07-26 13:46

 驅動程式問題

我發現我加入一個timer.c的driver進入核心,編譯也完成,
查看dmesg也有initialized.但是我呼叫open就是不會動作.
而這程式是由pwm.c修改而來,請大家看看到底問題在哪裡

==========mini2440_pwm.c====================
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <plat/regs-timer.h>
#include <mach/regs-irq.h>
#include <asm/mach/time.h>
#include <linux/clk.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/miscdevice.h>

#define DEVICE_NAME     "pwm"

static struct semaphore lock;

static int s3c24xx_pwm_open(struct inode *inode, struct file *file)
{
           printk("TEST_PWM_PRINTK \n");
    if (!down_trylock(&lock))
        return 0;
    else
        return -EBUSY;
}


static int s3c24xx_pwm_close(struct inode *inode, struct file *file)
{
    up(&lock);
        return 0;
}

static struct file_operations dev_fops = {
    .owner   =   THIS_MODULE,
    .open    =   s3c24xx_pwm_open,
    .release =   s3c24xx_pwm_close,
};

static struct miscdevice misc = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = DEVICE_NAME,
    .fops = &dev_fops,
};

static int __init dev_init(void)
{
    int ret;

    init_MUTEX(&lock);
    ret = misc_register(&misc);

    printk (DEVICE_NAME"\tinitialized\n");
        return ret;
}

static void __exit dev_exit(void)
{
    misc_deregister(&misc);
}

module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FriendlyARM Inc.");
MODULE_DESCRIPTION("S3C2410/S3C2440 PWM Driver");

==========mini2440_timer.c====================
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <plat/regs-timer.h>
#include <mach/regs-irq.h>
#include <asm/mach/time.h>
#include <linux/clk.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/miscdevice.h>

#define DEVICE_NAME     "timer"

static struct semaphore lock;

static int s3c24xx_timer_open(struct inode *inode, struct file *file)
{
           printk("TEST_TIMER_PRINTK \n");
    if (!down_trylock(&lock))
        return 0;
    else
        return -EBUSY;
}


static int s3c24xx_timer_close(struct inode *inode, struct file *file)
{
    up(&lock);
        return 0;
}

static struct file_operations dev_fops = {
    .owner   =   THIS_MODULE,
    .open    =   s3c24xx_timer_open,
    .release =   s3c24xx_timer_close,
};

static struct miscdevice misc = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = DEVICE_NAME,
    .fops = &dev_fops,
};

static int __init dev_init(void)
{
    int ret;

    init_MUTEX(&lock);
    ret = misc_register(&misc);

    printk (DEVICE_NAME"\tinitialized\n");
        return ret;
}

static void __exit dev_exit(void)
{
    misc_deregister(&misc);
}

module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FriendlyARM Inc.");
MODULE_DESCRIPTION("S3C2410/S3C2440 Timer Driver");

==========pwm_test.c====================
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>

static int fd = -1;

int main(int argc, char **argv)
{
    fd = open("/dev/pwm", 0);
    if(fd<0)
    {
            printf("Open /dev/pwm failed!\n");
            exit(1);
        }
    while( 1 );
    close(fd);

}

==========timer_test.c====================
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>

static int fd = -1;

int main(int argc, char **argv)
{
    fd = open("/dev/timer", 0);
    if(fd<0)
    {
            printf("Open /dev/timer failed!\n");
            exit(1);
        }
    while( 1 );
    close(fd);

}

==========drivers\char\Kconfig====================
加入
config MINI2440_TIMER
    tristate "TIMER Driver Support for Mini2440"
    depends on MACH_MINI2440
    default y if MACH_MINI2440
    help
      This is Timer driver on Mini2440 boards.

==========drivers\char\Makefile====================
加入
obj-$(CONFIG_MINI2440_TIMER)    += mini2440_timer.o

然後
make distclean
cp config_mini2440_t35 .config
make menuconfig
確認剛剛的timer driver有加入
存檔離開
make zImage
然後把編譯好的zImage下載到板子

在console底下
/home/plg/
執行 ./pwm_testing
可以看到
TEST_PWM_PRINTK

執行 ./timer_testing
卻甚麼都看不到......
為什麼呢??
级别: 新手上路
UID: 18795
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2010-04-13
最后登录: 2010-09-03
1楼  发表于: 2010-07-27 09:40
各位大俠前輩高手們...拜託拜託....
幫忙小弟看看...