当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > 应用程序编写和驱动编写流程
应用程序编写和驱动编写流程
时间:2016-12-14作者:华清远见

应用程序编写流程:

图 1

int main(int argc, const char *argv[])

图 2

打开设备设备:
        fd = open("/dev/key", O_RDWR);
        打开失败的三个原因:
        1、设备节点没有创建;
        2、驱动模块没有插入(insmod xxx.ko);
        3、权限不允许;

图 3

为当前进程注册SIGIO信号;
        signal( SIGIO, 图4 );

图 4

handler

图 5

1、
        设置设备文件的属主为当前进程
        fcntl(fd, F_SETOWN, getpid());
        2、
        读取当前设备文件的标志
        oflags = fcntl(fd, F_GETFL);
        3、
        在文件现有标志的基础上增加FASYNC标志
        图6

图 6

fcntl(fd, F_SETFL, oflags | FASYNC);

图 7

进程睡眠;
        While(1)
        {
                sleep(1);
        }

图 8

void handler(int signo)
        {
                int key;
                read(fd, &key, sizeof(key));
                printf("key = %d\n", key);
        }

驱动编写流程:

图 9

static int s5pc100_key_init(void)

图 10

根据主、次设备号生成设备号
        MKDEV(major, minor)

图 11

向内核注册设备号
        register_chrdev_region(设备号,连续申请几个设备号,设备号名称)

图 12

初始化cdev、注册cdev;
        cdev_init( 图13, 图14);
        cdev.owner = THIS_MODULE;
        cdev_add( 图15, devno , number_of_device );

图 13

&cdev

图 14

&s5pc100_key_fops

图 15

&cdev

图 16

结束

图 17

struct cdev cdev;

图 18

struct file_operations s5pc100_key_fops = {
                .owner = THIS_MODULE,
                .open = 图19
                .release = 图20
                .read = 图21
                .fasync = 图22
        };

图 19

s5pc100_key_open,

图 20

s5pc100_key_release,

图 21

s5pc100_key_read,

图 22

s5pc100_key_fasync,

图 23

static int s5pc100_key_open(struct inode *inode, struct file *file)
        {
                申请中断资:( 中断号、 对应的中断处理函数、中断类型、 中断名称、 用户参数 )
                request_irq( IRQ_EINT(1), 图24 IRQF_DISABLED | IRQF_TRIGGER_FALLING, "key1", NULL );
                ……
        }

图 24

key_interrupt,

图 25

static int s5pc100_key_release(struct inode *inode, struct file *file)
        {
                释放中断资源:(中断号, 用户参数)
                free_irq( IRQ_EINT(1), NULL );
         nbsp;       ……
                注销异步通知;
                s5pc100_key_fasync(-1, file, 0);
        }

图 26

static ssize_t s5pc100_key_read(struct file *file, char __user *buf, size_t count, loff_t *loff)
        {
                ……
                拷贝数据到用户空间;
                copy_to_user(buf, (char *)&key, sizeof(int))
                ……
        }

图 27

static int s5pc100_key_fasync(int fd, struct file *file, int on)
        {
                处理FASYNC标志;
                return fasync_helper( fd, file, on, &key_struct );
        }

图 28

irqreturn_t key_interrupt( int irqno, void *devid )
        {
                switch(irqno)
                {
                        根据中断号,判断键值;
                        case IRQ_EINT(1): key = 1; break;
                        ……
                }
                向进程发送SIGIO信号;
                图29
        }

图 29

kill_fasync( &key_struct, SIGIO, POLL_IN );

流程图

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)