iny6410 简单的LED字符设备驱动 io驱动

发布者:oplkjjj最新更新时间:2019-10-30 来源: 51hei关键字:iny6410  LED字符  设备驱动  io驱动 手机看文章 扫描二维码
随时随地手机看文章

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);       

[1] [2] [3]
关键字:iny6410  LED字符  设备驱动  io驱动 引用地址:iny6410 简单的LED字符设备驱动 io驱动

上一篇:ARM与嵌入式入门的建议
下一篇:三星S3C2440 ARM920T内核处理器寄存器整理--非常有用的资料

推荐阅读最新更新时间:2024-11-16 22:52

Tiny210驱动之USB设备驱动程序
usbmouse_as_key.c驱动源码: //参考源码: drivers\hid\usbhid\usbmouse.c #include linux/kernel.h #include linux/slab.h #include linux/module.h #include linux/init.h #include linux/usb/input.h #include linux/hid.h static struct input_dev *uk_dev; static char *usb_buf; static dma_addr_t usb_buf_phys; static int len; static
[单片机]
AVR六个IO驱动液晶LCD1602
液晶LCD1602比中文大液晶12864较容易驱动,这个驱动程序只用六个单片机IO口驱动,可以减少四个IO口,套用也方便... //LCD1602.h /*--------------------------------------------------------------- 要使用本驱动,改变下面配置信息即可 注意:RW要接地 -----------------------------------------------------------------*/ #define LCD_EN_PORT PORTD //以下2个要设为同一个口 #define LCD_EN_DDR DDRD #define LCD_R
[单片机]
ARM开发之linux字符驱动的编写----LED驱动为例
相应头文件: #include #include #include #include #include #include #include #include #include 开发步骤: 0.驱动开发的简单架构 1.定义设备结构体 2.申请设备号 3.定义文件操作集 4.设备初始化 5.注册设备 6.申请物理内存区 7.通过映射物理地址来获得相应虚拟地址 8.创建设备的类 9.创建设备文件结点 10.应用程序的编写 11.代码演示 0.驱动开发的简单架构 驱动代码虽然也是用C语言编写,但没有main函数。取而代之有起始宏( module_init()
[单片机]
ARM开发之linux<font color='red'>字符</font>型<font color='red'>驱动</font>的编写----<font color='red'>LED</font><font color='red'>驱动</font>为例
CAN能信卡的Linux设备驱动程序设计实现
    摘要: 介绍了Linux下设备驱动程序的结构,描述了CAN通信卡设备驱动程序的软件框架以及如何将CAN设备驱动程序加入到Linux系统内核中。讨论了具体实现中为了提高通信效率和通信能力,改进设备驱动程序的缓冲区管理以及利用Linux的特点合理设计中断处理程序。     关键词: Linux操作系统 设备驱动程序 CAN通信卡 中断处理程序 目前,许多工业现场如电力系统、化工系统等大量使用控制器局部网(CAN-Controller Area Network)现场总线网络,CAN通信卡作为计算机的外设将计算机接入CAN网络。市场上有不少CAN通信卡,但基本上都不带Linux驱动程序,当需要在Linu
[应用]
STM32的IO口灌入电流和输出驱动电流最大是多少?
最大可以输出8mA,灌入20mA,但要保证所有进入芯片VDD的电流不能超过150mA,同样所有从VSS流出的电流也不能超过150mA。 详细请看STM32的数据手册中的相关内容。 例如,STM32F103中容量产品,需要看5.2节和5.3.12节,里面有更详细的数据: http://www.st.com/stonline/products/literature/ds/13587.pdf STM32F103X8B
[单片机]
STM32的<font color='red'>IO</font>口灌入电流和输出<font color='red'>驱动</font>电流最大是多少?
基于TMS320DM642的网络摄像机的设计
 随着网络技术和多媒体技术的广泛应用,数字网络视频得到了飞速发展.在网络视频会议和网络监控领域中,将传统的模拟视频信号转换成数字视频信号,并且借助于现有的IP网络进行传输已成为当今的一大热点.   从技术实现方式来讲,通常是采用网络摄像机来实现.目前市场上的网络摄像机一般有两类:一类是普通摄像机加视频网关构成,但是这种方案体积庞大、操作繁琐;另一类是把全部网络接入功能都集成在摄像机中,其体积小、功能全、易于使用和维护.后类摄像机有多种解决方案,本文提出一种基于嵌入式DSP的设计方案,并且给出具体的硬件及软件实现.    1 硬件系统设计   1.1嵌入式处理器TMS320DM642   TMS320DM642(以
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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