天嵌 ARM开发社区

 找回密码
 注册
查看: 1476|回复: 3

我想问一下我写了一个led驱动程序,程序编译和测试程序都对

[复制链接]
眺望,永恒 发表于 2013-12-11 00:24:21 | 显示全部楼层 |阅读模式
我想问一下我写了一个led驱动程序,程序编译和测试程序编译都对,也将驱动注册成功到内核了,目标是能控制led灯全灭和全亮,但是我发现tq2440的led灯只要板子电源开启了,就会按照一定的规律闪动,我想是不是因为文件系统有一个程序是只要系统打开就会一直执行,然后所以我的操作优先级不够高,所以led灯不能受我的控制,求解释啊,谢谢大家
这是驱动程序
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/device.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/poll.h>

static int major;

/*定义class结构体*/
static struct class *first_led_class;

/*定义一个class_device结构体*/

/*此定义也是可以的:static struct class_device *first_led_device;*/
static struct class_device *first_led_device;


volatile unsigned long *GPBCON = NULL;
volatile unsigned long *GPBDAT = NULL;

static int first_led_open (struct inode *inode, struct file *file)
{
    *GPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16));
    *GPBCON |= (1<<10)|(1<<12)|(1<<14)|(1<<16);
    return 0;
}
static ssize_t first_led_write(struct file *file,

                  const char __user *user_buffer, size_t count, loff_t * loff)
{
    int ret;

    /*从用户空间得到数据*/
    copy_from_user(&ret,user_buffer,count);
    if(0 == ret)

         /*点亮led*/
        *GPBDAT &=  ~((1<<5)|(1<<6)|(1<<7)|(1<<8));
    else

        /*熄灭led*/

        *GPBDAT |= ((1<<5)|(1<<6)|(1<<7)|(1<<8));
    return count;
}

   /*定义一个file_operations结构体*/
static struct file_operations first_led_fops = {
     .owner = THIS_MODULE,
     .open  = first_led_open,
     .write = first_led_write,
};

   /*入口函数*/
static int first_led_init(void){

        /*注册,主设备的位置为0,代表自动分配主设备号*/
       major = register_chrdev(0,"first_dev_led",&first_led_fops);

        /*创建一个类,可在/sys/class目录下查看到*/
  first_led_class = class_create(THIS_MODULE,"fisrst_led_class");

        /*类下创建一个设备,可在/sys/class/fisrst_led_class目录下查看到*/
  first_led_device = device_create(first_led_class,NULL,
                                MKDEV(major,0),NULL,"first_led");

      /*地址映射*/
      GPBCON = (volatile int *)ioremap(0x56000010,16);
      GPBDAT = GPBCON + 1;

      return 0;
}
static void first_led_exit(void){

        /*注销*/
       unregister_chrdev(major,"first_dev_led");

        /*注销设备*/
       device_unregister(first_led_device);

        /*销毁类*/
       class_destroy(first_led_class);

        /*注销虚拟地址的映射*/
       iounmap(GPBCON);
}
MODULE_LICENSE("GPL");
module_init(first_led_init);
module_exit(first_led_exit);
这是测试程序
//usage< file on | off >

#include<unistd.h>

#include<fcntl.h>
#include<stdio.h>
int main(int argc,char **argv){
   int fd;
   int val=1;
   fd=open("/dev/first_led",O_RDWR);
   if(fd<0)
       printf("can't open!\n");
   if(argc != 2)

   {
        printf("usage:\n");
        printf("first_devdritest <on|off>\n");
        return 0;
   }
   if(strcmp(argv[1],"on")==0)
        val=0;
   else
        val=1;
   write(fd,&val,4);
   return 0;
}
 楼主| 眺望,永恒 发表于 2013-12-11 11:07:22 | 显示全部楼层
为什么没人回复啊
wangting198708 发表于 2014-1-9 10:52:43 | 显示全部楼层

测试界面下把LED测试功能 ledoff  就能看见了,因为系统把驱动做进去了
·_Fly·, 发表于 2014-2-12 23:45:46 | 显示全部楼层
把天嵌自带的led驱动屏蔽了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-28 11:23 , Processed in 1.027384 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表