使用内核LED框架搭建驱动 ——led_classdev_register

本文介绍了Linux内核LED框架,包括驱动框架的文件结构、led_classdev_register函数的作用,以及如何通过sysfs接口操作硬件。通过分析led-class.c,解释了subsys_initcall和module_init的执行顺序,以及led_classdev结构体在驱动中的角色。实验结果显示,成功创建了设备文件夹,并提供了亮度控制属性。
摘要由CSDN通过智能技术生成
#include <linux/init.h>            // __init   __exit
#include <linux/module.h>      // module_init  module_exit
#include <mach/regs-gpio.h>
#include <mach/gpio-bank.h>

#include <asm/io.h>     //writel

#include <linux/ioport.h>    //request_mem_region
​
#include <asm/string.h> 

#include <linux/leds.h>

#define GPJ0_REGBASE 0xE0200240
typedef struct GPJ0REG
{
    volatile unsigned int gpj0Con;
    volatile unsigned int gpj0Dat;
    
}gpj0_reg_t;
gpj0_reg_t *pgpj0_reg =NULL;

struct led_classdev    cdev1;
struct led_classdev cdev2;
struct led_classdev cdev3;

void s5pv210_led1_set(struct led_classdev *led_cdev,enum led_brightness brightness);
void s5pv210_led2_set(struct led_classdev *led_cdev,enum led_brightness brightness);
void s5pv210_led3_set(struct led_classdev *led_cdev,enum led_brightness brightness);

void s5pv210_led1_set(struct led_classdev *led_cdev,enum led_brightness brightness)
{
    printk(KERN_INFO "s5pv210_led1_set successful %d\n",brightness);
    if(brightness == LED_OFF)
    {
        writel((readl(&pgpj0_reg->gpj0Con)&0xff0fffff),&pgpj0_reg->gpj0Con);
        writel((readl(&pgpj0_reg->gpj0Con)|0x00100000),&pgpj0_reg->gpj0Con);
        writel((readl(&pgpj0_reg->gpj0Dat)|(0x01<<5)),&pgpj0_reg->gpj0Dat);
    }
    else
    {
        writel((readl(&pgpj0_reg->gpj0Con)&0xff0fffff),&pgpj0_reg->gpj0Con);
        writel((readl(&pgpj0_reg->gpj0Con)|0x00100000),&pgpj0_reg->gpj0Con);
        writel((readl(&pgpj0_reg->gpj0Dat)&(~(0x01<<5))),&pgpj0_reg->gpj0Dat);
        
    }
}    
void s5pv210_led2_set(struct led_classdev *led_cdev,enum led_brightness brightness)
{
    printk(KERN_INFO "s5pv210_led2_set successful %d\n",brightness);
    if(brightness == LED_OFF)
    {
        writel((readl(&pgpj0_reg->gpj0Con)&0xfff0ffff),&pgpj0_reg->gpj0Con);
        writel((readl(&pgpj0_reg->gpj0Con)|0x00010000),&pgpj0_reg->gpj0Con);
        writel((readl(&pgpj0_reg->gpj0Dat)|(0x01<<4)),&pgpj0_reg->gpj0Dat);
    }
    else
    {
        writel((readl(&pgpj0_reg->gpj0Con)&0xfff0ffff),&pgpj0_reg->
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值