免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1055 | 回复: 0
打印 上一主题 下一主题

终于把led点亮了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-17 10:02 |只看该作者 |倒序浏览
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");  /*妯″潡璁稿彲璇佸繀闇
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP