设为首页 加入收藏

TOP

DM8168 PWM驱动与测试程序
2015-07-24 06:13:17 来源: 作者: 【 】 浏览:19
Tags:DM8168 PWM 驱动 测试 程序

昨天把DM8168的Timer设置给摸了一遍,为写PWM的底层驱动做好了准备,现在就要进入主题了。

dm8168_pwm.c:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       /* copy_to_user,copy_from_user */ #include 
      
        #include 
       
         #include 
        
          static struct class *pwm_class; volatile unsigned long *CLK_CTL; volatile unsigned long *TCLR; volatile unsigned long *TCRR; volatile unsigned long *TLDR; volatile unsigned long *TMAR; int pwm_open (struct inode *inode,struct file *filp) { *CLK_CTL = 0x00000002; *TCLR = 0; *TLDR = 0xffffffe0; *TMAR = 0xfffffff0; *TCRR = 0xffffffe0; return 0; } ssize_t pwm_read (struct file *filp, char __user *buf, size_t count,loff_t *f_pos) { return 0; } ssize_t pwm_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos) { char duty_buf[2]; int ret; ret = copy_from_user(duty_buf,buf,count); *TMAR = 0xffffffe0 + (unsigned char)(duty_buf[0]*30/100); //分辨率略低,仅为demo *TCLR = 0x1843; return count; } struct file_operations pwm_fops = { .owner = THIS_MODULE, .open = pwm_open, .read = pwm_read, .write = pwm_write, } ; int major; int pwm_init (void) { major = register_chrdev(0,"DM8168_PWM",&pwm_fops); pwm_class = class_create(THIS_MODULE, "DM8168_PWM"); device_create(pwm_class,NULL,MKDEV(major,0),NULL,"pwm"); CLK_CTL = (volatile unsigned long *)ioremap(0x4818157C,4); TCLR = (volatile unsigned long *)ioremap(0x48044038,4); TCRR = (volatile unsigned long *)ioremap(0x4804403C,4); TLDR = (volatile unsigned long *)ioremap(0x48044040,4); TMAR = (volatile unsigned long *)ioremap(0x4804404C,4); printk ("pwm is ready\n"); return 0; } void pwm_exit (void) { unregister_chrdev(major,"DM8168_PWM"); device_destroy(pwm_class,MKDEV(major,0)); class_destroy(pwm_class); iounmap(CLK_CTL); iounmap(TCLR); iounmap(TCRR); iounmap(TLDR); iounmap(TMAR); printk ("module exit\n"); return ; } MODULE_LICENSE("GPL"); module_init(pwm_init); module_exit(pwm_exit); 
        
       
      
     
    
   
  

Makefile:

obj-m:= dm8168_pwm.o

CROSSCOMPILE := /opt/codesourcery/arm-2009q1/bin/arm-none-linux-gnueabi-

CC  := $(CROSSCOMPILE)gcc 

KDIR:=/home/***/ti-ezsdk_dm816x-evm_5_03_01_15/board-support/linux-2.6.37-psp04.00.01.13.patch2

PWD :=$(shell pwd)

default:
	$(MAKE) -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
clean:
	rm -rf *.ko *.o .*cmd *.mod.c .tmp_versions 


测试程序 pwm_test.c:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       int pow_10(char m) { int j; int res=1; for(j=0;j
      
       
测试 :

模块编译后加载:insmod dm8168_pwm.ko

交叉编译测试程序:arm-none-linux-gnueabi-gcc -o pwm_test pwm_test.c

运行:./pwm_test 50

输出为50%的PWM波形,测试成功。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ACdreamoj1110(多重背包) 下一篇补间动画实现(tween)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: