4412 Linux设备总线

发布者:advancement4最新更新时间:2022-01-05 来源: eefocus关键字:Linux 手机看文章 扫描二维码
随时随地手机看文章

总线_设备_驱动注册流程详解 

注册流程图


• 设备一般都需要先注册,才能注册驱动
– 现在越来越多的热拔插设备,反过来了。先注册驱动,设备来了再注册

设备

• 本节使用的命令
– 查看总线的命令#ls /sys/bus/
– 查看设备号的命令#cat /proc/devices
• 设备都有主设备号和次设备号,否则255个设备号不够用
– 查看杂项设备号的命令#cat /proc/misc 


二、总线设备注册

关于注册设备的一点说明

• 早先的Linux会使用单独的文件注册设备,现在大多是使用引入的虚拟平台,使用虚拟平台来注册设备会容易很多
• 如果大家在网上看到大段的注册设备的代码,可简单了解一下,知道有这么个东西就成,不用去深究。不要去学习“屠龙技”,现在基本都是直接在平台文件中注册设备 
注册设备
• 注册设备使用结构体platform_device,该结构体在头文件“vim include/linux/platform_device.h”中。头文件中也有注册设备和卸载设备的函数,了解即可 

操作过程

– 注册设备。将设备结构体放到平台文件中,会自动注册设备,不用去调用注册设备的函数。


vim arch/arm/mach-exynos/mach-itop4412.c


添加设备注册


#ifdef CONFIG_HELLO_CTL

struct platform_device s3c_device_hello_ctl = {

        .name   = "hello_ctl",

        .id             = -1,

};

#endif


#ifdef CONFIG_LEDS_CTL

struct platform_device s3c_device_leds_ctl = {

        .name   = "leds",

        .id             = -1,

};

#endif


和这个


#ifdef CONFIG_HELLO_CTL

    &s3c_device_hello_ctl,

#endif


#ifdef CONFIG_LEDS_CTL

    &s3c_device_leds_ctl,

#endif


– 在Kconfig文件中添加编译HELLO设备的宏定义(前面教程中已经添加)
– 配置menuconfig中的HELLO宏定义,生成新的.config文件
– 生成新的zImage
• 注册完之后在虚拟平台总线下可以查到注册的设备
– ls /sys/devices/platform/ 

中间遇到的问题:编译make zImage的时候提示


arch/arm/mach-exynos/mach-itop4412.c:2997: error: 's3c_device_hello_ctl' undeclared here (not in a function)

这个的没有写正确


#ifdef CONFIG_HELLO_CTL

struct platform_device s3c_device_hello_ctl = {

 

三、总线驱动注册

头文件

• 驱动注册使用结构体platform_driver,该结构体在头文件“vim include/linux/platform_device.h”中
• 驱动注册platform_driver_register,驱动卸载函数 platform_driver_unregister也在这个头文件中
– 这两个函数的参数都只有结构体platform_driver 


struct platform_driver {

    int (*probe)(struct platform_device *);

    int (*remove)(struct platform_device *);

    void (*shutdown)(struct platform_device *);

    int (*suspend)(struct platform_device *, pm_message_t state);

    int (*resume)(struct platform_device *);

    struct device_driver driver;

    const struct platform_device_id *id_table;

};


注册结构体

• 驱动常见的几种状态,初始化,移除,休眠,复位
– 就像PC一样,有的驱动休眠之后无法使用,有的可以使用;有的系统唤醒之后,驱动需要重新启动才能正常工作,也有直接就可以使用等等
• probe函数:platform_match函数匹配之后,驱动调用的初始化函数
• remove函数: 移除驱动函数
• suspend函数: 悬挂(休眠)驱动函数

• resume函数: 休眠后恢复驱动
• device_driver数据结构的两个参数
– name和注册的设备name要一致
– owner一般赋值THIS_MODULE 

register driver

#include

#include


/* device register header file, include device and driver struct

 * register and remove function */

#include


#define DRIVER_NAME "hello_ctl"


MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("TOPEET");


static int hello_probe(struct platform_driver *pdv)

{

    printk(KERN_EMERG "tinitializedn");

    return 0;

}


static int hello_remove(struct platform_driver *pdv)

{

    return 0;

}


static void hello_shutdown(struct platform_driver *pdv)

{


}


static int hello_suspend(struct platform_driver *pdv)

{

    return 0;

}


static int hello_resume(struct platform_driver *pdv)

{

    return 0;

}


struct platform_driver hello_driver = {

