打印

吐槽下我的linux学习过程。

[复制链接]
1839|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
买了开发板和国嵌的全套视频。。自认为基础还可以,学了三个周的驱动开发,还是特别混乱,感觉很头晕呀!2440的功能都被内核代码给封装的不知道去那里找!别人写的代码基本上能看懂,有些还是要去翻书,查资料。。。。。何日能学出头,有所成呀!

相关帖子

沙发
zhaigch|  楼主 | 2012-3-4 23:21 | 只看该作者
有没有匠人,请教呀!

使用特权

评论回复
板凳
云的追寻| | 2012-3-5 00:22 | 只看该作者
慢慢来啊,我都学了五个月了…没人教,进度慢,但知识扎实,国嵌视频正在进行最后一课程
专注**就会成功…

使用特权

评论回复
地板
dgun| | 2012-3-6 15:53 | 只看该作者
...刚开始学嘛

使用特权

评论回复
5
zhaigch|  楼主 | 2012-3-6 23:14 | 只看该作者
3楼的哥们 也看国嵌的视频呢!哈哈!我看完了。还是不会写呀!

使用特权

评论回复
6
zhaigch|  楼主 | 2012-3-6 23:16 | 只看该作者
今天晚上我写了一个开发板上,按建中断的程序!我怎么发现循环读按建时,while(1){read();}时,程序进入内核就运行不出来了!而用xxx:.....   goto xxx;时运行时正常的!不解呀??有没有高人给分析下!

使用特权

评论回复
7
zhaigch|  楼主 | 2012-3-6 23:19 | 只看该作者
。。。

main.JPG (45.67 KB )

main.JPG

使用特权

评论回复
8
zhaigch|  楼主 | 2012-3-6 23:20 | 只看该作者
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>

struct btn_irq {
        int irq;
        int pin;
        char name[10];
       
        };
static struct btn_irq btns_irq[6]={
        {.irq=IRQ_EINT8,.pin=S3C2410_GPG0,.name="key0" ,},
        {.irq=IRQ_EINT11,.pin=S3C2410_GPG3,.name="key1",},
        {.irq=IRQ_EINT13,.pin=S3C2410_GPG5,.name="key2",},
        {.irq=IRQ_EINT14,.pin=S3C2410_GPG6,.name="key3",},
        {.irq=IRQ_EINT15,.pin=S3C2410_GPG7,.name="key4",},
        {.irq=IRQ_EINT19,.pin=S3C2410_GPG11,.name="key5",}
        };
static volatile int key_press=0;
static volatile int key_no=6;
static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

static irqreturn_t button_isr(int irq,void *dev_id)
{
        int down;
        int i;
        for(i=0;i<6;i++)
        {
                if(irq==btns_irq[i].irq)
                {
                        down=!s3c2410_gpio_getpin(btns_irq[i].pin);
                        if(!down)
                        {
                                key_press=1;
                                key_no=i;
                                wake_up_interruptible(&button_waitq);       
                        }
                        else
                        {
                                key_press=0;       
                        }
                }       
        }
        return IRQ_RETVAL(IRQ_HANDLED);
}

int btn_open(struct inode *inode,struct file *filp)
{
        int i;
        int err=0;
        for(i=0;i<6;i++)
        {
                err=request_irq(btns_irq[i].irq,button_isr,IRQ_TYPE_EDGE_RISING,btns_irq[i].name,NULL);       
        }

        key_press=0;
        return 0;       
}

static int btn_read(struct file *filp,char *buff,size_t count,loff_t *offp)
{
        if(!key_press)
                {
                        if(filp->f_flags&O_NONBLOCK)
                                return -EAGAIN;
                        else
                                wait_event_interruptible(button_waitq,key_press);       
                }
        key_press=0;
        /*调试时用来显示按键的按下
        if(key_no<6)
        {
                printk("the %s is press down\n",btns_irq[key_no].name);
                key_no=6;
        }
        */

        copy_to_user(buff,btns_irq[key_no].name,count);
        return 0;
}

static int btn_close(struct inode *inode,struct file *filp)
{
        int i;
        for(i=0;i<6;i++)
        {
                free_irq(btns_irq[i].irq,NULL);
        }
        //printk("kernel close \n");
        return 0;       
}
static struct file_operations btn_fops={
        .owner  = THIS_MODULE,
        .open   = btn_open,
        .release= btn_close,
        .read   = btn_read,
        };
static int __init buttondev_init(void)
{
                int ret=register_chrdev(240,"/dev/buttondev",&btn_fops);
                if(ret<0)
                        return ret;
                return 0;
}
static void __exit buttondev_exit(void)
{
        unregister_chrdev(240,"buttondev");
}
module_init(buttondev_init);
module_exit(buttondev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("SUST");

使用特权

评论回复
9
云的追寻| | 2012-3-7 00:53 | 只看该作者
仅是我的理解,你用while的时候cpu一直被占用,不能释放出来获取按键的状态,而用go to时,代码之间的极短时间内cpu是可以释放做别的事的,获取按键状态没问题…

使用特权

评论回复
10
zhaigch|  楼主 | 2012-3-9 18:51 | 只看该作者
while时程序一直在内核驱动中运行,无法跳出来。goto时,去跳出来了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

158

帖子

1

粉丝