查看: 678|回复: 3

[资料] 【分享】迅为4412开发板如何控制LED发光二极管

[复制链接]

32

主题

0

好友

573

积分

举人

Rank: 4

  • TA的每日心情
    开心
    2014-7-10 11:21
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-6-13 16:19:04 |显示全部楼层

    迅为iTOP-4412精英版上提供了两个LED发光二极管,原理图如下所示:


    Cortex-A9开发板

    Cortex-A9开发板


            从上面的原理图可以看到两个LED的一端连接到电源VSYS上,另一端通过三极管接地,通过控制三极管的基极,可以点亮或关闭LED。两个三极管的基极分别通过底板连接到核心板上Exynos 4412的GPIO GPL2_0和GPK1_1上。
    上一章节已经讲过iTOP-4412开发板中GPIO的驱动,LED的驱动里面将会用到上一章节介绍的几个操作GPIO的函数。
    LED驱动的入口函数是leds_init,其实现如下:
    static int __init leds_init(void)
    {
            return platform_driver_register(&leds_driver);
    }
    该函数会调用内核函数platform_driver_register向内核注册一个硬件设备,这个函数的参数是一个platform_driver结构,leds_driver定义如下:
    static struct platform_driver leds_driver = {
            .probe = leds_probe,
            .remove = leds_remove,
            .suspend = leds_suspend,
            .resume = leds_resume,
            .driver = {
                    .name = DRIVER_NAME,
                    .owner = THIS_MODULE,
            },
    };
    内核调用platform_driver_register注册硬件设备的时候,最终会调用到platform_driver结构里面的probe探测函数,iTOP-4412开发板的LED驱动里探测函数是leds_probe,定义如下:
    static int leds_probe(struct platform_device *pdev)
    {
            int ret, i;
            char *banner = "leds Initialize\n";
            printk(banner);
            for(i=0; i<LED_NUM; i++)
            {
                    ret = gpio_request(led_gpios, "LED");
                    if (ret) {
                            printk("%s: request GPIO %d for LED failed, ret = %d\n", DRIVER_NAME,
                                            led_gpios, ret);
                            return ret;
                    }
                    s3c_gpio_cfgpin(led_gpios, S3C_GPIO_OUTPUT);
                    gpio_set_value(led_gpios, 1);
            }
            ret = misc_register(&leds_dev);
            if(ret<0)
            {
                    printk("leds:register device failed!\n");
                    goto exit;
            }
            return 0;
    exit:
            misc_deregister(&leds_dev);
            return ret;
    }
    在这个函数里会使用GPIO的操作函数来配置LED的两个GPIO引脚的功能为输出,默认输出高电平。控制LED的两个GPIO的定义在数组led_gpios中,如下:
    static int led_gpios[] = {
            EXYNOS4_GPL2(0),
            EXYNOS4_GPK1(1),
    };
    接着回到LED的探测函数往下看,接着会调用misc_register向内核注册字符设备。misc_register函数传递的参数类型是miscdevice,miscdevice被称作杂项设备,嵌入式系统中用得比较多的一种设备驱动。在Linux内核的include/linux目录下有Miscdevice.h文件,要把自己定义的misc device从设备号定义在这里。其实是因为这些字符设备不符合预先确定的字符设备范畴,所有这些设备采用主编号10 ,一起归于misc device,其实misc_register就是用主标号10调用register_chrdev()的。iTOP-4412开发板的LED驱动里miscdevice的结构定义如下:
    static struct miscdevice leds_dev = {
            .minor  = MISC_DYNAMIC_MINOR,
            .fops   = &leds_ops,
            .name   = "leds",
    };
    从上面的定义可以看到minor次设备号定义成了MISC_DYNAMIC_MINOR,在misc子系统里如果此设备号定义成MISC_DYNAMIC_MINOR,那么在驱动注册的时候,内核会动态的为这个设备分配子设备号。LED驱动会在/devu录下创建设备节点leds。
    驱动里面提供了设备文件的几个操作函数open,release,ioctl,上层应用首先调用open函数打开leds设备,然后调用ioctl来设置led的亮灭。leds_ioctl函数的实现如下所示:
    long leds_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)
    {
            printk("debug: leds_ioctl cmd is %d\n" , cmd);
            switch(cmd)
            {
                    case 0:
                    case 1:
                            if (arg > LED_NUM) {
                                    return -EINVAL;
                            }
                            gpio_set_value(led_gpios[arg], cmd);
                            break;
                    default:
                            return -EINVAL;
            }
            return 0;
    }
    通过上面的代码,可以知道上层应用使用ioctl,需要传递两个参数cmd和arg,cmd是led的状态(0是灭,1是亮),arg是代表操作哪个led。

    已有 1 人评分声望 铜板 收起 理由
    fengye5340-2725 + 5 + 10 赞一个!

    总评分: 声望 + 5  铜板 + 10   查看全部评分

    回复

    使用道具 举报

    207

    主题

    2

    好友

    6049

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    开心
    2016-8-15 09:30
  • 签到天数: 162 天

    [LV.7]常住居民III

    爱板会员勋章

    发表于 2014-6-13 17:06:41 |显示全部楼层
    多谢楼主分享,能分享些这个开发板的资料吗?
    回复

    使用道具 举报

    389

    主题

    88

    好友

    1万

    积分

    版主

    Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    奋斗
    2016-8-25 12:42
  • 签到天数: 692 天

    [LV.9]以坛为家II

    论坛版主职务勋章 爱板会员勋章 活跃会员勋章 论坛骨干勋章 发帖机器勋章 在线达人勋章

    发表于 2014-6-13 21:13:45 |显示全部楼层
    多谢楼主分享!希望楼主继续分享啊
    回复

    使用道具 举报

    8

    主题

    0

    好友

    102

    积分

    童生

    Rank: 2

  • TA的每日心情
    开心
    2014-9-25 13:16
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-1-8 10:48:07 |显示全部楼层
    求更多开发板资料
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /6 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-7 18:31 , Processed in 0.139269 second(s), 14 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部