    .probe    = hello_probe,    

    .remove   = hello_remove,

    .shutdown = hello_shutdown,

    .suspend  = hello_suspend,

    .resume   = hello_resume,

    .driver = {

        .name  = DRIVER_NAME,

        .owner = THIS_MODULE,

    }

};


static int hello_init(void)

{

    int DriverState;


    printk(KERN_EMERG "Hello world enter!n");

    DriverState = platform_driver_register(&hello_driver);


    printk(KERN_EMERG "tDriverState is %dn", DriverState);

    return 0;

}


static void hello_exit(void)

{

    printk(KERN_EMERG "Hello world exit!n");

    platform_driver_unregister(&hello_driver);

}


module_init(hello_init);

module_exit(hello_exit);

 

实验

• 在mini_linux_module的基础上添加驱动注册部分

• 编译,在开发板上加载和卸载驱动 


mount -t nfs -o nolock 192.168.2.147:/home/topeet/linux /mnt/nfs

挂载了nfs后,加载内核后


[root@iTOP-4412]# insmod probe_linux_module.ko                                                                     

[ 8454.570719] Hello world enter!

[ 8454.572614]  initialized

[ 8454.582781]  DriverState is 

[root@iTOP-4412]# rmmod probe_linux_module                                                                         

[ 8647.985422] Hello world exit!


关键字:Linux 引用地址:4412 Linux设备总线

上一篇:4412 杂项设备
下一篇:4412 make menuconfig和make

推荐阅读最新更新时间:2024-11-06 08:22

实操经验分享——在STM32上移植Linux
刚从硬件跳槽为嵌软时,没有任何一丝的准备。一入职,领导就交代了一项特难的任务——在stm32上移植linux! 瞬间我就懵了,没办法硬着头皮上吧,先搜集资料,我之前跑的是ok6410的板子上运行的linux,现在是在stm32上移植,以前stm32倒是玩过,研究生期间就捣鼓过它,但现在还没从抓烙铁的硬件当中缓过神来,就转到嵌入式软件的开发,更头疼的是stm32没有MMU!没有MMU!找了一下,好吧,有个uClinux! 于是开始学习各种相关的知识,了解到linux的启动一般是u-boot——》liunx内核——》根文件系统,那么首先要做个基于stm32的u-boot,先初始化时钟、外设、中断什么的,看了韦东山老师的视频感觉
[单片机]
嵌入式Linux的低功耗策略研究
摘 要:功耗是嵌入式设备的一个十分重要的性能指标。在硬件设计和选型之后,功耗水平在极大程度上取决于软件的设计。鉴于Lioux在嵌入式设备中的应用日益广泛,提出在嵌入式Linux下软件编写的几种策略。通过这些软件编写方式,能有效降低最终产品的功耗水平。 关键词:嵌入式Linux功耗策略 引 言 由于Linux系统具有嵌入式操作系统需要的很多特色,如适应于多种CPU和多种硬件平台、性能稳定、可裁剪性很好、源码开放、开发和使用简单等。目前,基于Linux应用的嵌入式设备日益增多,Linux正在嵌入式领域发挥着越来越重要的作用。 对于嵌入式设备尤其是移动设备来说,功耗是系统的重要指标,系统设计的重要目标之一就是要尽可能地降低功耗
[嵌入式]
UBIFS文件系统搭建与配置(Micro2440 + linux 2.6.39)
1. UBIFS文件系统配置 a) 内核配置 2.6.27以后,ubifs被整合进内核树中,本文档所使用的2.6.39内核中已经包好UBIFS的相关代码,因此直接进行make menuconfig配置即可。 Device Drivers --- * Memory Technology Device (MTD) support --- * Enable UBI - Unsorted block images --- File systems --- Miscellaneous filesystems ---
[单片机]
UBIFS文件系统搭建与配置(Micro2440 + <font color='red'>linux</font> 2.6.39)
基于Linux操作系统的ARM/DSP多机I2C通信设计方案
  引言   在很多嵌入式控制系统中,系统既要完成大量的信息采集和复杂的算法,又要实现精确的控制功能。采用运行有嵌入式Linux操作系统的ARM9微控制器完成信号采集及实现上层控制算法,并向DSP芯片发送上层算法得到控制参数,DSP芯片根据获得的参数和下层控制算法实现精确、可靠的闭环控制。   1 多机系统组成   该多机控制系统以ARM9微控制器s3c2440为核心,采用I2C总线挂载多个DSP芯片TMS320F28015作为协控制器,构成整个控制系统的核心。   1.1 S3C2440及TMS320F28015简介   Samsung公司的处理器S3C2440是内部集成了ARM公司ARM920T处理器内核的32位微控
