最简单的驱动:LED驱动程序与应用程序解析

led驱动程序:
  1 #include <linux/miscdevice.h>
  2 #include <linux/delay.h>
  3 #include <asm/irq.h>
  4 #include <mach/regs-gpio.h>
  5 #include <mach/hardware.h>
  6 #include <linux/kernel.h>
  7 #include <linux/module.h>
  8 #include <linux/init.h>
  9 #include <linux/mm.h>
 10 #include <linux/fs.h>
 11 #include <linux/types.h>
 12 #include <linux/delay.h>
 13 #include <linux/moduleparam.h>
 14 #include <linux/slab.h>
 15 #include <linux/errno.h>
 16 #include <linux/ioctl.h>
 17 #include <linux/cdev.h>
 18 #include <linux/string.h>
 19 #include <linux/list.h>
 20 #include <linux/pci.h>
 21 #include <asm/uaccess.h>
 22 #include <asm/atomic.h>
 23 #include <asm/unistd.h>
 24
 25
 26 #define DEVICE_NAME "my_leds"
 27
 28 static unsigned long led_table [] = {
 29         S3C2410_GPB5,
 30         S3C2410_GPB6,
 31         S3C2410_GPB7,
 32         S3C2410_GPB8,
 33 };
 34
 35 static unsigned int led_cfg_table [] = {
 36         S3C2410_GPB5_OUTP,
 37         S3C2410_GPB6_OUTP,
 38         S3C2410_GPB7_OUTP,
 39         S3C2410_GPB8_OUTP,
 40 };
 41
 42 static int sbc2440_leds_ioctl(
 43         struct inode *inode,
 44         struct file *file,
 45         unsigned long arg,
 46         unsigned int cmd) //arg代表第几个led; cmd代表打开还是关闭
                 //原来此处cmd在前,arg在后,这样跟应用程序在用的时候的命令正好是个反的,所有我做了一下修改,相应的应用程序进行了相应的修改
 47 {
 48         int i ;
 49         switch(cmd) {
 50         case 0:
 51         case 1:
 52                 if (arg > 4) {
 53                         return -EINVAL;
 54                 }
 55                 s3c2410_gpio_setpin(led_table[arg], !cmd);
 56                 return 0;
 57         case 2:
 58                 if(arg > 4)    //此处为自己添加的功能,用于同时打开4个led
 59                 {
 60                         return -EINVAL;
 61                 }
 62                 for(i=0;i<4;i++)
 63                 {
 64                         s3c2410_gpio_setpin(led_table[i], 0);
 65                 }
 66                 return 0;
 67         case 3:
 68                 if(arg > 4)    //此处为自己添加的功能,用于同时关闭4个led
 69                 {
 70                         return -EINVAL;
 71                 }
 72                 for(i=0;i<4;i++)
 73                 {
 74                         s3c2410_gpio_setpin(led_table[i], 1);
 75                 }
 76                 return 0;
 77         default:
 78                 return -EINVAL;
 79                 }
 80 }
 81
 82 static struct file_operations dev_fops = {
 83         .owner  =       THIS_MODULE,
 84         .ioctl  =       sbc2440_leds_ioctl,
 85 };
 86
 87 static struct miscdevice misc = {
 88         .minor = MISC_DYNAMIC_MINOR,    //定义在miscdevice.h中,为255,表示自动获取次设备号
 89         .name = DEVICE_NAME,
 90         .fops = &dev_fops,
 91 };
 92
 93 static int __init dev_init(void)
 94 {
 95         int ret;
 96
 97         int i;
 98
 99         for (i = 0; i < 4; i++) {
100                 s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
101                 s3c2410_gpio_setpin(led_table[i], 1);
102         }
103
104         ret = misc_register(&misc);
105
106         printk (DEVICE_NAME"\tinitialized\n");
107
108         return ret;
109 }
110
111 static void __exit dev_exit(void)
112 {
113         misc_deregister(&misc);
114 }
115
116 module_init(dev_init);
117 module_exit(dev_exit);
118 MODULE_LICENSE("GPL");
119 MODULE_AUTHOR("FriendlyARM Inc.");


