ok6410 linux驱动三 led驱动

本文介绍了一个简单的LED驱动程序实现过程,包括驱动程序源代码、Makefile配置、应用程序编写及测试步骤。通过该教程,读者可以了解如何在Linux环境下编写和测试LED驱动程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、led驱动源程序:

#include <linux/module.h>


#include <linux/kernel.h>
#include <linux/fs.h>
#include <asm/uaccess.h> /* copy_to_user,copy_from_user */
#include <linux/miscdevice.h>  
#include <linux/pci.h>  
#include <mach/map.h>  
#include <mach/regs-gpio.h>  
#include <mach/gpio-bank-m.h>  
#include <plat/gpio-cfg.h>


#define LED_MAJOR 240


int led_open (struct inode *inode,struct file *filp)


{
unsigned tmp;   
         tmp = readl(S3C64XX_GPMCON);   
tmp&=~0xffff;
tmp|=0x1111;
         writel(tmp, S3C64XX_GPMCON); 

return 0;
}

ssize_t led_read (struct file *filp, char __user *buf, size_t count,loff_t *f_pos)
{

return count;
}

ssize_t led_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)
{
char wbuf[10];
unsigned tmp=0;
char i;   

copy_from_user(wbuf,buf,count);
for(i=0;i<count;i++)
{
if(wbuf[i]==0x31)
{
tmp<<=1;
tmp|=0x01;
}
else
{
                  tmp<<=1;
}
}
        writel(tmp, S3C64XX_GPMDAT);

return count;
}


int led_release (struct inode *inode, struct file *filp)
{

return 0;
}

struct file_operations led_fops ={
.owner = THIS_MODULE,
.open = led_open,
.read = led_read,
.write = led_write,
.release = led_release,
};


int __init led_init (void)
{ int rc;
printk ("Test led dev\n");
rc = register_chrdev(LED_MAJOR,"led",&led_fops);
if (rc <0)
{
printk ("register %s char dev error\n","led");
return -1;
}
printk ("ok!\n");
return 0;
}

void __exit led_exit (void)
{
unregister_chrdev(LED_MAJOR,"led");
printk ("module exit\n");
return ;
}

module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");


makefile:

obj-m:=led_driver.o
KDIR:=/wyl/linux-3.0.1
all:
make -C $(KDIR) M=$(shell pwd) modules
install:
rm -rf /nfs/root/led_driver.ko
cp led_driver.ko /nfs/root/
clean:
make -C $(KDIR) M=$(shell pwd) clean

2.应用程序

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main (int argc,char *argv[])
{
int fd;
char a=1;
if(argc<1)printf("please input paramter!\n");
         else
          {
         printf("argc=%d \n",argc);
printf("argv[1] is %d \n",*argv[1]);
             
}
fd = open("/dev/my_led",O_RDWR);
if (fd < 0)
{
printf ("Open /dev/my_led file error\n");
return -1;
}
        
write(fd,argv[1],4);
        close (fd);
return 0;


}


编译:arm-linux-gcc  led.c  -o led
3、测试:

将生成的led_driver.ko 和led复制到开发板

执行:

insmod led_driver.ko

mknod /dev/my_led c 240 0

./led 0000

可以看到四个灯全亮;

0000         led4-------led1

./led 0111

可以看到led4亮 ,其余全灭





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值