開源龍芯loongson智龍主板V2.0不編譯內核直接寫程序點亮LED燈,獲取按鍵輸入

  樹莓派、龍芯智龍這類mini開發板上的Linux系統,通常都提供了像Arduino同樣操做引腳電路的功能,統稱GPIO接口(General-purpose input/output,通用目的輸入輸出)。但與Arduino不一樣,使用上涉及稍複雜的Linux內核概念。不一樣於Arduino直接將物理硬件暴露給用戶的形式(直接進行編程和操做,並燒寫芯片),Linux系統必須經過一個叫「驅動」的程序將物理硬件進行封裝,而後把其包裝好的接口按照linux文件系統的方式,提供給用戶進行操做,用戶操做硬件的時候必須經過這個文件系統進行輸入輸出,也就是所謂的「用戶態編程」。總結起來就是3種方式:html

  1. 內核編程,將源代碼跟linux源碼放在一塊兒編譯,將編譯好的操做系統安裝到目標機子(開發板)上
  2. 內核模塊編程,編譯成.ko文件,經過安裝驅動的方式把編譯好的文件放在系統內核中
  3. 用戶態編程,編譯成普通可執行文件,經過fopen等操做文件的方式,打開/sys/class/gpio/下面的用戶態接口(或者/dev下面本身編譯的內核驅動接口),像讀寫文件同樣操做電路。

閃爍led燈

(用戶態編程,此時龍芯智龍V2上的LED對應的GPIO口爲51號)linux

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(void){
	FILE *p=NULL;
	int i=0;
	int port=51;

	p = fopen("/sys/class/gpio/export","w");
	fprintf(p,"%d",port);
	fclose(p);

	p = fopen("/sys/class/gpio/gpio51/direction","w");
	fprintf(p,"out");
	fclose(p);

	for(i=0;i<100;i++){
		p = fopen("/sys/class/gpio/gpio51/value","w");
		fprintf(p,"%d",1);
		sleep(1);
		fclose(p);

		p = fopen("/sys/class/gpio/gpio51/value","w");
		fprintf(p,"%d",0);
		sleep(1);
		fclose(p);
	}
	p = fopen("/sys/class/gpio/unexport","w");
	fprintf(p,"%d",port);
	fclose(p);
	return 0;
}

在VMware虛擬機安裝的Kylin Ubuntu上經過交叉編譯工具進行編譯:編程

mipsel-linux-gcc led51.c -o led51_mips

將編譯好的led51_mips可執行文件考到u盤,經過u盤考到智龍主板上,遠程連接智龍並進入智龍的linux系統,輸入./led51_mips運行該可執行文件,能夠看到智龍主板上5顆led燈在不停地閃爍,說明程序成功。bash

 

按鍵接收和控制代碼

(用戶態編程,此時龍芯智龍V2上的S3按鍵對應的GPIO口爲92號):工具

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(void){
	FILE *p=NULL;
	char i[100]={0,};
	p = fopen("/sys/class/gpio/export","w");
	fprintf(p,"%d",92);
	fclose(p);
	p = fopen("/sys/class/gpio/gpio92/direction","w");
	fprintf(p,"in");  //配置成輸入
	fclose(p);
	while(1){
		//以只讀方式打開
		p = fopen("/sys/class/gpio/gpio92/value","r");
		//使文件讀寫定位到0位置
		fseek(p , 0 , 0);
		#if 0
		//將文件內容輸出到存儲器i中,注意要以字符串的方式,不然會出錯
		fscanf(p,"%s",i);
		#else
		//從文件中讀出數據到存儲器i中
		fread(i , 1, 1 ,p);
		#endif
		//以字符的方式將讀到的值打印出
		printf("key = %c \r\n",i[0]);
		sleep(1);
		//注意這裏必需要關閉,而後再次讀時再從新打開,這樣只面的內容纔會更新
		fclose(p);
	}
	return 0;
}

在VMware虛擬機安裝的Kylin Ubuntu上經過交叉編譯工具進行編譯:ui

mipsel-linux-gcc button92.c -o button92_mips

將編譯好的button92_mips可執行文件考到u盤,經過u盤考到智龍主板上,遠程連接智龍並進入智龍的linux系統,輸入./button92_mips運行該可執行文件,能夠看到程序在不斷地打印按鈕的狀態,咱們按下智龍主板上的按鍵,就會看到按鈕的狀態會在一、0之間變化,說明程序成功了。spa

 

內核模塊編程:

參考:操作系統

  1. 【Linux】【Kernel】一個簡單的內核模塊例子
  2. 編寫一個簡單的內核模塊程序Hello World!
  3. Linux GPIO用戶空間操做
  4. Linux GPIO 使用示例(帶中斷、內核模塊編程、用戶態編程)
  5. 【龍印】龍芯1c的gpio輸出高低電平的linux驅動(自定義內核驅動、安裝、與用戶態編程)
  6. 勤爲本的封裝代碼系列:A、【龍芯1c庫】封裝gpio接口和使用示例;B、【龍芯1c庫】封裝硬件I2C接口和使用示例
相關文章
相關標籤/搜索