Smart210---LED驱动

发布者:快乐旋律最新更新时间:2025-01-22 来源: cnblogs关键字:Smart210  LED驱动  基本框架 手机看文章 扫描二维码
随时随地手机看文章

经过几天的学习,终于linux驱动的基本框架弄清楚了。。。真的很艰辛,,,不过终于还是熬过来了,虽然还是最基础的,,,


今晚也完成了我第一个linux驱动,,,心里还是有点小兴奋的,哈哈O(∩_∩)O


直接上驱动源程序吧:::


我的开发板是Smart210,根据原理图,IO口输出0 led亮,输出1 led灭 


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

   

#include gpio.h>

#include

#include





#define DEVICE_NAME 'leds'

  /* 应用程序执行ioctl(fd, cmd, arg)时的第2个参数 */

  /*the second parameter that application program execute*/

  #define IOCTL_GPIO_ON         1

  #define IOCTL_GPIO_OFF        0

  /* 用来指定LED所用的GPIO引脚 */

  /*appoint the pin the LED will use*/

  static unsigned long leds_table [] =

  {

          S5PV210_GPJ2(0),

          S5PV210_GPJ2(1),

          S5PV210_GPJ2(2),

          S5PV210_GPJ2(3),

          //archarmmach-s5pv210includemachgpio.h

  };

  static char leds_name[][4]={{'LED1'},{'LED2'},{'LED2'},{'LED3'}};

  #define LED_NUM                ARRAY_SIZE(leds_table)

   /**

  *函数功能:打开/dev/led设备

  *fuction:open /dev/leds device

  *设备名是:/dev/leds

  *devce name: /dev/leds

  **/

  static int my_led_open(struct inode *inode, struct file *file)

  {

       int i;

       int err;

   

       for (i = 0; i < LED_NUM; i++)

       {

           err = gpio_request(leds_table[i], leds_name[i]);

                      //drivers/gpio/gpiolib.c

           if(err)

           {

              printk(KERN_ERR 'failed to request S5PV210_GPH2(%d) for LED%d n',i-1,i);

              return err;

           }

       }

   

       for (i = 0; i < LED_NUM; i++)

       {

         s3c_gpio_cfgpin(leds_table[i], S3C_GPIO_OUTPUT);//Configuration pin function:input output multiplex

         gpio_set_value(leds_table[i], 1);//Set the pin level

          //archarmplat-samsunggpio-config.c

//          gpio_direction_output(leds_table[i], 0);//write a value to GPIO port ,also set the port to output mode

//          gpio_set_value(leds_table[i], 0);

          //drivers/gpio/gpiolib.c

   

       }

      printk(KERN_INFO 'LEDs driver successfully closen');

       return 0;

  }




 static long my_led_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)

 {

    arg -= 1;

    if(arg > LED_NUM) {

        return -EINVAL;

    }


    switch(cmd) {

        case IOCTL_GPIO_ON:

            printk('led lightn');

            gpio_set_value(leds_table[arg], 0);

        break;


        case IOCTL_GPIO_OFF:

            printk('led no lightn');

            gpio_set_value(leds_table[arg], 1);

        break;


        default:

            printk('led failedn');

            return -EINVAL;

    }

    return 0;

 }


 static int my_led_close(struct inode * inode,struct file * file)

 {

     int i;

    for(i= 0; i < LED_NUM; i++)

        gpio_free(leds_table[i]);

    printk(KERN_EMERG'close successn');

    return 0;

 }


struct file_operations my_led_ops = {

    .owner = THIS_MODULE,

    .open  = my_led_open,

    .unlocked_ioctl = my_led_ioctl,

    .release = my_led_close,

};



static struct miscdevice led_misc = {

    .minor = MISC_DYNAMIC_MINOR,

    .name = DEVICE_NAME,

    .fops  = &my_led_ops,

};



static int __init my_led_init(void)

{

    int ret;


    ret = misc_register(&led_misc);

    if(ret) {

        printk(KERN_INFO'misc_register failedn');

    }


    printk(KERN_INFO'misc_register sucessedn');

    

    return 0;

}



