完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在使用帖的2~4帖,我们将会对LED进行一个深入的学习,这一篇主要介绍ARM 335X 基于linux IO 对寄存器的操作 1.ARM 335X 要控制IO 输出高电平 则需要对3个地方做出配置。分别是GPIO control mode , gpio_oe ,gpio_out_data 2.控制我们开发板的LED 为GPIO_3_16,通过查找开发板资料的X:evb335x-ii光盘(linux)linuxdatasheetCoM-335XCPU 的am335x-ref.pdf & am3354.pdf 可知道 3.我们点亮一个LED ,通过对GPIO_3_16 输出高点屏即可,相关文件在x:evb335x-ii光盘(linux)linuxsch 4.我们编写一个简单的驱动,使用APP 控制驱动,使LED亮,保持1s,再灭。 下面是驱动程序,关键点已经加入了注释: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * config context : * GPIO3_16 | conf_mcasp0_axr0 | base address : 0x44E10000 | control mode offset: 998h * GPIO3 register | base address :0x481AE000 | OE offset: 134h | OUT_DATA offset: 13C * */ #define GPIO_CONTROL_MODULE 0x44E10000 + 0x998 #define GPIO_3_OE 0x481AE000 + 0X134 #define GPIO_3_DATAOUT 0x481AE000 + 0X13C /* * register memory map define */ volatile unsigned int *gpio_con_mod = NULL; volatile unsigned int *gpio_3_oe = NULL; volatile unsigned int *gpio_3_out = NULL; static dev_t dev; static struct cdev cdev; static struct class *led_class; char kbuf[100]; // define kernel buf ,size = 100; static int module_dev_open(struct inode *inode, struct file *filp) { printk("success openn"); return 0; } static int module_dev_release(struct inode *inode, struct file *filp) { printk("success releasen"); return 0; } ssize_t module_dev_write(struct file *filp, const char __user *ubuf, size_t count, long * loff) { int ret = -1; ret = copy_from_user(kbuf,ubuf,count); if(ret) { printk("there is a error in program n"); return -EINVAL; } /* * in the app: * define "1" led_on * define "0" led_off */ switch(kbuf[0]) { case '1': writel((1<<16),gpio_3_out); //*gpio_3_out |=(1<<16); break; case '0': writel((0<<16),gpio_3_out); //*gpio_3_out &=(0<<16); break; default: printk("write a error n"); break; } return 0; } static const struct file_operations fops = { .owner = THIS_MODULE, .open = module_dev_open, .release = module_dev_release, .write = module_dev_write, }; static int __init module_dev_init(void) { int retval = -1; retval = alloc_chrdev_region(&dev,0,1,"led_module"); if(retval < 0) { return -EINVAL; } cdev_init(&cdev, &fops); cdev.owner = THIS_MODULE; retval = cdev_add(&cdev,dev,1); if(retval < 0) { //goto failed; } led_class = class_create(THIS_MODULE,"led_module"); device_create(led_class,NULL,dev,NULL,"led_module"); gpio_con_mod = (volatile unsigned int *)ioremap(GPIO_CONTROL_MODULE,4); gpio_3_oe = (volatile unsigned int *)ioremap(GPIO_3_OE,4); gpio_3_out = (volatile unsigned int *)ioremap(GPIO_3_DATAOUT,4); writel(0x07,gpio_con_mod); writel(~(1<<16),gpio_3_oe); printk(KERN_INFO "success init kerneln"); //failed: //cdev_del(&cdev); //unregister_chrdev_region(dev,1); return 0; } static void __exit module_dev_exit(void) { iounmap(gpio_con_mod); iounmap(gpio_3_oe); iounmap(gpio_3_out); device_destroy(led_class,dev); class_destroy(led_class); cdev_del(&cdev); unregister_chrdev_region(dev,1); printk(KERN_INFO "success exit kerneln"); } module_init(module_dev_init); module_exit(module_dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("fengzhisha @bbs.elecfans.com"); 下面是app程序: #include #include #include #include #define FILE "/dev/led_module" char ubuf[100]; int main(void) { int fd = -1; fd = open(FILE,O_RDWR); if(fd < 0) { printf("scanf is errorn"); return -1; } write(fd,"1",1); printf("success writen"); sleep(2); write(fd,"0",1); close(fd); return 0; } 最后是Makefile,我们使用的开发板在X:evb335x-ii光盘(linux)linuxemmckernel:linux-3.14.43-evb335x-ii-emmc.tar.bz2,解压到ubuntu中 KERNEL_DIR :=/home/linux-3.14.43-evb335x-ii/ PWD = $(shell pwd) all: $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules arm-linux-gnueabihf-gcc -o app app.c clean: rm -rf *.o *.ko *.mod.o *.mod obj-m = module_dev.o 以上就是全部代码,不过这只是基于LINUX IO 寄存器的操作 并不符合linux drive 框架规范,下面一章将基于linux 2.6以上 实现的gpiolib 进行操作。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
【盈鹏飞RK3399安卓主板 XPC-3399Pro免费试用】+烧写出厂固件
10276 浏览 0 评论
【盈鹏飞EVB-T335开发板试用体验】debian系统烧写
3296 浏览 1 评论
【盈鹏飞I.MX6UL工控开发板试用体验】linux can 测试
3192 浏览 0 评论
266浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 06:16 , Processed in 0.535998 second(s), Total 63, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号