led驱动开发

1. 数据结构 led_classdev

struct led_classdev {

const char *name;

enum led_brightness  brightness;

enum led_brightness  max_brightness;

int  flags;

unsigned long work_flags;

void (*brightness_set)(struct led_classdev *led_cdev,

  enum led_brightness brightness);

int (*brightness_set_blocking)(struct led_classdev *led_cdev,

       enum led_brightness brightness);

enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);

int (*blink_set)(struct led_classdev *led_cdev,

     unsigned long *delay_on,

     unsigned long *delay_off);

struct device *dev;

const struct attribute_group **groups;

struct list_head  node; /* LED Device list */

const char *default_trigger; /* Trigger to use */

unsigned long  blink_delay_on, blink_delay_off;

struct timer_list  blink_timer;

int  blink_brightness;

int  new_blink_brightness;

void (*flash_resume)(struct led_classdev *led_cdev);

struct work_struct set_brightness_work;

int delayed_set_value;

#ifdef CONFIG_LEDS_TRIGGERS

/* Protects the trigger data below */

struct rw_semaphore  trigger_lock;

struct led_trigger *trigger;

struct list_head  trig_list;

void *trigger_data;

/* true if activated - deactivate routine uses it to do cleanup */

bool activated;

#endif

#ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED

int  brightness_hw_changed;

struct kernfs_node *brightness_hw_changed_kn;

#endif

/* Ensures consistent access to the LED Flash Class device */

struct mutex led_access;

};

位置: include\linux\leds.h

注意: 一个LED 对应一个led_classdev结构体,如果有多个LED,则要注册多个led_classdev

2. 结构体初始化

        ldev->brightness_set = tm1929_led_ctrl;

        ldev->default_trigger = "none";

        ldev->name = uled->name;

说明:tm1929_led_ctrl是自己写的

3. 注册与反注册

led_classdev_register(parent, led_cdev) ;//parent是 struct device 类型的指针,需要调用反注册函数

void led_classdev_unregister(struct led_classdev *led_cdev);//反注册函数

devm_led_classdev_register(parent, led_cdev); //无需调用反注册函数,系统自动调用 

说明

​​​​​​​4. 应用层控制

echo "255">/sys/class/leds/led02/brightness

说明:

 "255" 必须使用字符串格式,否则无法正确控制

led02 是注册时的名字

/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名:TM1622-V1.0 *当前版本:V1.0 *MCU 型号:STC12C5608AD *开发环境:Keil uVision4 *晶震频率:11.0592MHZ *完成日期:2013-09-09 *程序功能:1.LCD驱动:32SEG*8COM(由2组4COM LCD屏组成),分别显示0~9. *免责声明:1.此程序为TM1622驱动LCD演示程序,仅作参考之用。 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任 ********************************************************************************/ #include //MCU头文件 #include "intrins.h" //包含nop指令头文件 #define nop() _nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /********************定义控制端口**********************/ sbit CS = P2^1; //片选 sbit READ = P2^0; //读数据时钟 sbit WRITE = P1^7; //写数据时钟 sbit DATA = P1^6; //数据口 //****定义数据*************** 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 unsigned char code date0[]={0x0B,0x00,0x07,0x05,0x0C,0x0D,0x0F,0x00,0x0F,0x0D,0x0B,0x00,0x07,0x05,0x0C,0x0D,0x0F,0x00,0x0F,0x0D,0x0B,0x00,0x07,0x05,0x0C,0x0D,}; unsigned char code date1[]={0x0E,0x06,0x0C,0x0e,0x06,0x0A,0x0A,0x0E,0x0E,0x0E,0x0E,0x06,0x0C,0x0e,0x06,0x0A,0x0A,0x0E,0x0E,0x0E,0x0E,0x06,0x0C,0x0e,0x06,0x0A,}; unsigned char Buffer[64]; //定义数组 /***************延时函数nms**************/ void delay_nms(unsigned int n) { unsigned int i; while(n--) { for(i=0; i<550; i++); } } /***************写100命令函数**************/ void write_cmd_100(unsigned char cmd) { unsigned char i; CS=0; WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); for(i=0; i<8; i++) { WRITE=0; if(cmd&0x80;) DATA=1; else DATA=0; WRITE=1; cmd<<=1; } WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); CS=1; } /***************写101数据函数**************/ void write_101(unsigned char address, unsigned char dat) { unsigned char i, add; add=address<<2; CS=0; WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); for(i=0; i<6; i++) { WRITE=0; if(add&0x80;) DATA=1; else DATA=0; WRITE=1; add<<=1; } for(i=0; i>=1; } WRITE=0; DATA=0; CS=1; } /***************向显存写数据**************/ void writeDDRAM(void) { unsigned char i; for(i=0;i<16;i++) //向64个地址写数据,显示0~9 { write_101((2*(2*i)),date0[i]); write_101((2*(2*i)+2),date1[i]); write_101((2*(2*i)+1),date0[i]); write_101((2*(2*i)+3),date1[i]); } } /***************TM1622初始化函数**************/ void init_tm1622() { write_cmd_100(0x01); //打开系统振荡器 write_cmd_100(0x03); //开启LCD显示 write_cmd_100(0x18); //片内RC 32KHZ write_cmd_100(0xe3); //正常模式 } void main() { unsigned char i; init_tm1622(); //初始化 nop(); nop();