static void __exit my_led_exit(void) {

    int i;

    misc_deregister(&led_misc);

    for(i= 0; i < LED_NUM; i++)

        gpio_free(leds_table[i]);

    printk(KERN_INFO 'LEDs driver successfully exitn');

}




module_init(my_led_init);

module_exit(my_led_exit);

MODULE_LICENSE('GPL');

MODULE_AUTHOR('qigaohua');


应用程序:


#include

#include

#include

#include


#define IOCTL_GPIO_ON           1

#define IOCTL_GPIO_OFF          0




int main(int argc, char **argv)

{

    int fd;


    fd = open('/dev/leds',0);

    if(fd < 0) {

        printf('/dev/leds open failedn');

        exit(1);

    }



    

    do {

        printf('/dev/leds open sucessedn');

        ioctl(fd, IOCTL_GPIO_ON, 1);

        ioctl(fd, IOCTL_GPIO_OFF, 2);

        ioctl(fd, IOCTL_GPIO_OFF, 3);

        ioctl(fd, IOCTL_GPIO_OFF, 4);

        sleep(1);


        ioctl(fd, IOCTL_GPIO_ON, 1);

        ioctl(fd, IOCTL_GPIO_ON, 2);

        ioctl(fd, IOCTL_GPIO_OFF, 3);

        ioctl(fd, IOCTL_GPIO_OFF, 4);        

        sleep(1);


        ioctl(fd, IOCTL_GPIO_ON, 1);

        ioctl(fd, IOCTL_GPIO_ON, 2);

        ioctl(fd, IOCTL_GPIO_ON, 3);

        ioctl(fd, IOCTL_GPIO_OFF, 4);        

        sleep(1);


        ioctl(fd, IOCTL_GPIO_ON, 1);

        ioctl(fd, IOCTL_GPIO_ON, 2);

        ioctl(fd, IOCTL_GPIO_ON, 3);

        ioctl(fd, IOCTL_GPIO_ON, 4);        

        sleep(1);



        ioctl(fd, IOCTL_GPIO_OFF, 1);

        ioctl(fd, IOCTL_GPIO_OFF, 2);

        ioctl(fd, IOCTL_GPIO_OFF, 3);

        ioctl(fd, IOCTL_GPIO_OFF, 4);

    }while(0);


    close(fd);

    return 0;


}


关键字:Smart210  LED驱动  基本框架 引用地址:Smart210---LED驱动

上一篇:Smart210学习记录----beep linux字符设备驱动
下一篇:Smart210学习记录-------Linux设备驱动结构

推荐阅读最新更新时间:2026-03-24 11:27

PIC单片机程序基本结构框架
简介:为了快速掌握PIC单片机源程序的基本结构框架,这里给出一个典型的程序结构框架。建立源程序时首先用伪指令TITLE提供程序的标题,接着给出整个程序的总说明,并用列表伪指令LIST指定所用单片机型号和文件输出格式,再利用INCLUDE伪指令读入MPASM中提供的定义文件如《P16F84?INC》,然后对片内常用资源进行定义,再给出一般程序的基本结构框架。 现举例如下: TITLE“This is……”;程序标题 ;程序说明 LIST P=16F84,F=1NHX8M ; include p16F84.inc -config_RC_Qsc&_WDT_0FF… ;资源定义和变量定义 STATUS EQ
[单片机]
我国自动驾驶路测规范框架基本成型
  还记得近期百度CEO李彦宏开着无人车上五环,却被交警调查的新闻吗?出现这种尴尬,是因为我国还不允许 自动驾驶 汽车在公共道路上行驶。不过,以后再进行无人车测试不用再担心了。我国已经在设立自动驾驶方面的法规进程上加快了脚步。目前,中国自动驾驶路测规范基本框架已经形成。 自动驾驶汽车   据悉,除了传统汽车公司和零部件公司外,互联网公司和高校院所等均可提出申请自动驾驶汽车路测。主管部门会根据专门的申请门槛条件,向符合要求的申请者颁发测试牌照。但在驶入公共道路前,自动驾驶车辆需要经过5000公里实车验证和第三方技术机构验证。
