免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4434 | 回复: 14
打印 上一主题 下一主题

读不到内核数据,请各位看看啥原因 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-21 15:55 |只看该作者 |倒序浏览
小弟刚接触驱动,写了个程序结果内核数据却无法读出请给位看一下问题出在那谢谢!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

#define DEVICE_NAME "/dev/key_test_by_atmel"

int main()
{
        int fd;
        int i;
        int buf[5];

        fd = open(DEVICE_NAME,O_RDWR);
        printf("fd == %d\n",fd);

        if(fd == -1)
        {
                printf("open failed!\n");
        }
        else
        {
                while(1)
                {
                        i = read(fd,buf,1);
                                      
                                printf("i == %d\n",i);
                       
                                printf("keyvalue == %d\n",buf[0]);
                }
        }
        return 0;
}

这是我的read函数读的时候总是返回-1
static int keypad_read(struct file *filp ,int *buf,size_t count,loff_t *f_pos)
{
        int  date[5];
        
        memset(date,0,5);
       date[0] = keyvalue;
        __copy_to_user(buf, date, count);

        
                return 0;

}

论坛徽章:
0
2 [报告]
发表于 2011-01-21 16:37 |只看该作者
return 0;
?

论坛徽章:
0
3 [报告]
发表于 2011-01-21 16:42 |只看该作者
就是回复一个返回值,函数是INT 型的,这个地方有错了?

论坛徽章:
0
4 [报告]
发表于 2011-01-21 18:04 |只看该作者
请把你的代码贴全一点,我说的是驱动代码

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
5 [报告]
发表于 2011-01-22 08:30 |只看该作者
不能返回0,否则会一直读

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
6 [报告]
发表于 2011-01-22 08:31 |只看该作者
你试试改成return 1; 看看~

论坛徽章:
0
7 [报告]
发表于 2011-01-24 08:56 |只看该作者
本帖最后由 lilysulia 于 2011-01-24 08:57 编辑

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <mach/board.h>
#include <mach/gpio.h>
#include <linux/err.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include "gpio.h"



static struct task_struct *test_task;
extern void msleep(unsigned int msecs);
int keyvalue;

int get_key7_stat(void)
{
        at91_set_gpio_input(AT91_PIN_PB7,1);
        return at91_get_gpio_value(AT91_PIN_PB7);
}
int get_key6_stat(void)
{
        at91_set_gpio_input(AT91_PIN_PB6,1);
        return at91_get_gpio_value(AT91_PIN_PB6);
}





void led_init(void)
{
    at91_set_GPIO_periph(AT91_PIN_PB7,1);
    at91_set_GPIO_periph(AT91_PIN_PB6,1);
   
    at91_set_A_periph(AT91_PIN_PB7,1);
    at91_set_A_periph(AT91_PIN_PB6,1);

}

static int example_kernel_thread(void *k)
{
        unsigned int i = 0;
        unsigned int j = 0;

        set_current_state(TASK_UNINTERRUPTIBLE);
        while(1){
                if(kthread_should_stop()) break;
                        //printk(KERN_WARNING "sss\n");
                         
                       
                        if(get_key7_stat() == 0)
                        {       
                                msleep(10);
                                i++;
                                if(i == 4)
                                {
                                      keyvalue = 1;
                                      printk("kernel1111 keyvalue == %d\n",keyvalue);

                                }
                                if(i == 12)
                                {
                                        i = 0;
                                        keyvalue = 0;
                                }
                                //msleep(100);

                        }
                        else if(get_key6_stat() == 0)
                        {
                       
                                
                                msleep(10);
                                j++;
                                if(j == 4)
                                {
                                        keyvalue = 2;
                                        printk("kernel2222 keyvalue == %d\n",keyvalue);
                                }
                                if(j == 12)
                                 {      
                                         j = 0;
                                         keyvalue = 0;
                                 }

                        }
        }
        return 0;
}




ssize_t keypad_open(struct inode *inode ,struct file *file)
{
        return 0;
}

ssize_t keypad_read(struct file *filp ,char *buf,size_t count,loff_t *f_pos)
{
        char  date[5];
        
                printk("kernel keyvalue == %d\n",keyvalue);
        if(keyvalue)
        {
                memset(date,0,5);
                memset(buf,0,5);
                       date[0] = keyvalue;
                __copy_to_user(buf, date, count);
        }
        return 1;

}

static void hello_exit(void)
{
          if(test_task){
                 kthread_stop(test_task);
                test_task = NULL;
          }
         printk(KERN_WARNING "exit gpio\n");
}

static struct file_operations keypad_fops =
{
            open:    keypad_open,
            read:    keypad_read,
};






static int hello_init(void)
{

        int ret;
        int err;
        err = register_chrdev(0, "key_test_by_zkw", &keypad_fops);
        printk(" register device NO. is: %x\n",err);

        if (err < 0)
                {
                 printk("%s (%s,%d) : Error registering s3c2410-keypad.\n",
                        __FUNCTION__, __FILE__, __LINE__);
                   return err;
                }
        else
              {
                 printk("%s (%s,%d) : s3c2410telekeypad registered.\n",
                         __FUNCTION__, __FILE__, __LINE__);
                }
        
               test_task = kthread_create(example_kernel_thread, NULL, "gpio");
        
                if(IS_ERR(test_task)){
                      printk(KERN_ALERT "kernel_thread gpio create failed \n");
                      ret = PTR_ERR(test_task);
                      test_task = NULL;
                      return ret;
            }else{
                    printk(KERN_WARNING "kernel_thread gpio create success \n");
                    wake_up_process(test_task);
                    led_init();
            }
                       
        return 0;
}



module_init(hello_init);
module_exit(hello_exit);

MODULE_DESCRIPTION("gpio test");
MODULE_LICENSE("GPL");

论坛徽章:
0
8 [报告]
发表于 2011-01-24 08:59 |只看该作者
我发现现在的问题是Main函数根本调不到驱动中的read函数,打印语句根本出不来,请各位看看什么原因谢谢!

论坛徽章:
0
9 [报告]
发表于 2011-01-24 09:40 |只看该作者
能再把步骤详细的写出来看看吗?所有打印信息也贴出来

论坛徽章:
0
10 [报告]
发表于 2011-01-24 09:58 |只看该作者
# insmod gpio.ko                                                           
register device NO. is: fb                                                     
hello_init (/home/sulia/qudong/keyctl/gpio.c,180) : s3c2410telekeypad registere.
kernel_thread gpio create success
证明驱动注册成功

# ./main                                                                  
fd == 3   
文件读取成功,

下面按键

kernel2222 keyvalue == 2                                                        
kernel2222 keyvalue == 2                                                        
kernel2222 keyvalue == 2                                                        
kernel2222 keyvalue == 2                                                        
kernel1111 keyvalue == 1                                                        
kernel1111 keyvalue == 1                                                        
kernel2222 keyvalue == 2                                                        
kernel2222 keyvalue == 2                                                        
kernel1111 keyvalue == 1
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP