您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Linux设备驱动开发入门
XavierCalbetGNUFreeDocumentationLicenseLinux•CC•Linux2.6.x1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:•Linux•.UNIXshellGUI1:,26:27:28:29:30:31:32:33:34:35:36:37:38:39:40:1.2.41:42:43:44:45:46:47:48:49:50:51:52:53:54:55:56:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72:73:74:75:76:77:78:79:80:81:82:83:84:Linuxnothing.cnothing.c=#includelinux/module.hMODULE_LICENSE(DualBSD/GPL);fififiMakefile1=obj-m:=nothing.o86:87:88:89:90:91:92:93:94:95:96:97:98:99:100:101:102:103:104:105:106:107:108:109:110:111:112:113:114:115:3.EventsUserfunctionsKernelfunctionsLoadmoduleinsmodOpendeviceReaddeviceWritedeviceClosedeviceRemovemodulermmod“helloworld”116:117:118:119:120:121:122:123:124:125:126:127:128:129:130:131:132:133:134:135:136:137:138:139:140:141:142:143:144:145:146:147:148:149:150:151:152:153:154:155:156:157:hello.c=#includelinux/init.h#includelinux/module.h#includelinux/kernel.hMODULE_LICENSE(DualBSD/GPL);staticinthello_init(void){printk(1Helloworld!\n);return0;}staticvoidhello_exit(void){printk(1Bye,cruelworld\n);}module_init(hello_init);module_exit(hello_exit);158:159:160:161:162:163:164:165:166:167:168:169:170:171:172:173:174:175:176:177:178:179:180:181:182:fifififiEventsUserfunctionsKernelfunctionsLoadmoduleinsmodmodule_init()OpendeviceReaddeviceWritedeviceClosedeviceRemovemodulermmodmodule_exit()183:184:185:186:187:188:189:190:191:192:193:194:195:196:197:198:199:200:201:202:203:204:205:206:207:208:209:210:211:212:213:214:215:216:217:218:219:220:221:222:223:224:225:#includememoryinitial=/*Necessaryincludesfordevicedrivers*/#includelinux/init.h#includelinux/config.h#includelinux/module.h#includelinux/kernel.h/*printk()*/#includelinux/slab.h/*kmalloc()*/#includelinux/fs.h/*everything...*/#includelinux/errno.h/*errorcodes*/#includelinux/types.h/*size_t*/#includelinux/proc_fs.h#includelinux/fcntl.h/*O_ACCMODE*/#includeasm/system.h/*cli(),*_flags*/#includeasm/uaccess.h/*copy_from/to_user*/MODULE_LICENSE(DualBSD/GPL);/*Declarationofmemory.cfunctions*/intmemory_open(structinode*inode,structfile*filp);intmemory_release(structinode*inode,structfile*filp);226:227:228:229:230:231:232:233:234:235:236:237:238:239:240:241:242:243:244:245:246:247:248:249:250:251:252:253:254:255:256:257:258:ssize_tmemory_read(structfile*filp,char*buf,size_tcount,loff_t*f_pos);ssize_tmemory_write(structfile*filp,char*buf,size_tcount,loff_t*f_pos);voidmemory_exit(void);intmemory_init(void);/*Structurethatdeclarestheusualfile*//*accessfunctions*/structfile_operationsmemory_fops={read:memory_read,write:memory_write,open:memory_open,release:memory_release};/*Declarationoftheinitandexitfunctions*/module_init(memory_init);module_exit(memory_exit);/*Globalvariablesofthedriver*//*Majornumber*/intmemory_major=60;/*Buffertostoredata*/char*memory_buffer;fi“memory”UNIXLinux259:260:261:262:263:264:265:266:267:268:269:270:271:272:273:274:275:276:277:278:279:280:281:282:283:284:285:286:287:288:289:290:291:292:293:294:295:296:297:#mknod/dev/memoryc600cregister_chrdevfile_operationsmemoryinitmodule=intmemory_init(void){intresult;/*Registeringdevice*/result=register_chrdev(memory_major,memory,&memory_fops);if(result0){printk(1memory:cannotobtainmajornumber%d\n,memory_major);returnresult;}/*Allocatingmemoryforthebuffer*/memory_buffer=kmalloc(1,GFP_KERNEL);if(!memory_buffer){result=-ENOMEM;gotofail;}memset(memory_buffer,0,1);printk(1Insertingmemorymodule\n);return0;fail:memory_exit();298:299:300:301:302:303:304:305:306:307:308:309:310:311:312:313:314:315:316:317:318:319:320:321:322:323:324:325:326:327:328:329:330:331:returnresult;}kmalloc“memory”memory_exitunregsiter_chrdevmemoryexitmodule=voidmemory_exit(void){/*Freeingthemajornumber*/unregister_chrdev(memory_major,memory);/*Freeingbuffermemory*/if(memory_buffer){kfree(memory_buffer);}printk(1Removingmemorymodule\n);}“momory”332:333:334:335:336:337:338:339:340:341:342:343:344:345:346:347:348:349:350:351:352:353:354:355:356:357:fifimemory_openmemoryopen=intmemory_open(structinode*inode,structfile*filp){/*Success*/return0;}5EventsUserfunctionsKernelfunctionsLoadmoduleinsmodmodule_init()Opendevicefopenfile_operations:openReaddeviceWritedeviceClosedeviceRemovemodulermmodmodule_exit()358:359:360:361:362:363:364:365:366:367:368:369:370:371:372:373:374:375:376:377:378:379:380:381:382:383:384:385:386:387:388:389:390:391:392:393:394:395:396:397:398:“monory”fclosereleasefile_operationsregister_chrdevmemory_release,fimemory_releasememoryrelease=intmemory_release(structinode*inode,structfile*filp){/*Success*/return0;}6.EventsUserfunctionsKernelfunctionsLoadmoduleinsmodmodule_init()Opendevicefopenfile_operations:openReaddeviceWritedeviceClosedevicefclosefile_operations:releaseRemovemodulermmodmodule_exit()399:400:401:402:403:404:405:406:407:408:409:410:411:412:413:414:415:416:417:418:419:420:421:422:423:424:425:426:427:428:429:430:431:432:433:434:435:436:437:438:439:440:441:memoryfile_operationsregister_chrdevmemory_readfimemory_readcopy_to_usermemory_buffermemo
本文标题:Linux设备驱动开发入门
链接地址:https://www.777doc.com/doc-6040320 .html