[嵌入式]
厦门市集成电路产业链基本框架形成
  高位谋划,加快重点产业链“填平补齐”。昨日上午,厦门通富微电子项目奠基仪式在海沧信息消费产业园区举行,该项目的落地与厦门联芯、三安光电等共同实现了区域性的产业链垂直整合,标志着我市集成电路完整产业链基本框架形成,对奠定厦门集成电路产业在全国的战略地位具有重大意义。   “通富微电与厦门市海沧区在6月26日签订共建集成电路先进封测生产线的战略合作协议,不到60天,该项目便完成了项目公司注册、一期地块招拍挂、配套设施完善等相关事项。”通富微电子股份有限公司总经理石磊说,厦门真诚、热情、高效、严谨的工作态度,成为推动双方合作搭上快速发展列车的强劲动力。   据悉,通富微电是排名全球第八、中国大陆前三的封测企业,是中国大陆封测企业
[半导体设计/制造]
Smart210学习记录-------内存初始化
br br br br br br DMC0_PRECHCONFIG = 0xFF000000; DMC0_PWRDNCONFIG = 0xFFFF00FF; DMC0_TIMINGAREF = 0x00000618; DMC0_TIMINGROW = 0x28233287; DMC0_TIMINGDATA = 0x23240304; DMC0_TIMINGPOWER = 0x09C80232; DMC0_PHYSTSTUS0 = 0x4;//11 PHY DLL is locked DMC0_DIRECTCMD = 0x07000000; DMC0_DIRECTCMD = 0x01000000;//所有板
[单片机]
Smart210学习记录-------文件操作
一.linux文件操作(只能在linux系统上用) 创建: int creat(const char* filename, mode_t mode) filename 表示要创建的文件名,mode表示对该文件的读写权限 int umask(int newmask) 调用将 umask 设置为 newmask,然后返回旧的 umask,它只影响读、写和执行权限 S_IRUSR 用户可以读 S_IWUSR 用户可以写 S_IXUSR 用户可以执行 。。。等等 除了可以通过上述宏进行“或”逻辑产生标志以外,我们也可以自己用数字来表示,Linux 用 5 个数字来表示文件的各种权限:第一位表示设置用户 ID;第二位表示设置组 ID;第三位
[单片机]
Smart210学习记录-------Linux设备驱动结构
cdev结构体 1 struct cdev { 2 struct kobject kobj; /* 内嵌的 kobject 对象 */ 3 struct module *owner; /*所属模块*/ 4 struct file_operations *ops; /*文件操作结构体*/ 5 struct list_head list; 6 dev_t dev; /*设备号*/ 7 unsigned int count; 8 }; 1.struct file_operations { 2 struct module *owner; 3 /* 拥有该结构的模块的指针,一般为 THIS_MODULES */ 4 l
[单片机]
<font color='red'>Smart210</font>学习记录-------Linux设备驱动结构
Smart210学习记录----nand flash驱动
当读写文件请求到来的时候,流程如下   1.通过vfs进入文件系统,   2.文件系统把文件读写转换为块设备读写,其中有运用算法对读写操作进行合并,排序等,最后把块设备读写放进队列   3.循环从队列中取出读写要求,然后用处理函数(blk_init_queue设置)进行处理。    这个函数就是连接上层(IO调度)跟底层(硬件操作)的桥梁,当我们调用add_mtd_partitions的时候,就建立了上下层的联系。   4.对不同的处理要求,调用不同的nand的底层处理函数 nand flash驱动代码: #include linux/module.h #include linux/types.h #in
[单片机]
<font color='red'>Smart210</font>学习记录----nand flash驱动
Smart210学习记录------nor flash驱动
nor flash驱动与nand flash驱动的差别不大,只是设置不同的结构体而已,, nor flash驱动代码: #include linux/module.h #include linux/types.h #include linux/kernel.h #include linux/init.h #include linux/slab.h #include linux/device.h #include linux/platform_device.h #include linux/mtd/mtd.h #include linux/mtd/map.h #include linux/mtd/parti
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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