Linux内核编程(五)----------驱动开发基础一

写在前面:本篇主要介绍内核编程的基础知识。

正文:

 一 、驱动程序访问硬件的特殊性:
    (1)、DMA:
        DMA基本概念:是存在于外设设备中的一个硬件控制器,作用是不需要CPU协助,就可以搬移内存的数据到外设的存储设备中。

        DMA的基本配置过程:程序配置DMA控制器,告诉DMA控制器它可以访问的内存地址,然后CPU将要传给外设的数据写到事先约定好的地址中。

    (2)、IO子系统:在嵌入式系统中,是实现对外围附属设备进行控制的有效手段,通过IO端口高低电平0或者1的变化,可以发指令或者传递信息给附属设备。
        使用举例:
            IO子系统初始化:
                smdkv210_map_io    :这个函数主要是确定IO默认复用情况
            IO系统的使用:
                int gpio_request(unsigned gpio, const char *label);  //申请一个gpio, 参数:gpio :端口号; *label :给这个端口一个命名

                static inline int gpio_direction_output(unsigned gpio, int level);

                void gpio_set_value(unsigned gpio, int value);

                void gpio_free(unsigned gpio); //释放gpio

二、Linux设备模型

        1、kobject: kernel object的缩写
            (1)、一个设备驱动会建立一个kobject,偶尔也会因为功能复杂的原因建立多个kobject;kobject是个结构体

    
            (2)、每个kobject都会有个kobj_type属性
            (3)、kobject使用举例:
                drivers/input/touchscreen/touchit213.c:
                初始化kobject:   touchit213_connect->input_allocate_device(分配一个输入设备)->device_initialize(设备初始化)->kobject_init
                注册kobject到内核:input_register_device->input_register_device->kobject_add
        2、kset: 是一组有类似性质的kobject的集合;    

          kset是一个结构体,
             struct kset {
                struct list_head list;
                spinlock_t list_lock;
                struct kobject kobj;
                const struct kset_uevent_ops *uevent_ops;
                };
            *uevent_ops 就是这一组kobject所共同的uevent处理函数。
            一般来说,一个kset其实也就是一个子系统,他是sysfs的一个顶层目录的表征。比如block子系统,各种总线系统等。
        3、sysfs:sysfs算是一个虚拟文件系统,是kobject对象的完整视图,提供了丰富的内核与用户空间交互的手段
            主要操作sysfs的api:
                int sysfs_create_file(struct kobject * kobj, const struct attribute * attr)
                int sysfs_create_link(struct kobject *kobj, struct kobject *target, const char *name)
                void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr)
                void sysfs_remove_link(struct kobject * kobj, const char * name)
                举例:
                    输入设备的注册:input_register_device->device_add->device_create_file->sysfs_create_file
            sysfs的主要目录结构:
                block:块设备,他们独立于所连接的总线
                devices:所有被内核识别的硬件设备,依照连接他们的总线对其进行组织//device_register
                bus:系统中用于连接设备的总线
                drivers:在内核中注册的设备驱动程序 //driver_register:会注册相应的驱动程序的入口,从而使得设备匹配驱动时,可以调用驱动。
                class:系统中设备的类型(声卡、网卡、显卡等),同一类可能包含由不同总线连接的设备,于是由不同的驱动程序驱动。
                power:处理一些硬件设备电源状态的文件
                firmware:处理一些硬件设备的固件文件。
        4、udev:处理热插拔的机制,通过设备驱动加载时,注册kobject后,向用户空间发送uevent实现的。
                
    三、    Linux驱动的分类:
        1、字符设备:主要特点是以串行(字节)顺序依次进行访问,典型的包括触摸屏,鼠标,按键等。        
            cdev结构体(characteristic  device)
            struct cdev {
                struct kobject kobj;
                struct module *owner;
                const struct file_operations *ops;
                struct list_head list;
                dev_t dev;
                unsigned int count;
                };
        2、块设备:主要特点是以扇区、块等单位进行读写访问,主要例子:硬盘、cdrom、flash等
            block_device结构体
        3、网络设备:主要是以太网类的设备ethernet devices:net_device 结构体
        4、杂项设备:没法归类的驱动程序,其中有些是复合设备。
            

发布了91 篇原创文章 · 获赞 160 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/weixin_40204595/article/details/88079735