- 论坛徽章:
- 0
|
linux的用户空间不能直接访问io口,只能通过函数来访问io。atmel的关于gpio的头文件在/arm/arm/mach-at91/gpio.c;/include/asm/arch/gpio.h io.h.点亮led的驱动和测试函数如下。
#include
#include
#include
#include
#include
#include
#include
#include
#define led1 AT91_PIN_PA6
#define led2 AT91_PIN_PA6
#define led3 AT91_PIN_PA6
#define led4 AT91_PIN_PA6
#define NAME "four led test"
static int major =231;//define device major
static ssize_t myled_driver_write(struct file *file,const char __user *data,size_t len,loff_t
*ppos)
{ unsigned char buf_data;
printk("this is write");
if(copy_from_user((char*)&buf_data,data,len))
return -EFAULT;
printk("MYled test Driver -write:user_data 0x=%x\n",buf_data);
switch(buf_data)
{
case 0x0:gpio_set_value(led1,0); printk("MYled test Driver -write:user_data 0x=%x\n",buf_data);break;
case 0x1:gpio_set_value(led2,0);break;
case 0x2:gpio_set_value(led3,0);break;
case 0x3:gpio_set_value(led4,0);break;
case 0x4:gpio_set_value(led1,1);break;
case 0x5:gpio_set_value(led2,1);break;
case 0x6:gpio_set_value(led3,1);break;
case 0x7:gpio_set_value(led4,1);break;
default:break;
}
return(len8) return 0;
return (len
case 0x1:gpio_set_value(led2,0); printk("Led test driver-ioctl: 2 param %u %lu\n",cmd,arg);break;
case 0x2:gpio_set_value(led3,0); printk("Led test driver-ioctl: 3 param %u %lu\n",cmd,arg);break;
case 0x3:gpio_set_value(led4,0); printk("Led test driver-ioctl: 4 param %u %lu\n",cmd,arg);break;
case 0x4:gpio_set_value(led1,1); printk("Led test driver-ioctl: 5 param %u %lu\n",cmd,arg);break;
case 0x5:at91_set_gpio_value(led2,1); printk("Led test driver-ioctl: 6 param %u %lu \n",cmd,arg);break;
case 0x6:gpio_set_value(led3,1); printk("Led test driver-ioctl: 7 param %u %lu\n",cmd,arg);break;
case 0x7:gpio_set_value(led4,1); printk("Led test driver-ioctl: 8 param %u %lu\n",cmd,arg);break;
default:break;
}
return 1;
}
static int myled_driver_open(struct inode *inode,struct file *file)
{
unsigned m =iminor(inode);
if(m>63) return -EINVAL;
printk("led test driver opened!\n");
return nonseekable_open(inode,file);
}
static int myled_driver_release(struct inode *inode,struct file *file)
{
printk("my test driver released!\n");
return 0;
}
static struct file_operations myled_driver_fops =
{
.owner =THIS_MODULE,
.read =myled_driver_read,
.write =myled_driver_write,
.ioctl =myled_driver_ioctl,
.open =myled_driver_open,
.release =myled_driver_release,
};
static int __init myled_driver_init(void) /*妯″潡鍔犺浇鍑芥暟*/
{
int ret; /*鍒濆?鍖栦唬鐮?/
gpio_set_value(led1,0);
gpio_set_value(led2,1);
gpio_set_value(led3,0);
gpio_set_value(led4,1);
printk(KERN_ALERT "led modules is install\n");
ret=register_chrdev(major,NAME,&myled_driver_fops);
if(ret
static void __exit myled_driver_exit(void)/*__exit涓哄畯瀹氫箟*/
{
int ret;
ret=unregister_chrdev(major,NAME);
if(ret
module_init(myled_driver_init);
module_exit(myled_driver_exit);
MODULE_AUTHOR("lxs(
www.emtronix.com
)");
MODULE_DESCRIPTION("this is test modules used to test at91sam9261 led");
MODULE_LICENSE("Dual BSD/GPL"); /*妯″潡璁稿彲璇佸繀闇 |
|