标签:
由于之前做过51的小车项目,最近刚做完国嵌的移动物体监控系统,今天就写了个小车的雏形。
当然,它只是字符驱动做的,对俺这样的新人满练手的,哈哈。
言归正传,先上图:
我选取这4个引脚做输出端控制小车。
#include <linux/module.h> #include <linux/kernel.h> #include <linux/uaccess.h> #include <linux/clk.h> #include <mach/regs-gpio.h> #include <mach/io.h> #include <mach/map.h> #include <mach/regs-clock.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/platform_device.h> #include <linux/delay.h> /*四个输出口*/ #define EINT3 S3C2410_GPF3 #define E3_IN S3C2410_GPF3_INP #define E3_OUT S3C2410_GPF3_OUTP #define EINT4 S3C2410_GPF4 #define E4_IN S3C2410_GPF4_INP #define E4_OUT S3C2410_GPF4_OUTP #define EINT8 S3C2410_GPG0 #define E8_IN S3C2410_GPG0_INP #define E8_OUT S3C2410_GPG0_OUTP #define EINT11 S3C2410_GPG3 #define E11_IN S3C2410_GPG3_INP #define E11_OUT S3C2410_GPG3_OUTP #define QIAN 0 #define HOU 1 #define ZUO 2 #define YOU 3 #define TING 4 #define DEVICE_NAME "xiaoche" //自定义驱动称为“xiaoche”。 #define XIAOCHE_MAJOR 202 /*static unsigned char init_xiaoche(void) { s3c2410_gpio_cfgpin(EINT3, E3_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E4_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E8_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT11, E11_OUT); // 配置EINT3输出模式 }*/ //前 static void qian_xiaoche() { s3c2410_gpio_cfgpin(EINT3, E3_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E4_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E8_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT11, E11_OUT); // 配置EINT3输出模式 s3c2410_gpio_setpin(EINT3, 1); s3c2410_gpio_setpin(EINT4, 1); s3c2410_gpio_setpin(EINT8, 0); s3c2410_gpio_setpin(EINT11,0); } //后 static void hou_xiaoche() { s3c2410_gpio_cfgpin(EINT3, E3_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E4_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E8_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT11, E11_OUT); // 配置EINT3输出模式 s3c2410_gpio_setpin(EINT3, 0); s3c2410_gpio_setpin(EINT4, 0); s3c2410_gpio_setpin(EINT8, 1); s3c2410_gpio_setpin(EINT11, 1); } //左 static void zuo_xiaoche() { s3c2410_gpio_cfgpin(EINT3, E3_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E4_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E8_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT11, E11_OUT); // 配置EINT3输出模式 s3c2410_gpio_setpin(EINT3, 1); s3c2410_gpio_setpin(EINT4, 0); s3c2410_gpio_setpin(EINT8, 0); s3c2410_gpio_setpin(EINT11,1); } //右 static void you_xiaoche() { s3c2410_gpio_cfgpin(EINT3, E3_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E4_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E8_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT11, E11_OUT); // 配置EINT3输出模式 s3c2410_gpio_setpin(EINT3, 0); s3c2410_gpio_setpin(EINT4, 1); s3c2410_gpio_setpin(EINT8, 1); s3c2410_gpio_setpin(EINT11,0); } //停 static void ting_xiaoche() { s3c2410_gpio_cfgpin(EINT3, E3_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E4_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT4, E8_OUT); // 配置EINT3输出模式 s3c2410_gpio_cfgpin(EINT11, E11_OUT); // 配置EINT3输出模式 s3c2410_gpio_setpin(EINT3, 0); s3c2410_gpio_setpin(EINT4, 0); s3c2410_gpio_setpin(EINT8, 0); s3c2410_gpio_setpin(EINT11, 0); } long xiaoche_ioctl (struct file *filp, unsigned int cmd, unsigned long arg) { switch(cmd) { case QIAN: qian_xiaoche(); return 0; case HOU: hou_xiaoche(); return 0; case ZUO: zuo_xiaoche(); return 0; case YOU: you_xiaoche(); return 0; case TING: ting_xiaoche(); return 0; default: return -EINVAL; } } static struct file_operations xiaoche_fops = { .owner = THIS_MODULE, .unlocked_ioctl = xiaoche_ioctl, //.open = init_xiaoche, }; static char __initdata banner[] = "TQ2440 XIAOCHE\n";//打印信息 static struct class *xiaoche_class; static int __init xiaoche_init(void) { int ret; printk(banner); ret = register_chrdev(XIAOCHE_MAJOR, DEVICE_NAME, &xiaoche_fops); if (ret < 0) { printk(DEVICE_NAME " can't register major number\n"); return ret; }//错误处理 xiaoche_class = class_create(THIS_MODULE, DEVICE_NAME); if(IS_ERR(xiaoche_class)) { printk("Err: failed in tope-leds class. \n"); return -1; } device_create(xiaoche_class, NULL, MKDEV(XIAOCHE_MAJOR, 0), NULL, DEVICE_NAME);//创建一个设备节点,节点名为DEVICE_NAME printk(DEVICE_NAME " initialized\n");//打印信息,内核中的打印用printk函数 return 0; } static void __exit xiaoche_exit(void) { printk(DEVICE_NAME " exit\n");//打印信息,内核中的打印用printk函数 unregister_chrdev(XIAOCHE_MAJOR, DEVICE_NAME);//取消注册设备 device_destroy(xiaoche_class, MKDEV(XIAOCHE_MAJOR, 0)); //删掉设备节点 class_destroy(xiaoche_class); //注销类 } module_init(xiaoche_init); module_exit(xiaoche_exit); MODULE_LICENSE("GPL");//遵循的协议
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include "stdio.h" #define QIAN 0 #define HOU 1 #define ZUO 2 #define YOU 3 #define TING 4 int main(int argc, char *argv[]) { int fd; int cmd; if(argc <2) { printf("please enter the second para!\n"); return 0; } cmd = atoi(argv[1]); fd = open("/dev/xiaoche",O_RDWR); if(cmd == 1) ioctl(fd,QIAN); if(cmd == 2) ioctl(fd,HOU); if(cmd == 3) ioctl(fd,ZUO); if(cmd == 4) ioctl(fd,YOU); if(cmd == 0) ioctl(fd,TING); return 0; }这就是我的全部代码了,不过我这有个疑问请教过路的大神,这个怎么改
这个 代码我编译时报错,后来改的
就这样了,
标签:
原文地址:http://blog.csdn.net/qq_33594960/article/details/51924895