自己动手写驱动

所需积分/C币:9 2012-07-20 23:42:16 343KB PDF
收藏 收藏
举报

Linux2.6.33之自己动手写驱动,很适合初学者快速入门。
#include <asm/unistd. h> #include <linux/gpio. h> #define device name"GPlo-Control #define S3 C2410 GPFCON S3 C2410 GPIOREG(0X50 #define s3C2410 gPedat S3C2410 GPIOREG(0X54) #define s3C2410 GPfUP S3C2410 GPIOREG(0X58 #define s3C2410 gPF4 S3C2410 GPIONO(S3C2410 GPIO BANKF, 4) #define s3C2410 gPFs S3C2410 GPIONO(S3C2410 GPIO BANKE, 5) #define s3C2410 gPf6 S3 C2410 GPIONO(S3 C2410 GPIO BANKF 6) #define s3C2410 GPF7 S3C2410 GPIONO(S3C2410 GPIO BANKE, 7) # define s3c2410GPF40UTP(0x×01<≤8) #define $3 C2410 GPF5 OUtP(0X01 < 10) #define S3 C2410 GPF6 oUtP (0x01 < 12) #define s3 C2410 GPF7 oUtp(0x01 < 14) /*应用程序执行ioct(fd,cmd,arg)时的第2个参数*/ #define Ioctl gpio on 1 tdefine octl gpio off o /*用来指定LED所用的GPo引脚* static unsigned long gpio table l S3C2410_GPF(4), S3C2410_GPF(5) S3C2410_GPF(6), S3C2410_GPF() /*用来指定GPO引脚的功能:输出*/ static unsigned int gpio cfg_ table [ /:于2633内核中没有定义GPO的动作,所以我在上面自己定义了下。 S3C2410 GPF4 OUTP S3C2410 GPF5 OUTP S3C2410 GPF6 OUTP S3C2410 GPFZ OUTP static int te2440_ gpio ioctl( struct inode *inode struct file* file unsigned unsigned long arg) if (arg> 4 return -INVAl switch(cmd) se IocTl gPio on ∥/设置指定引脚的输出电平为0 s3c2410 gpio setpin( gpio table[argl,O); return o case IocTL gPio off ∥/设置指定引脚的输出电平为1 s3c2410 gpio setpin(gpio tablelargl, 1) return o default. return -ENVAL static struct file operations dev fops= f owner THIS MODULE t|=te2440 static struct miscdevice misc =t minor MISC DYNAMIC miNoR name DEVICE NAME fops =&dev fops static int I nit dev init(void) int ret int i: for(i=0;i<4;i++) s3c2410- gpio cfgpin(gpio table[i], gpio cfg_ table[]); s3c2410 gpio setin(gpio table[il, o ret= misc_register(&misc); printk(DEVICE NAME initialized\n ) return ret: static void exit dev exit(void misc deregister(&misc); module init(dev init) module exit(dev exit MODULE LICENSE(GPL") Module_AuthOr("wWw.Top-Elec.com); MODULE DESCRIPTION(GPIO control for Topelec tE2440DEV I Board") 3、让驱动到内核里混一下 在内核派码中添加对灯驱动的支持,修改同目录下的 文件,添加如下内容: 同样的道理,修改同目录下的 文件,修改的内容如下: 4、配置和编译内核 进入内核目录,键入 make menuconfig命令,进入内核配置菜单,如下图所示 Arron kEys rri mat.p the mP F101 imta let- exe s IE24400EV-I Board GPIO Test (LED TESI, tallinn mlll-irort erian F] Legacy (BST) P+5 3u 〔b) Maximim rumer of T:ner IOMEM HU Randon W amber Generator aupp elect *EAT 图 Dⅳver-> chacarter device->TE2440DEV4 Board gPio Test的支持,当然,你也可以选择<M>将驱 动编译成模块。 好了,OK,大胆的make吧 当然可能有错误,因为内核的版本不致,或是编译器的问题,总之, Linux虽然玩起来和 带劲,但是问题也会很多,要有越挡越勇的精神才能成为真正的高手哦! 至于,怎么把内核搞到板子上不在这里就不说了 5、编写测试程序 水水木水水本木水本水水木水本水*水水本水水不水水水水水水水本水水木水木水 NAME: GPIO TEST.C CopyRight:www.top-elec.com 米米冰*米米*米冰*米半求米米*冰米*米*米半米米米求冰米非 #include <stdio. h> /*定义函数要用到的头文件* #include <stdlib h> #include <unistd. h> #include <sys /ioctl. h> nt main(int argc, char **argv) /*运行时参数传递,廾或关哪个LED*/ Int on; /定义led状态变量,1表示灯亮,2表示灯灭* int led no: /*定义led变量-哪个led*/ /定义led设备文件描述符的变量* if (argc ! =3 sscanf(argv[1], %d",&led no)!=1 sscanf(argv[2], %d",&on)!=1 I on<0 on>1 led no <1 led no>4 /判断命令输入参数个数*/ tprintf(stderr, Usage: Please enter led number and led status, For example GPIO TEST 10 exit(1) fd open ( dev/GPlO-Control",O /*为只读打开 GPlO-Control设备文件, 取出文件描述符* if (fd <0)i perror("open device/dev/GPIO-Control") /*如果打开led文件出错,拿不到文件 描述符,用 perror宏输出错原因及信息*/ exit(1) oct(fd,on,(ed_no-1);/*用ioct(函数控制LED,其中fd-是前面打开的LED文作描述符,on 是开关命令0和1, led no-是哪个LED*/ close(fd); return o: 顺便这个 Makefile文件,看起来专业点: CROSS=arm-softfloat-linux-gnu all: GPIO TEST GPIO TEST: GPIO TEST.C S(CROSS)gCC GPIO TEST.C -O GPIO TEST S(CROSS)strip GPIO TEST clean: @rm -Vf GPIO TEST .O *A 有了上面的两个make就可以了 最后把测试程序搞的开发板上运行 bash-32#, GPIO TEST11意思是D1被点亮

...展开详情
试读 7P 自己动手写驱动
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    抢沙发
    一个资源只可评论一次,评论内容不能少于5个字
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    自己动手写驱动 9积分/C币 立即下载
    1/7
    自己动手写驱动第1页
    自己动手写驱动第2页
    自己动手写驱动第3页

    试读已结束,剩余4页未读...

    9积分/C币 立即下载 >