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亮 ,其余全灭