完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
寻求帮助啊!
我想自己编写驱动控制直流电机,应用的是2410的TOUT0口PWM功能。不想使用linux里的自带的函数,如s3c2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPB0_TOUT0); 想自己定义GPIO的虚拟地址,但不知道怎么搞啊?使用的是linux-2.6.22.2 我的想法是: 寄存器起始地址信息定义(includeasm-ARMarch-s3c2410map.h): #define S3C2410_VA_DCM S3C2410_ADDR(0xe1000000) #define S3C2410_PA_DCM __phys_to_pfn(0x51000000) #define S3C2410_SZ_DCM SZ_1M #define S3C2410_VA_PBCON S3C2410_ADDR(0xe5000000) #define S3C2410_PA_PBCON __phys_to_pfn(0x56000010) #define S3C2410_SZ_PBCON SZ_4K 初始化(archarmmach-s3c2410mach-smdk2410.c): static struct map_descsmdk2410_iodesc[] __initdata = { /* nothing here yet */ { .virtual= S3C2410_VA_ISA_NET, .pfn= S3C2410_PA_ISA_NET, .length= S3C2410_SZ_ISA_NET, .type= MT_DEVICE, },{ .virtual = S3C2410_VA_DCM, .pfn = S3C2410_PA_DCM, .length = S3C2410_SZ_DCM, .type = MT_DEVICE, },{ .virtual = S3C2410_VA_PBCON, .pfn = S3C2410_PA_PBCON, .length = S3C2410_SZ_PBCON, .type = MT_DEVICE, } }; 驱动程序里: #include 然后操作这些vGPBCON等地址。 但这样电机始终没反应,量测TOUT口也没有信号啊。 求救啊,希望大侠们帮忙看一下。谢啦 |
|
相关推荐
1个回答
|
|
程序乱掉了。重发
寻求帮助啊! 我想自己编写驱动控制直流电机,应用的是2410的TOUT0口PWM功能。不想使用linux里的自带的函数,如s3c2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPB0_TOUT0); 想自己定义GPIO的虚拟地址,但不知道怎么搞啊?使用的是linux-2.6.22.2 我的想法是: 寄存器起始地址信息定义(includeasm-armarch-s3c2410map.h): #define S3C2410_VA_DCM S3C2410_ADDR(0xe1000000) #define S3C2410_PA_DCM __phys_to_pfn(0x51000000) #define S3C2410_SZ_DCM SZ_1M #define S3C2410_VA_PBCON S3C2410_ADDR(0xe5000000) #define S3C2410_PA_PBCON __phys_to_pfn(0x56000010) #define S3C2410_SZ_PBCON SZ_4K 初始化(archarmmach-s3c2410mach-smdk2410.c): static struct map_desc smdk2410_iodesc[] __initdata = { /* nothing here yet */ { .virtual = S3C2410_VA_ISA_NET, .pfn = S3C2410_PA_ISA_NET, .length = S3C2410_SZ_ISA_NET, .type = MT_DEVICE, },{ .virtual = S3C2410_VA_DCM, .pfn = S3C2410_PA_DCM, .length = S3C2410_SZ_DCM, .type = MT_DEVICE, },{ .virtual = S3C2410_VA_PBCON, .pfn = S3C2410_PA_PBCON, .length = S3C2410_SZ_PBCON, .type = MT_DEVICE, } }; 驱动程序里: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define vGPBCON (*(volatile unsigned long *)(S3C2410_VA_PBCON + 0x00)) #define vGPBUP (*(volatile unsigned long *)(S3C2410_VA_PBCON + 0x08)) #define vTCFG0 (*(volatile unsigned long *)(S3C2410_VA_DCM + 0x00)) #define vTCFG1 (*(volatile unsigned long *)(S3C2410_VA_DCM + 0x04)) #define vTCON (*(volatile unsigned long *)(S3C2410_VA_DCM + 0x08)) #define vTCNTB0 (*(volatile unsigned long *)(S3C2410_VA_DCM + 0x0C)) #define vTCMPB0 (*(volatile unsigned long *)(S3C2410_VA_DCM + 0x10)) #define vTCNTB1 (*(volatile unsigned long *)(S3C2410_VA_DCM + 0x18)) #define vTCMPB1 (*(volatile unsigned long *)(S3C2410_VA_DCM + 0x1C)) static dev_t ex1_dev_number; struct class *ex1_class; static struct cdev ex1_devs; #define DEVICE_NAME "s3c2410-dc-motor" #define DCM_IOCTRL_SETPWM (0x10) #define DCM_TCNTB0 (16384) #define DCM_TCFG0 (2) #define Tout01_enable() ({ vGPBCON &=~0xf; vGPBCON |= 0xa; }) #define Tout01_disable() ({ vGPBCON &=~0xf; vGPBCON |= 0x5; vGPBUP &=~0x3; }) #define dcm_stop_timer() ({vTCON &=~0x1;}) #define dcm_start_timer() ({vTCFG0 &=~(0x00ff0000); vTCFG0 |= (DCM_TCFG0); vTCFG1 &= ~(0xf); vTCNTB0 = DCM_TCNTB0; vTCMPB0 = DCM_TCNTB0/2; vTCON &=~(0xf); vTCON |= (0x2); vTCON &=~(0xf); vTCON |= (0x19); }) static int s3c2410_dcm_open(struct inode *inode, struct file *filp) { printk("S3c2410 DC Motor device open!n"); Tout01_enable(); dcm_start_timer(); return 0; } static int s3c2410_dcm_release(struct inode *inode, struct file *filp) { printk("S3c2410 DC Motor device release!n"); Tout01_disable(); dcm_stop_timer(); return 0; } static int dcm_setpwm(int v) { return (vTCMPB0 =DCM_TCNTB0/2 + v); } static int s3c2410_dcm_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { switch(cmd){ case DCM_IOCTRL_SETPWM: return dcm_setpwm((int)arg); } return 0; } static struct file_operations s3c2410_dcm_fops = { owner: THIS_MODULE, open: s3c2410_dcm_open, ioctl: s3c2410_dcm_ioctl, release:s3c2410_dcm_release, }; static int __init s3c2410_dcm_init(void) { alloc_chrdev_region(&ex1_dev_number,0,1,DEVICE_NAME); ex1_class=class_create(THIS_MODULE,DEVICE_NAME); cdev_init(&ex1_devs,&s3c2410_dcm_fops); ex1_devs.owner=THIS_MODULE; ex1_devs.ops=&s3c2410_dcm_fops; cdev_add(&ex1_devs,ex1_dev_number,1); class_device_create(ex1_class,NULL,ex1_dev_number,NULL,DEVICE_NAME); printk("DC motor initn"); return 0; } void __exit s3c2410_dcm_exit(void) { cdev_del(&ex1_devs); unregister_chrdev_region(MAJOR(ex1_dev_number),1); class_device_destroy(ex1_class,MKDEV(MAJOR(ex1_dev_number),0)); class_destroy(ex1_class); printk("DC motor exitn"); } module_init(s3c2410_dcm_init); module_exit(s3c2410_dcm_exit); MODULE_AUTHOR("Tf"); MODULE_LICENSE("GPL"); 然后操作这些vGPBCON等地址。 但这样电机始终没反应,量测TOUT口也没有信号啊。 求救啊,希望大侠们帮忙看一下。谢啦 |
|
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4880 浏览 0 评论
87376 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4702 浏览 2 评论
3592 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2467 浏览 0 评论
1978浏览 3评论
这是i.mx6ull的关于usb的宏定义,能解释下这些宏定义的意思
1340浏览 1评论
1248浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1318浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1221浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-5 03:49 , Processed in 1.030452 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号