android 4 led insmod,platform驱动模型编程总结(基于mini2440平台的LED驱动)

#include

#include

#include

#include

#include

#include

#include

#include

#define GLOBAL_LED_MAJOR  250

static unsigned int global_led_major =

GLOBAL_LED_MAJOR;

static struct cdev *led_cdev = NULL;

static struct class *led_class = NULL;

static volatile unsigned long *gpfcon = NULL;

static volatile unsigned long *gpfdat =

NULL;

static volatile unsigned long *gpfup =

NULL;

static int mini2440_led_open(struct inode * inode,struct file

* file)

{

printk("mini2440_open[kernel_space]\n");

*gpfcon

&=~((0x3<<0) |

(0x3<<8)

|(0x3<<10)

|(0x3<<12)|(0x3<<14));

*gpfcon |= (0x1<<0) |

(0x1<<8)

|(0x1<<10)

|(0x1<<12)|(0x1<<14);

return 0;

}

static ssize_t mini2440_led_read(struct file * file,const char

__user * in,size_t size,loff_t * off)

{

printk("mini2440_read[kernel_space]\n");

return 0;

}

static ssize_t mini2440_led_write(struct file * file,const

char __user * in,size_t size,loff_t * off)

{

int ret;

char ker_buf;

printk("mini2440_write[kernel_space]\n");

ret = copy_from_user(&ker_buf,in,size);

printk("ker_buf =%d\n",ker_buf);

if(ker_buf)

{

*gpfdat

&=~((0x1<<4)|(0x1<<5)|(0x1<<6)|(0x1<<7));

*gpfdat |= (0x1<<0);

}

else

{

*gpfdat

|=(0x1<<4)|(0x1<<5)|(0x1<<6)|(0x1<<7);

*gpfdat &=

~(0x1<<0);

}

return 0;

}

struct file_operations led_fops = {

.owner = THIS_MODULE,

.open  = mini2440_led_open,

.read  = mini2440_led_read,

.write = mini2440_led_write,

};

static int __devinit mini2440_led_probe(struct platform_device

*pdev)

{

int ret;

int err;

dev_t devno;

struct resource *pIORESOURCE_MEM;

devno = MKDEV(global_led_major,0);

printk(KERN_ALERT"mini2440_led_probe!\n");

if (devno) {

ret =

register_chrdev_region(devno,1,"mini2440_led_platfor_driver");

} else {

ret =

alloc_chrdev_region(&devno,0,1,"mini2440_led_platfor_driver");

global_led_major = MAJOR(devno);

}

if (ret < 0) {

return ret;

}

led_cdev = cdev_alloc();

cdev_init(led_cdev,&led_fops);

led_cdev->owner = THIS_MODULE;

err = cdev_add(led_cdev,devno,1);

led_class =

class_create(THIS_MODULE,"mini2440_led_platfor_driver");

device_create(led_class,NULL,MKDEV(global_led_major,0),NULL,"platfor_driver_for_mini2440_led");

pIORESOURCE_MEM =

platform_get_resource(pdev,IORESOURCE_MEM,0);

gpfcon =

ioremap(pIORESOURCE_MEM->start,pIORESOURCE_MEM->end

- pIORESOURCE_MEM->start);

gpfdat = gpfcon + 1;

gpfup  = gpfcon + 2;

if (err) {

printk(KERN_NOTICE"Error %d adding led_cdev",err);

return -1;

} else {

printk(KERN_NOTICE"platform_driver_for_mini2440_led init

ok!\n");

return 0;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值