应用程序:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>///系统调用头文件

int main(int argc,char **argv)
{
        int led_no;
        int led_ctl;
        int fd;//区别fd与FILE *
        //led_no=argv[1];//错误的!
        //led_ctl=argv[2];

        sscanf(argv[1],"%d",&led_no);//将argv[1]中的内容以整数的形式打印到led_no中,注意第三个参数必须是地址(变量的地址或者数组名)。
        sscanf(argv[2],"%d",&led_ctl);
        if(argc!=3||led_no>3||led_no<0||led_ctl>3||led_ctl<0)
                printf("usage:./led_app  led_num 1|0,1打开led,0关闭led\n");
        fd=open("/dev/my_leds",0);//注意open的用法!
        if(fd<0)
        {
                perror("cannot open device!\n");
                exit(1);
        }
        ioctl(fd,led_no,led_ctl);//由于驱动程序改变,此处做了相应修改,将led_no与led_ctl位置调换了一下。
        close(fd);//打开的设备别忘了关掉
        return 0;
}


HD2010操作说明(HD2010 operating instructions) ⅰ.软件安装(Installed software) 双击光盘HD2010 V2.0目录下的安装文件图标 ,将控制系统安装到个人电脑.如下图2-1 (Open Profile HD2010 V2.0 in the compact disk,Dblclick Installed the HD2010 V2.0 in your personal computer.As shown in Figure 2-1) 图(Figure)2-1 点击确定后进入下一步如图2-2 (Click确定intro- next step.As shown in Figure 2-2 ) 图(Figure)2-2 点击下一步后进入下一步(英文环境)在中文环境直接点击下一步完成安装)如图2-3 2-4 2-5 2-6 2-7 (Click next intro- next step.As shown in Figure 2-3 2-4 2-5 2-6 2-7) 图(Figure)2-3 注意:发送的文件保存在安装目录下的ProjFile文件夹里,点击下一步完成安装 (Announcements:The file what you send saved in the ProjFile in path of Install.And click next to install and finish) 图(Figure)2-4 图(Figure)2-5 图(Figure)2-6 安装最后一步如图2-7 (The final step of install. As shown in Figure 2-7) 图(Figure)2-7 点击完成打开软件主界面如图2-8 (Click finish open main interface of the software. As shown in Figure 2-8) ⅱ.软件设置(Setting software) ⅱ.ⅰ主界面如图2-8(Main interface.As shown in Figure 2-8) 图(Figure)2-8 ⅱ.ⅱ软件属性(Software properties) 1.文件菜单(File menu) a.新建--新建一个新的显示屏(New—Create a new screen) b.打开--打开一个显示屏(Open—Open a exist screen) c.保存--保存建立的文件(Save—Save file) d.另存为--保存副本(Save as—save a copy) e.导出.hds--导出.hds文件,用于u盘读取文件 (Export.hds—Export.hds file,for usb reading) f.退出--退出软件(Exit—Exit the software) 2.设置菜单(Settings menu) a.屏参设置--设置显示屏属性 (Screen settings—Display Screen configuration attributes) b.通信设置--通信端口/方式设置 (Communication settings—Set Communication prot and fashion) c.系统设置--配置系统默认项 (System settings—Set the acquice properties of software) 3.操作菜单(Operate menu) a.发送项目--发送节目(Send project—send the programmes) b.导出到U盘--把节目导入到U盘 (Export to U disk—send the programme to your U disk) c.时间设置--时间校对 (Time setting—get the right time im your computer) d.亮度设置--选择亮度模式 (Luminance setting—Choice the module of Luminance) e.固件更新--固件升级(Update Firmware—Update your controller Firmware) 4.语言菜单(Language menu) a.简体中文(Simplified Chinese) b.繁体中文(Chinese Traditional) c.英语(English) ⅱ.ⅲ节目编辑(Edit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值