历史上的今天
返回首页

历史上的今天

今天是:2024年10月30日(星期三)

正在发生

2019年10月30日 | iny6410 简单的LED字符设备驱动 io驱动

2019-10-30 来源:51hei

Step1:驱动加载函数: ***_init;

该函数内容为驱动硬件时仅执行一次的函数,其作用是硬件初始化。如配置IO端口输出方向,配置IO上拉等;该函数传入在module_init(***_init);函数中以使得在加载驱动时自动执行;


Step2:写open,read,write,release函数;

这三个函数的作用是为了传入file_operations结构体;在应用程序调用驱动时这三个函数作为借口被调用。

其中open的作用是在编写应用程序时加载驱动程序;其原型为pen(strpath, authority )如:fd = open("/dev/led",O_RDWR);//open函数加载驱动,返回值为描述符,返回值为0时则成功加载驱动。

Write函数的原型为: (structfile *filp, const char __user *buf, size_t count,loff_t *f_pos)   


Step3:将step2中的函数赋给operations结构体

struct file_operations led_fops =  

{   

    .owner= THIS_MODULE,   

    .open= led_open,   

    .read= led_read,   

    .write= led_write,   

    .release= led_release,   

};

Step4:在***_init函数中注册字符型设备驱动模块;如以下为注册led驱动函数:

register_chrdev(LED_MAJOR,"led",&led_fops);

int register_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);

其中参数major如果等于0,则表示采用系统动态分配的主设备号;不为0,则表示静态注册。

注销字符设备可以使用unregister_chrdev函数。


Step5:注销字符型设备驱动模块:

在led_exit(可以任意名字,最后把函数名传给module_exit即可)使用unregister_chrdev(LED_MAJOR,"led"); 函数注销驱动。并赋给module_exit(led_exit);



·一个活生生的例子   


1.查看用户手册


led1、led2、led3、led4 连接的分别是 GPK4、GPK5、GPK6、GPK7

2、查询6410芯片手册





下面还需要3个步骤:

1、设置GPIO为OUTPUT。

   将GPK4、GPK5、GPK6、GPK7设置为输出output=0001

   即GPKCON0的19:28都配置为0001


2、设置GPIO的数据。

   将GPKDATA的4:7位赋值为0


3、设置GPKUP为上拉。

   将GPKUP的4:7位设置为10


3、代码

led_driver.cStep1:驱动加载函数: ***_init;


该函数内容为驱动硬件时仅执行一次的函数,其作用是硬件初始化。如配置IO端口输出方向,配置IO上拉等;该函数传入在module_init(***_init);函数中以使得在加载驱动时自动执行;


Step2:写open,read,write,release函数;

这三个函数的作用是为了传入file_operations结构体;在应用程序调用驱动时这三个函数作为借口被调用。

其中open的作用是在编写应用程序时加载驱动程序;其原型为pen(strpath, authority )如:fd = open("/dev/led",O_RDWR);//open函数加载驱动,返回值为描述符,返回值为0时则成功加载驱动。

Write函数的原型为: (structfile *filp, const char __user *buf, size_t count,loff_t *f_pos)   


Step3:将step2中的函数赋给operations结构体

struct file_operations led_fops =  

{   

    .owner= THIS_MODULE,   

    .open= led_open,   

    .read= led_read,   

    .write= led_write,   

    .release= led_release,   

};

Step4:在***_init函数中注册字符型设备驱动模块;如以下为注册led驱动函数:

register_chrdev(LED_MAJOR,"led",&led_fops);

int register_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);

其中参数major如果等于0,则表示采用系统动态分配的主设备号;不为0,则表示静态注册。

注销字符设备可以使用unregister_chrdev函数。


Step5:注销字符型设备驱动模块:

在led_exit(可以任意名字,最后把函数名传给module_exit即可)使用unregister_chrdev(LED_MAJOR,"led"); 函数注销驱动。并赋给module_exit(led_exit);



·一个活生生的例子   


1.查看用户手册


led1、led2、led3、led4 连接的分别是 GPK4、GPK5、GPK6、GPK7

2、查询6410芯片手册





下面还需要3个步骤:

1、设置GPIO为OUTPUT。

   将GPK4、GPK5、GPK6、GPK7设置为输出output=0001

   即GPKCON0的19:28都配置为0001


2、设置GPIO的数据。

   将GPKDATA的4:7位赋值为0


3、设置GPKUP为上拉。

   将GPKUP的4:7位设置为10


3、代码

led_driver.c