[单片机]
基于<font color='red'>Linux</font>操作系统的ARM/DSP多机I2C通信设计方案
ARM三星等成立Linux合资公司
北京时间6月3日晚间消息,据国外媒体报道,德州仪器、ARM以及另4家科技公司已经展开合作,增加对采用免费Linux系统的设备的投资。这将在手机市场对微软形成挑战。    这些芯片公司周四宣布,已经成立名为Linaro的合资企业,并希望它们的投资能推动市场对高端手机,以及其他采用开源、免费Linux系统的设备的需求。这将帮助这些企业销售更多高端芯片组,提升平台的平均售价。    市场上目前的Linux版本包括谷歌Android、LiMo、诺基亚和英特尔的MeeGo、Ubuntu,以及Palm的WebOS。根据Gartner的数据,Android目前已经超过微软Windows Mobile,成为市场份额第四的智能手机操作系统
[半导体设计/制造]
基于嵌入式Linux与ARM双USB接口的视频存储
    针对长途客车“三超”(中途超载上人,超时,超速)以及在非正常停靠站私自停车上人导致的客车超载,同时目前市面上视频监控设备由于体积大、成本高等,使其难以推广应用在车辆中等问题,整合USB摄像头低成本、USB存储介质较SD(Secure Digital Memory Card)卡存储速度更快、支持更大容量等优点,提出了基于嵌入式。Linux及S3C2440平台的双uSB接口车载视频存储方案。本方案主要利用单片机判别模块采集车辆行驶过程中运动状态信息(是否超速,存在急刹车、中途停车超时等),并结合车门在车速为零时的开闭对长途客车在非正常停靠点超载上人进行主动视频监控,便于以后的责任追究和认定,为监控中心的管理提供辅助。 1 系统总
[嵌入式]
基于嵌入式Linux系统的导航软件设计思路
1 引言 随着汽车等各种车辆交通工具的普及,车辆导航设备的需求也变得日益旺盛。作为车载设备。不仅要有可靠的性能,而且需要具有便携、低功耗和低价格等特点。而采用基于ARM微处理器的嵌入式系统与GPS模块相配合的GPS导航终端机的设计方案,可以很好的满足这一系统需求。为此,本文介绍了一种利用ARM9开发板和GPS模块实现GPS导航功能的终端机的软硬件结构和设计方法。 2 GPS导航系统结构 本文所介绍的GPS全球定位导航系统按功能可分为嵌入式主控模块、GPS模块、显示模块、扩展模块及供电模块等五大部分。 嵌入式主控模块基于S3C2440处理器,主要负责对GPS导航模块数据的响应、处理和控制。在硬件上,主控模块就是一个嵌入式开发
[单片机]
基于嵌入式<font color='red'>Linux</font>系统的导航软件设计思路
Tiny 6410的Linux学习总结!
1、Tiny6410的Linux系统修改IP地址: vi /etc/eth0-setting 2、Ubuntu14.04自动以root身份登录系统: /etc/lightdm/lightdm.conf 更改为以下内容:重启后自动以Root身份登录 autologin-guest=false autologin-user=root autologin-user-timeout=0 autologin-session=lightdm-autologin
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved