驅動代碼如下:
#include <linux/kernel.h>//內核頭文件
#include #include #include #include #include //--------------cdev---------------- #include //-------------class_create,device_create------ #include //--------------GPIO----------------- #include #include #include //-------CMD COMMAND---------------- #define LED1_ON 0x1 #define LED1_OFF 0x0 #define DEVICE_NAME 'LED1' static int led1_gpios[]= { S5PV210_MP04(4), S5PV210_MP04(5), S5PV210_MP04(6), S5PV210_MP04(7) }; #define LED1_NUM ARRAY_SIZE(led1_gpios) /*用udev機制自動添加設備節點*/ struct class *led1_class; /*設備結構體*/ struct led1_dev_t { struct cdev cdev; }led1_dev; /* // ------------------- READ ------------------------ ssize_t led1_read (struct file * file ,char * buf, size_t count, loff_t * f_ops) { return count; } // ------------------- WRITE ----------------------- ssize_t led1_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops) { return count; } // ------------------- OPEN ------------------------ ssize_t led1_open (struct inode * inode ,struct file * file) { return 0; } // ------------------- RELEASE/CLOSE --------------- ssize_t led1_release (struct inode * inode ,struct file * file) { return 0; } // ------------------------------------------------- */ // ------------------- IOCTL ----------------------- static int led1_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, unsigned long arg) { if(arg > LED1_NUM) { printk('arg is %u ,led num is %dn',arg,LED1_NUM); printk('num is err!!n'); return - EINVAL; } switch (cmd) { case LED1_ON: { /*code*/ gpio_set_value(led1_gpios[arg],0); printk('led1 is on!!n'); break; } case LED1_OFF: { /*code*/ gpio_set_value(led1_gpios[arg],1); printk('led1 is off!!n'); break; } default : { printk ('CMD err!!n'); return - EINVAL; } } return 0; } struct file_operations led1_fops ={ .owner = THIS_MODULE, // .open = led1_open, // .read = led1_read, // .write = led1_write, .ioctl = led1_ioctl, // .release = led1_release, }; // ------------------- INIT ------------------------ static int __init led1_init(void) { printk('led num is : %dn',LED1_NUM); int i,ret; for (i = 0; i < LED1_NUM; i++) { /* ret=gpio_request(led1_gpios[i],'LED1'); if(ret)//注意,是ret { printk('%s:request GPIO %d for LED1 failed,ret= %dn',DEVICE_NAME,led1_gpios[i],ret); return ret; } */ s3c_gpio_cfgpin(led1_gpios[i],S3C_GPIO_SFN(1)); gpio_set_value(led1_gpios[i],1); } /*init cdev*/ cdev_init(&led1_dev.cdev,&led1_fops); led1_dev.cdev.owner=THIS_MODULE; /*向系統動態申請未被占用的設備號*/ ret = alloc_chrdev_region(&led1_dev.cdev.dev,0,1,DEVICE_NAME);//int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name) if (ret) { printk('register failedn'); return ret; } /*添加字符設備*/ ret = cdev_add(&led1_dev.cdev, led1_dev.cdev.dev, 1); if (ret) { printk('cdev add failedn'); goto fail1; } /*udev機制可以自動添加設備節點,只需要添加xxx_class這個類,以及device_create()*/ led1_class = class_create(THIS_MODULE, 'led1_class');/*在sys目錄下創建xx_class這個類,/sys/class/~*/ if (IS_ERR(led1_class)) { printk('class create failedn'); goto fail2; } device_create(led1_class, NULL, led1_dev.cdev.dev, DEVICE_NAME, DEVICE_NAME);/*自動創建設備/dev/$DEVICE_NAME*/ return ret; fail2: cdev_del(&led1_dev.cdev); fail1: unregister_chrdev_region(led1_dev.cdev.dev, 1); return ret; } static void __exit led1_exit(void) { int i; /* for (i = 0; i < LED1_NUM; i++) { gpio_free(led1_gpios[i]); } */ device_destroy(led1_class, led1_dev.cdev.dev); class_destroy(led1_class); cdev_del(&led1_dev.cdev); unregister_chrdev_region(led1_dev.cdev.dev, 1); } module_init(led1_init); module_exit(led1_exit); MODULE_LICENSE('GPL'); MODULE_AUTHOR('mhb@seu'); 測試代碼如下: #include //#include 'sys/types.h' #include #include #include //#include 'termios.h' //#include 'sys/stat.h' #include #define LED1_ON 0x1 #define LED1_OFF 0x0 main(int argc,char *argv[]) { int fd; if ((fd=open('/dev/LED1',O_RDWR /*| O_NDELAY | O_NOCTTY*/)) < 0) { printf('Open Device failed.rn'); exit(1); } else { printf('Open Device successed.rn'); } if (argc<3) { /* code */ printf('Usage: %s exit(2); } if(!strcmp(argv[1],'on')) { printf('led1 will on!!n'); printf('argv[2]=%dn',atoi(argv[2])); if(ioctl(fd,LED1_ON,atoi(argv[2]))<0) { printf('ioctl err!!n'); } } if(!strcmp(argv[1],'off')) { printf('led1 will off!!n'); if(ioctl(fd,LED1_OFF,atoi(argv[2]))<0) { printf('ioctl err!!n'); } } close(fd); }
上一篇:Linux下GPIO驅動(五) ----misc_register();
下一篇:Linux下18b20溫度傳感器驅動代碼及測試實例
推薦閱讀最新更新時間:2025-04-23 18:08





設計資源 培訓 開發板 精華推薦
- LTC3615IFE-1 單路低紋波 6A 輸出同步降壓型 DC/DC 轉換器的典型應用
- 使用 Analog Devices 的 LTC3374AIFE 的參考設計
- L6564過渡模式PFC(功率因數校正)評估板
- AC164103,用于 rfRXD0420 433.92-MHz 接收器模塊的評估套件
- 使用 Infineon Technologies AG 的 OM8505SF 的參考設計
- 智能電源模塊,600V Motion SPM 3 ver.5 系列應用電路
- 電創桌墊
- LTC1655LCS8、16 位軌至軌微功率 DAC 的典型應用,用于隔離式 4mA 至 20mA 過程控制器
- 使用 Microchip Technology 的 TCL1117-3.30 的參考設計
- L78L06AB可調輸出穩壓器的典型應用
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析
- KEIL4 工程到 KEIL5 程序的移植方法
- 下載程序時出現Cannot Load Flash Device Description!情況
- 下載出錯:Could not stop Cortex-M device!Please check the JTAG cable.
- STLINK下載出錯:Internal command error
- STlink下載出現st-link usb communication error解決方法
- 小鵬也做“四足機器人”了!今日發布智能機器馬,穿了馬甲的四足機器人
- 趨勢改變,2021下半年工業機器人市場分析!
- 碧桂園機器人“造”房開啟4倍速,恒大機器人造車只要1分鐘……機器人為何被房企盯上
- 激光切割機器人的工作原理詳細介紹
- EMC對策產品: TDK推出用于汽車的新型小型共模濾波器