<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                上一篇文章我們剛好可以登錄用戶了,如果登錄成功就是調用main.cgi這個java腳本在這一小節中我們就來學習main.c這個文件。 在這里我得強調一下,在網頁中控制開發板上的開設,這個項目在所有開發板上基本通用,只是你的外設驅動程序不一樣吧了,這里我寫出我開發板上led驅動程序,如果你在網頁上想顯示溫度,氣體濃度,這需要加相應傳感器和驅動就可以了,不同內核有可能用函數或者宏不一樣,自己做相應的修改就好了。 led_drv.c驅動程序:(既然你都開始做項目了,我相信這個驅動程序應該難不倒你吧) ~~~ #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/device.h> #include <linux/miscdevice.h> #include <linux/delay.h> #include <asm/irq.h> #include <asm/io.h> #include <asm/uaccess.h> #include <mach/regs-gpio.h> #include <mach/hardware.h> #include <linux/device.h> #include <linux/gpio.h> #define DEVICE_NAME "led1" ~~~ static struct class *led_1; ? /* 定義一個;類,用來自動創建設備節點 */ ~~~ static unsigned long led_table [] = { S3C2410_GPB5, S3C2410_GPB6, S3C2410_GPB8, S3C2410_GPB10, }; static unsigned int led_cfg_table [] = { S3C2410_GPB5_OUTP, //0x01<<10 defined in refg-gpio.h S3C2410_GPB6_OUTP, S3C2410_GPB8_OUTP, S3C2410_GPB10_OUTP, }; static int s3c2440_leds_ioctl( struct inode *inode, struct file *file,unsigned int cmd,unsigned long arg) { switch(cmd) { case 0: case 1: ? ?if (arg > 4)? ? ?{ ? ?return -EINVAL; ? ?} s3c2410_gpio_setpin(led_table[arg], !cmd); return 0; default: return -EINVAL; } } static struct file_operations s3c2440_leds_fops = { .owner = THIS_MODULE, .ioctl = s3c2440_leds_ioctl, }; static int major; static int __init s3c2440_leds_init(void) { ? int i; ?major= register_chrdev(0, DEVICE_NAME, &s3c2440_leds_fops); ?/* 自動分配主設備號 */ ? led_1 = class_create(THIS_MODULE, DEVICE_NAME); ? ? ? ? ? ? ? /* 創建一個類 */ device_create(led_1, NULL, MKDEV(major, 0), NULL, "led");/* 在類下面創建一個設備節點,名字為led,應用程序就可以調用open("/dev/led", O_RDWR來訪問驅動程序。 */ for (i = 0; i < 4 ; i++)? { s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);//設置輸出輸入 s3c2410_gpio_setpin(led_table[i], 1); } printk(DEVICE_NAME " initialized\n"); return 0; } static void __exit s3c2440_leds_exit(void) { unregister_chrdev(major, DEVICE_NAME); ? ? ? ?/* 取消注冊 */ device_destroy(led_1,MKDEV(major, 0)); ? ? ? ? ? ?/* 刪除類下面的設備節點 */ class_destroy(led_1);/* 刪除類 */ } module_init(s3c2440_leds_init); module_exit(s3c2440_leds_exit); MODULE_LICENSE("Dual BSD/GPL"); ~~~ 上面是我led驅動程序,在main.cgi中會用到。下面我們來看看main.c怎么編寫的。 main.c文件: ~~~ #include<string.h> #include <stdio.h> #include <stdlib.h> #include<fcntl.h> void config(int *led_config,int led_num); ? ? ? ? ?/* led配置文件 */ void led_fun(int *led_config);/*調用led驅動函數*/ int main() { int led_num=0; int led_config[4]={0,0,0,0}; FILE *fp_html; char buf[512]=""; char *len; printf("%s\r\n\r\n","Content-Type:text/html"); len = getenv("CONTENT_LENGTH"); if(len != NULL) {? unsigned int content_len = 0; char *data; content_len = atoi(len); data = malloc(content_len + 1); read(0, data, content_len); sscanf(data,"led%d",&led_num); ? /* 把那個led狀態改變讀出來 */ free(data); } else? { led_num=0; } config(led_config,led_num); led_fun(led_config); if( (fp_html=fopen("main_html","r")) == NULL) ??/*這里注意,我們不能再寫一個html網頁,只能通過printf來打印一個網頁,為了方便,我們把這個網頁讀取出來放在一個數組中,在用printf來打印,這個網頁是我們用來人機控制界面,開始我們設置了一個用戶登錄界面*/ { exit(1); } while(fgets(buf,512,fp_html)) { if(strncmp(buf,"$FLAG4$",7)==0) ?/* 這里用到一個變量 */ { int i=0; for(i=0; i < 4; i++) { if(led_config[i]==0) { printf("<img src=\"../www/image/off.jpg\" width=30 height=30 hspace=45 >");/* 圖片的切換 */ } else? { printf("<img src=\"../www/image/on.jpg\" width=30 height=30 hspace=45 >"); } } } else? printf("%s",buf); } return 0; } void config(int *led_config,int led_num) { FILE *fp; if((fp=fopen("config.ini","r+"))==NULL) ?/*這里很重要,開始我實現這個功能的時候,總是不成功,后來找到原因了,當我們點擊網頁上的按鈕時候,這個腳本就會重新刷新一次,從開始重新執行,我們的led狀態就會恢復初值,后來才想到一個辦法,把led的狀態保存在一個配置文件config.ini中,*/ { printf("<p>fopen Error!<a href=\"/cgi-bin/main.cgi\">Return/a>"); exit(1); } fscanf(fp,"led1=%d,led2=%d,led3=%d,led4=%d",led_config,led_config+1,led_config+2,led_config+3); /* fscanf是把配置文件的狀態讀取出來,來控制led?*/ if(led_num > 0) { if(led_config[led_num-1]==1) { led_config[led_num-1] = 0; } else? { led_config[led_num-1] = 1; } fseek(fp,7*(led_num-1)+5,SEEK_SET); fprintf(fp,"%d",led_config[led_num-1]); ?/* 把改變的狀態重新存放在配置文件,注意看文件句柄fp */ } fclose(fp); } void led_fun(int *led_config) { unsigned int led_num = 0; int led_fd = open("/dev/led", O_RDWR);? ?/* 打開驅動程序 */ for (led_num = 0; led_num < 4; led_num++) ? ?/*傳入我們的led配置文件*/ { ioctl(led_fd, led_config[led_num], led_num); } close(led_fd); } ~~~ 下一篇文章中將寫出led配置文件,main_html網頁文件源代碼。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看