{"id":5170,"date":"2014-06-12T18:41:49","date_gmt":"2014-06-12T23:41:49","guid":{"rendered":"httpss:\/\/www.powenko.com\/wordpress\/?p=5170"},"modified":"2014-11-16T22:25:46","modified_gmt":"2014-11-17T03:25:46","slug":"5170","status":"publish","type":"post","link":"https:\/\/www.powenko.com\/wordpress\/?p=5170","title":{"rendered":"02 LED \u9a45\u52d5\u7a0b\u5f0fS3C64XX"},"content":{"rendered":"<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n#include &lt;linux\/module.h&gt;\r\n#include &lt;linux\/kernel.h&gt;\r\n#include &lt;linux\/io.h&gt;\r\n#include &lt;linux\/fs.h&gt;\r\n#include &lt;asm\/uaccess.h&gt;\r\n#include &lt;linux\/miscdevice.h&gt;\r\n#include &lt;linux\/pci.h&gt;\r\n#include &lt;linux\/ioctl.h&gt;\r\n#include &lt;linux\/init.h&gt;\r\n\r\n#define DEVICE_NAME &quot;leds0&quot; \/\/ (\/dev\/leds)\r\n\r\n#define UGPMCON (*(volatile unsigned long *)S3C64XX_GPMCON)\r\n#define UGPMDAT (*(volatile unsigned long *)S3C64XX_GPMDAT)\r\n#define UGPMPUD (*(volatile unsigned long *)S3C64XX_GPMPUD)\r\n\r\nstatic long S3C64XX_GPMCON=0xF4500820;\r\nstatic long S3C64XX_GPMDAT=0xF4500824;\r\n\r\n#define LED_MAJOR 240\r\n\r\nstatic int led_ioctl(struct file *file, unsigned int cmd, unsigned long arg)\r\n{\r\n\/\/      printk(KERN_ALERT&quot;\\ncmd = %d  arg = %d \\n&quot;, cmd, arg);\r\n\r\n    switch(cmd)\r\n    {\r\n        case 0:\r\n            printk(KERN_ALERT&quot;led%d off\\n&quot;, arg);\r\n            switch(arg)\r\n            {\r\n            case 0:\r\n                UGPMDAT |= 0x01;\r\n                break;\r\n            case 1:\r\n                UGPMDAT |= 0x02;\r\n                break;\r\n            case 2:\r\n                UGPMDAT |= 0x04;\r\n                break;\r\n            case 3:\r\n                UGPMDAT |= 0x08;\r\n                break;\r\n\r\n            default:\r\n                break;\r\n            }\r\n            break;\r\n        case 1:\r\n            printk(KERN_ALERT&quot;led%d on\\n&quot;, arg);\r\n            switch(arg)\r\n            {\r\n            case 0:\r\n                UGPMDAT &amp;= 0xfe;\r\n                break;\r\n            case 1:\r\n                UGPMDAT &amp;= 0xfd;\r\n                break;\r\n            case 2:\r\n                UGPMDAT &amp;= 0xfb;\r\n                break;\r\n            case 3:\r\n                UGPMDAT &amp;= 0xf7;\r\n                break;\r\n\r\n            default:\r\n                break;\r\n            }\r\n\r\n            break;\r\n        case 11:\r\n            printk(KERN_ALERT&quot;led all on\\n&quot;);\r\n                UGPMDAT &amp;= 0xe0;\r\n            break;\r\n        case 10:\r\n            printk(KERN_ALERT&quot;led all off\\n&quot;);\r\n                UGPMDAT |= 0xff;\r\n            break;\r\n\r\n        default:\r\n            break;\r\n        }\r\n\r\n    return 0;\r\n}\r\n\r\nstruct file_operations led_fops={\r\n    .owner = THIS_MODULE,\r\n    .unlocked_ioctl = led_ioctl,\r\n};\r\n\r\nstatic struct miscdevice misc = {\r\n\r\n    .minor = MISC_DYNAMIC_MINOR, \/\/\u52a8\u6001\u8bbe\u5907\u53f7\r\n\r\n    .name = DEVICE_NAME,\r\n\r\n    .fops = &amp;led_fops,\r\n\r\n};\r\n\r\n\r\nstatic int __init led_init(void)\r\n{\r\n    int rc;\r\n    rc = misc_register(&amp;misc);\r\n    outl(0x00111111,S3C64XX_GPMCON);\r\n    outl(0xff,S3C64XX_GPMDAT);\r\n\r\n    if(rc&lt;0)\r\n    {\r\n        printk(KERN_ALERT&quot;register %s char dev error\\n&quot;,&quot;leds&quot;);\r\n        return -1;\r\n    }\r\n    printk(KERN_ALERT&quot;OK!\\n&quot;);\r\n    return 0;\r\n}\r\n\r\nstatic void __exit led_exit(void)\r\n{\r\n    unregister_chrdev(LED_MAJOR, &quot;leds&quot;);\r\n    printk(KERN_ALERT&quot;module exit\\n&quot;);\r\n}\r\n\r\nmodule_init(led_init);\r\nmodule_exit(led_exit);\r\n\r\nMODULE_LICENSE(&quot;GPL&quot;);\r\nMODULE_AUTHOR(&quot;cw&quot;);\r\n\r\n<\/pre>\n<p>Makefile<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nKERNELDIR :=\/home\/share\/linux\/linux3.0\/kernel\/linux-3.0.1\r\n#KERNELDIR :=\/home\/share\/linux\/linux2.6.36\/linux-2.6.36.2-v1.05\r\nPWD :=$(shell pwd)\r\nmodules:\r\n        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules\r\n\r\nmodules_install:\r\n      $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install\r\nobj-m:=led.o\r\n\r\nclean:\r\n      rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers\r\n\r\n\r\n<\/pre>\n<p>\u6e2c\u8a66\u7a0b\u5f0f<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n#include &lt;stdio.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;unistd.h&gt;\r\n#include &lt;sys\/ioctl.h&gt;\r\nint main(int argc, char **argv)\r\n{\r\n     int on, cmd;\r\n     int led_no;\r\n     int fd;\r\n\r\n        if (argc != 3 || sscanf(argv&#x5B;1], &quot;%d&quot;, &amp;led_no) != 1 || sscanf(argv&#x5B;2],&quot;%d&quot;, &amp;on) != 1 || led_    no &lt; 0 || led_no &gt; 3) {\r\n             fprintf(stderr, &quot;Usage: leds led_no 0|1|2|3\\n&quot;);\r\n             exit(1);\r\n        }\r\n        fd = open(&quot;\/dev\/leds0&quot;, 0);\r\n        if(fd &lt; 0)\r\n             printf(&quot;Can't open \/dev\/leds!\\n&quot;);\r\n\r\n        ioctl(fd, on, led_no);\r\n        close(fd);\r\n\r\n        return 0;\r\n}\r\n\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>#include &lt;linux\/module.h&gt; #include &lt;linux\/kern [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4869,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[191],"tags":[],"class_list":["post-5170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ch6-jni"],"_links":{"self":[{"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/5170"}],"collection":[{"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5170"}],"version-history":[{"count":5,"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/5170\/revisions"}],"predecessor-version":[{"id":6065,"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/5170\/revisions\/6065"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/4869"}],"wp:attachment":[{"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.powenko.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}