Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105044
  • 博文数量: 50
  • 博客积分: 3120
  • 博客等级: 中校
  • 技术积分: 800
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-25 16:40
文章存档

2011年(1)

2009年(9)

2008年(40)

我的朋友

分类: LINUX

2008-09-25 17:14:15

LED测试
由HELLO驱动模块熟悉了驱动模块的基本编写方法。下面要开始做一个真正有用的驱动—LED驱动。象普通单片机一样,先从IO控制开始。IO控制首先就要知道地址和个控制寄存器,先翻DATASHEET了。由于开发板的LED是接在PIOA上的。先找地址
再看寄存器
#1 PIO Controller PIO Enable Register
Name:PIO_PER
Access Type: Write-only
?P0-P31: PIO Enable
0 = No effect.
1 = Enables the PIO to control the corresponding pin (disables peripheral control of the pin).
#2 PIO Controller PIO Disable Register
Name: PIO_PDR
Access Type: Write-only
?P0-P31: PIO Disable
0 = No effect.
1 = Disables the PIO from controlling the corresponding pin (enables peripheral control of the pin).
#3 PIO Controller PIO Status Register
Name: PIO_PSR
Access Type: Read-only
?P0-P31: PIO Status
0 = PIO is inactive on the corresponding I/O line (peripheral is active).
1 = PIO is active on the corresponding I/O line (peripheral is inactive).
#4 PIO Controller Output Enable Register
Name: PIO_OER
Access Type: Write-only
?P0-P31: Output Enable
0 = No effect.
1 = Enables the output on the I/O line.
#5 PIO Controller Output Disable Register
Name: PIO_ODR
Access Type: Write-only
?P0-P31: Output Disable
0 = No effect.
1 = Disables the output on the I/O line.
#6 PIO Controller Output Status Register
Name: PIO_OSR
Access Type: Read-only
?P0-P31: Output Status
0 = The I/O line is a pure input.
1 = The I/O line is enabled in output.
#7 PIO Controller Input Filter Enable Register
Name: PIO_IFER
Access Type: Write-only
?P0-P31: Input Filter Enable
0 = No effect.
1 = Enables the input glitch filter on the I/O line.
#8 PIO Controller Input Filter Disable Register
Name: PIO_IFDR
Access Type: Write-only
?P0-P31: Input Filter Disable
0 = No effect.
1 = Disables the input glitch filter on the I/O line.
#9 PIO Controller Input Filter Status Register
Name: PIO_IFSR
Access Type: Read-only
?P0-P31: Input Filer Status
0 = The input glitch filter is disabled on the I/O line.
1 = The input glitch filter is enabled on the I/O line.
#10 PIO Controller Set Output Data Register
Name: PIO_SODR
Access Type: Write-only
?P0-P31: Set Output Data
0 = No effect.
1 = Sets the data to be driven on the I/O line.
#11 PIO Controller Clear Output Data Register
Name: PIO_CODR
Access Type: Write-only
?P0-P31: Set Output Data
0 = No effect.
1 = Clears the data to be driven on the I/O line.
#12 PIO Controller Output Data Status Register
Name: PIO_ODSR
Access Type: Read-only or Read/Write
?P0-P31: Output Data Status
0 = The data to be driven on the I/O line is 0.
1 = The data to be driven on the I/O line is 1.
#13 PIO Controller Pin Data Status Register
Name: PIO_PDSR
Access Type: Read-only
?P0-P31: Output Data Status
0 = The I/O line is at level 0.
1 = The I/O line is at level 1.
#14 PIO Controller Interrupt Enable Register
Name: PIO_IER
Access Type: Write-only
?P0-P31: Input Change Interrupt Enable
0 = No effect.
1 = Enables the Input Change Interrupt on the I/O line.
#15 PIO Controller Interrupt Disable Register
Name: PIO_IDR
Access Type: Write-only
?P0-P31: Input Change Interrupt Disable
0 = No effect.
1 = Disables the Input Change Interrupt on the I/O line.
#16 PIO Controller Interrupt Mask Register
Name: PIO_IMR
Access Type: Read-only
?P0-P31: Input Change Interrupt Mask
0 = Input Change Interrupt is disabled on the I/O line.
1 = Input Change Interrupt is enabled on the I/O line.
#17 PIO Controller Interrupt Status Register
Name: PIO_ISR
Access Type: Read-only
?P0-P31: Input Change Interrupt Status
0 = No Input Change has been detected on the I/O line since PIO_ISR was last read or since reset.
1 = At least one Input Change has been detected on the I/O line since PIO_ISR was last read or since reset.
#18 PIO Multi-driver Enable Register
Name: PIO_MDER
Access Type: Write-only
?P0-P31: Multi Drive Enable.
0 = No effect.
1 = Enables Multi Drive on the I/O line.
#19 PIO Multi-driver Disable Register
Name: PIO_MDDR
Access Type: Write-only
?P0-P31: Multi Drive Disable.
0 = No effect.
1 = Disables Multi Drive on the I/O line.
#20 PIO Multi-driver Status Register
Name: PIO_MDSR
Access Type: Read-only
?P0-P31: Multi Drive Status.
0 = The Multi Drive is disabled on the I/O line. The pin is driven at high and low level.
1 = The Multi Drive is enabled on the I/O line. The pin is driven at low level only.
#21 PIO Pull Up Disable Register
Name: PIO_PUDR
Access Type: Write-only
?P0-P31: Pull Up Disable.
0 = No effect.
1 = Disables the pull up resistor on the I/O line.
#22 PIO Pull Up Enable Register
Name: PIO_PUER
Access Type: Write-only
?P0-P31: Pull Up Enable.
0 = No effect.
1 = Enables the pull up resistor on the I/O line.
#23 PIO Pull Up Status Register
Name: PIO_PUSR
Access Type: Read-only
?P0-P31: Pull Up Status.
0 = Pull Up resistor is enabled on the I/O line.
1 = Pull Up resistor is disabled on the I/O line.
#24 PIO Peripheral A Select Register
Name: PIO_ASR
Access Type: Write-only
?P0-P31: Peripheral A Select.
0 = No effect.
1 = Assigns the I/O line to the Peripheral A function.
#25 PIO Peripheral B Select Register
Name: PIO_BSR
Access Type: Write-only
?P0-P31: Peripheral B Select.
0 = No effect.
1 = Assigns the I/O line to the peripheral B function.
#26 PIO Peripheral A B Status Register
Name: PIO_ABSR
Access Type: Read-only
?P0-P31: Peripheral A B Status.
0 = The I/O line is assigned to the Peripheral A.
1 = The I/O line is assigned to the Peripheral B.
#27 PIO Output Write Enable Register
Name: PIO_OWER
Access Type: Write-only
?P0-P31: Output Write Enable.
0 = No effect.
1 = Enables writing PIO_ODSR for the I/O line.
#28 PIO Output Write Disable Register
Name: PIO_OWDR
Access Type: Write-only
?P0-P31: Output Write Disable.
0 = No effect.
1 = Disables writing PIO_ODSR for the I/O line.
#29 PIO Output Write Status Register
Name: PIO_OWSR
Access Type: Read-only
?P0-P31: Output Write Status.
0 = Writing PIO_ODSR does not affect the I/O line.
1 = Writing PIO_ODSR affects the I/O line.
下面是程序
#include
#include
#include
#include
#include
#include /* get the user-level API */
#include
#include
#include
#include
#include "at91_pio.h"
MODULE_LICENSE("GPL");
static void __iomem *pio_base;
size_t led_read (struct file *filp, char __user *buf, size_t count, loff_t *pos){
      printk("watchdog read.\r\n");
      return 0;
}
ssize_t led_write (struct file *filp, const char __user *buf, size_t count,off_t *pos){
      printk("watchdog write.\r\n");
      return count;
}
int led_ioctl (struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg){
     // printk("led ioctl cmd:%d%d\r\n",cmd,arg);
     long   mode;
    
     switch(cmd)
     {
      case 1:
            mode=0x00000100;
      break;
      case 2:
            mode=0x00000080;
      break;
      case 3:
            mode=0x00000040;
      break;
      case 4:
            mode=0x00000020;
      break;
       
      default:
            mode=0x000001e0;
      break;
    
     }
    
     //printk("led ioctl cmd:%d%d%ld\r\n",cmd,arg,mode);
     if(arg ==0 ) {writel(mode, pio_base + PIO_CODR);}
     else
     {writel(mode, pio_base + PIO_SODR);}
      return 0;
}
static struct file_operations led_fops = {
      .owner = THIS_MODULE,
      .read = led_read,
      .write = led_write,
      .ioctl = led_ioctl,
};
static int led_init(void){
      int result;
      printk(KERN_ALERT "led_test:%s,%s\r\n",__DATE__,__TIME__);
      pio_base = ioremap(0xFFFFF400,512);            
      writel(0x000001e0, pio_base + PIO_PER);     
      writel(0x000001e0, pio_base + PIO_PUER);    
     
      writel(0x00000ff0, pio_base + PIO_ODSR);    
      writel(0x000001e0, pio_base + PIO_OER);     
     
      result = register_chrdev(60, "led", &led_fops);
      if (result < 0){
          printk("register device fail.\r\n");
return result;
      }
      return 0;
}
static void led_exit(void){
printk("stop clear led\r\n");
      unregister_chrdev(60, "led");
      iounmap(pio_base);
      printk(KERN_ALERT "stop clear led\r\n");
}
module_init(led_init);
module_exit(led_exit);
编译好后,在运行之前,先要创建一个设备文件
# mknod "/dev/led" c 60 1
即创建一个主设备号为60,次设备号为1名称为LED的字符型设备。
然后运行这个函数即可看见LED开始闪烁。
阅读(489) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~