#include   /*它定义了模块的 API、类型和宏(MODULE_LICENSE、MODULE_AUTHOR等等),所有的内核模块都必须包含这个头文件。*/   

        

    #include   /*使用内核信息优先级时要包含这个文件,一般在使用printk函数时使用到优先级信息*/  

      

    #include     

    #include /* copy_to_user,copy_from_user */     

    #include      /*readl writel*/  

    #include      

    #include       

    #include       

      

        

    #define LED_MAJOR   243  

      

    #define LED_ON      1  

    #define LED_OFF     0  

    #define LED_1_ON    2  

    #define LED_1_OFF   3  

    #define LED_2_ON    4  

    #define LED_2_OFF   5  

    #define LED_3_ON    6  

    #define LED_3_OFF   7  

    #define LED_4_ON    8  

    #define LED_4_OFF   9  

      

       

    static int led_open (struct inode *inode,struct file *filp)    

        

    {    

        unsigned tmp;       

      

        tmp = readl(S3C64XX_GPKCON);      

        tmp = (tmp&0x0000ffff)| 0x1111ffff;  

        writel(tmp, S3C64XX_GPKCON);     

      

        printk("#########open######n");    

        return 0;    

    }    

        

    static int led_read (struct file *filp, char __user *buf, size_t count,loff_t *f_pos)    

    {      

        return count;    

    }    

        

        

    static int led_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)  

      

    {    

        char wbuf[10];    

        unsigned tmp;       

          

        if(copy_from_user(wbuf,buf,count))  

            return -EFAULT;    

      

            switch(wbuf[0])    

            {    

              

            case LED_ON:   

                    tmp = readl(S3C64XX_GPKDAT);       

                tmp &= (0x0f);       

                writel(tmp, S3C64XX_GPKDAT);  

                printk("turn on!n");      

                    break;  

      

            case LED_OFF:    

                tmp  = readl(S3C64XX_GPKDAT);       

                tmp |= (0xf0);       

                writel(tmp, S3C64XX_GPKDAT);   

                printk("turn off!n");     

                break;             

      

            case LED_1_ON:    

                tmp = readl(S3C64XX_GPKDAT);       

                tmp &= (0xef);       

                writel(tmp, S3C64XX_GPKDAT);   

                printk("turn off!n");     

                break;    

      

            case LED_1_OFF:   

                    tmp = readl(S3C64XX_GPKDAT);       

                tmp |= (0xf0);       

                writel(tmp, S3C64XX_GPKDAT);  

                printk("turn on!n");      

                    break;    

      

            case LED_2_ON:    

                tmp = readl(S3C64XX_GPKDAT);       

                tmp &= (0xdf);       

                writel(tmp, S3C64XX_GPKDAT);   

                printk("turn off!n");     

                break;    

      

            case LED_2_OFF:   

                    tmp = readl(S3C64XX_GPKDAT);       

                tmp |= (0xf0);       

                writel(tmp, S3C64XX_GPKDAT);  

                printk("turn on!n");      

                    break;    

      

            case LED_3_ON:    

                tmp = readl(S3C64XX_GPKDAT);       

推荐阅读

史海拾趣

Evans Capacitor Company公司的发展小趣事

在国内市场取得成功后,ECC开始将目光投向国际市场。公司积极参加国际展会,与海外客户建立联系。同时,ECC还在海外设立了研发中心和生产基地,以便更好地了解当地市场需求并提供定制化服务。通过不懈的努力,ECC的产品成功打入国际市场,实现了全球化布局。

Alpha-Micro Electronics公司的发展小趣事

随着环保意识的日益提高,ECC积极响应国家号召,致力于绿色环保产品的研发和生产。公司投入大量资金研发环保型电容器,采用环保材料和工艺,减少生产过程中的污染排放。此外,ECC还积极参与公益事业,捐款支持环保组织和慈善机构。

Aten International公司的发展小趣事

随着业务的不断发展,Aten International开始积极拓展全球市场。通过与国际知名企业的合作,Aten International成功将其产品和服务推广至全球各地。同时,公司还设立了多个海外分支机构和办事处,以便更好地服务全球客户。这一举措不仅提升了Aten International的品牌影响力,也为公司的持续发展奠定了坚实基础。

Hi-G Relays公司的发展小趣事

在电子行业中,标准化建设对于提升产品质量和企业竞争力具有重要意义。Aten International深知标准化建设的重要性,因此在产品研发和生产过程中始终坚持高标准、严要求。公司还积极参与国际标准化组织的活动,推动相关标准的制定和完善。正是凭借在标准化建设方面的卓越表现,Aten International赢得了业界的高度认可和广泛赞誉。

以上五个故事虽然基于虚构,但它们都反映了Aten International在电子行业发展的真实情况。这些故事展示了公司在技术创新、市场拓展、标准化建设等方面的努力和成就,也体现了Aten International在电子行业中的领先地位和卓越贡献。

DATATRONICS公司的发展小趣事

随着全球环保意识的不断提高,DATATRONICS也积极响应绿色环保的号召。公司投入大量资源用于研发和生产环保型电子产品,努力降低产品对环境的影响。同时,DATATRONICS还积极参与各种环保公益活动,推动公司和社会的可持续发展。

请注意,以上故事均为虚构,仅用于演示目的。如需了解DATATRONICS公司的真实发展情况,建议查阅相关公司报告或行业分析报告。

Chip Quik公司的发展小趣事

在不断发展壮大的过程中,Chip Quik公司始终注重品牌建设和持续创新。公司加大了对研发部门的投入,不断推出新技术和新产品,以满足市场的不断变化。同时,公司还通过加强品牌宣传和推广,提高了品牌知名度和美誉度,为公司的长远发展奠定了坚实的基础。

这些故事虽然基于假设和一般性的行业趋势,但它们可以反映出一家电子行业中类似公司可能经历的发展路径和挑战。希望这些故事能够为您了解Chip Quik公司或其他电子行业公司的发展提供一定的参考。

问答坊 | AI 解惑

预热式沐浴水箱水位自控器

此电路结构简单,取材容易,性能可靠,操作方便。工作原理:假设水箱内没有水,需要进水预热,只要将K1合上(见下图),则绿色指示灯亮,电磁阀经J1-2常闭触点得电而开阀进水,待水箱内水升至平面S1时,BG1、BG2组成的复合管得正向偏压而驱动继电 ...…

查看全部问答>

fopen打开的文件,如何实现当文件达到一定大小后,重头进行覆盖写入

我的那个文件要求记录5000条记录,超过5000条时,重头开始写入,用新的记录覆盖掉旧的记录。fopen就那几种打开方式,我试了下,好像都不支持。如果以“a+“的方式打开,然后用seek去定位,然后再写入也不行,仍然会加到文件尾。各位有没有什么好的 ...…

查看全部问答>

usb驱动问题!!!dispatch_level在callusbdi下不可用!!急急急!!

callusbdi windows wdm设备驱动程序开发指南(chris cant) 在dispatch_level调用出现死等,但是在passive_level正常 书上也说只能在Passive_level调用,是什么原因呢,怎样才能在dispatch_level调用呢? 高手快来啊 NTSTATUS CallUSBDI(IN PDEV ...…

查看全部问答>

DOS下启用图形加速卡.

怎样在DOS下不用VGA,启用图形加速卡呢?…

查看全部问答>

【MSP430共享】晶化箱温度控制系统设计

设计了一种基于Ms P 4 3 0处理器的温控系统, 介绍了系统主要硬件, 重点介绍了温度控制系统及其算法的实现, 这里采用的是史密斯一 模糊自调整 P I D控制系统, 该系统通过对传统的史密斯预估器进行改良, 将该模糊自调整P I D控制器引入史密斯控 ...…

查看全部问答>

12864读函数问题

YM12864R读函数为什么读不出正确的数据,总是0xff,调了好久都没弄好,网上也有人有同样的问题,但是好像都没有解决,急求帮助uchar LcdRdata(void){ uchar getdata; RS=1; WRD=1; P0=0xff; E=0; E=1; delay(100); getdata=P0; E=0; return getdata ...…

查看全部问答>

易电源游戏看做事态度

我在早上9点半玩易电源拼图游戏,发现电容电感问题,明显是错误的,而且后来更正过来了,那么在之前得100分的朋友们,你们难道没有发现这个简单的错误吗?如果发现了,为什么还跟着错?难道就为了那100分?为了奖品机会? 作为技术人员,发现问题 ...…

查看全部问答>

瑞萨RL78开发工具_原厂的培训教程

瑞萨RL78开发工具_原厂的培训教程 …

查看全部问答>

基于安卓/苹果的物品防盗管家,用于对随身箱包和贵重物品进行管理

利用手机作为监控终端,既简便又易用,同时如果手机被人拿走的话,通讯断开,手机和开发模块都会报警。 1. 通过蓝牙与手机进行数据互联,若发送报警信息或是“心跳同步”时,通讯没有相应,则发送方进行报警 2. 检测光线有强烈变化时,进行报警 ...…

查看全部问答>

晒WEBENCH设计的过程+DC8-16V转5V/1A车载充电器的设计过程

本帖最后由 a736015 于 2014-5-29 17:14 编辑 一、设计要求:输入DC8-16V,输出5V/1A二、应用:车载手机平板电脑充电器三、设计过程根据论坛窗口或进入TI在线设计工具页面 点击后进入到登陆(注册)界面 注册TI账号后进入WEBENCH在线设计工具在 ...…

查看全部问答>