導航:首頁 > 源碼編譯 > vrep源碼編譯

vrep源碼編譯

發布時間:2023-08-01 06:54:23

『壹』 linux嵌入式驅動platform匯流排輸入子系統什麼時候鍵盤要加BIT_MASK(EV_REP)

問:怎麼寫符合輸入子系統框架的驅動程序?
答:
1. 分配一個input_dev結構體
2. 設置
3. 注冊
4. 硬體相關的代碼,比如在中斷服務程序里上報事件
問:如何分配input_dev結構體?
答:使用input_allocate_device函數
input_dev結構體的重要成員

[cpp] view plain print?
struct input_dev {
const char *name;
const char *phys;
const char *uniq;
struct input_id id;

unsigned long evbit[NBITS(EV_MAX)]; // 表示能產生哪類事件
unsigned long keybit[NBITS(KEY_MAX)]; // 表示能產生哪些按鍵
unsigned long relbit[NBITS(REL_MAX)]; // 表示能產生哪些相對位移事件, x,y,滾輪
unsigned long absbit[NBITS(ABS_MAX)]; // 表示能產生哪些絕對位移事件, x,y
unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
...
}
問:第二步的設置,應該怎麼設置,應該設置什麼?

答:舉例,在此按鍵驅動里

[cpp] view plain print?
/* 2.設置 */
/* 2.1 設置按鍵能產生哪類事件 */
set_bit(EV_KEY,buttons_dev->evbit);
set_bit(EV_REP,buttons_dev->evbit);

/* 2.2 設置能產生這類操作的哪些事件 */
set_bit(KEY_L,buttons_dev->keybit);
set_bit(KEY_S,buttons_dev->keybit);
set_bit(KEY_ENTER,buttons_dev->keybit);
set_bit(KEY_LEFTSHIFT,buttons_dev->keybit);

問:有哪些類呢?
答:在input.h里有以下類

[cpp] view plain print?
#define EV_SYN 0x00 //同步類
#define EV_KEY 0x01 //按鍵類
#define EV_REL 0x02 //相對位移類
#define EV_ABS 0x03 //絕對位移類
#define EV_MSC 0x04
#define EV_SW 0x05
#define EV_LED 0x11
#define EV_SND 0x12 //聲音類
#define EV_REP 0x14 //重復類
#define EV_FF 0x15
#define EV_PWR 0x16
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)

問:如何注冊?
答:使用input_register_device(struct input_dev *dev)函數來注冊
問:此按鍵驅動的硬體操作包括哪些操作?
答:申請定時器、申請中斷操作
驅動源碼

[cpp] view plain print?
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/mole.h>
#include <linux/device.h> //class_create
#include <mach/regs-gpio.h> //S3C2410_GPF1
//#include <asm/arch/regs-gpio.h>
#include <mach/hardware.h>
//#include <asm/hardware.h>
#include <linux/interrupt.h> //wait_event_interruptible
#include <linux/poll.h> //poll
#include <linux/fcntl.h>
#include <linux/input.h>

static struct pin_desc{
int irq;
unsigned char *name;
unsigned int pin;
unsigned int key_val;
};

static struct pin_desc pins_desc[4] = {
{IRQ_EINT1,"K1",S3C2410_GPF1,KEY_L},
{IRQ_EINT4,"K2",S3C2410_GPF4,KEY_S},
{IRQ_EINT2,"K3",S3C2410_GPF2,KEY_ENTER},
{IRQ_EINT0,"K4",S3C2410_GPF0,KEY_LEFTSHIFT},
};

static struct pin_desc *irq_pd;
static struct input_dev *buttons_dev;
static struct timer_list buttons_timer;

/* 用戶中斷處理函數 */
static irqreturn_t buttons_irq(int irq, void *dev_id)
{
irq_pd = (struct pin_desc *)dev_id;

/* 修改定時器定時時間,定時10ms,即10秒後啟動定時器
* HZ 表示100個jiffies,jiffies的單位為10ms,即HZ = 100*10ms = 1s
* 這里HZ/100即定時10ms
*/
mod_timer(&buttons_timer, jiffies + (HZ /100));
return IRQ_HANDLED;
}

/* 定時器處理函數 */
static void buttons_timer_function(unsigned long data)
{
struct pin_desc *pindesc = irq_pd;
unsigned int pinval;
pinval = s3c2410_gpio_getpin(pindesc->pin);

if(pinval)
{
/* 松開 最後一個參數: 0-松開, 1-按下 */
input_event(buttons_dev,EV_KEY,pindesc->key_val,0);
input_sync(buttons_dev);
}
else
{
/* 按下 */
input_event(buttons_dev,EV_KEY,pindesc->key_val,1);
input_sync(buttons_dev);
}
}

/* 驅動入口函數 */
static int buttons_input_init(void)
{
int i;

/* 1.分配一個input_dev結構體 */
buttons_dev = input_allocate_device();

/* 2.設置 */
/* 2.1 設置按鍵能產生哪類事件 */
set_bit(EV_KEY,buttons_dev->evbit);
set_bit(EV_REP,buttons_dev->evbit);

/* 2.2 設置能產生這類操作的哪些事件 */
set_bit(KEY_L,buttons_dev->keybit);
set_bit(KEY_S,buttons_dev->keybit);
set_bit(KEY_ENTER,buttons_dev->keybit);
set_bit(KEY_LEFTSHIFT,buttons_dev->keybit);

/* 3.注冊 */
input_register_device(buttons_dev);

/* 4.硬體相關的設置 */
/* 4.1 定時器相關的操作 */
init_timer(&buttons_timer);
buttons_timer.function = buttons_timer_function;
add_timer(&buttons_timer);

/* 4.2 申請中斷 */
for(i = 0;i < sizeof(pins_desc)/sizeof(pins_desc[0]);i++)
{
request_irq(pins_desc[i].irq, buttons_irq, IRQ_TYPE_EDGE_BOTH, pins_desc[i].name, &pins_desc[i]);
}

return 0;
}

/* 驅動出口函數 */
static void buttons_input_exit(void)
{
int i;
for(i = 0;i < sizeof(pins_desc)/sizeof(pins_desc[0]);i++)
{
free_irq(pins_desc[i].irq, &pins_desc[i]);
}
del_timer(&buttons_timer);
input_unregister_device(buttons_dev);
input_free_device(buttons_dev);
}

mole_init(buttons_input_init); //用於修飾入口函數
mole_exit(buttons_input_exit); //用於修飾出口函數

MODULE_AUTHOR("LWJ");
MODULE_DESCRIPTION("Just for Demon");
MODULE_LICENSE("GPL"); //遵循GPL協議

測試步驟方法一:

[cpp] view plain print?
[WJ2440]# ls
Qt first_test second_test
TQLedtest fourth_drv.ko sixth_drv.ko
app_test fourth_test sixth_test
bin home sixthdrvtest
buttons_all_drv.ko lib sys
buttons_all_test linuxrc third_drv.ko
buttons_input.ko mnt third_test
dev opt tmp
driver_test proc udisk
etc root usr
fifth_drv.ko sbin var
fifth_test sddisk web
first_drv.ko second_drv.ko
[WJ2440]# ls /dev/event* -l
crw-rw---- 1 root root 13, 64 Jan 2 06:04 /dev/event0
[WJ2440]# insmod buttons_input.ko
input: Unspecified device as /devices/virtual/input/input1
[WJ2440]# ls /dev/event* -l
crw-rw---- 1 root root 13, 64 Jan 2 06:04 /dev/event0
crw-rw---- 1 root root 13, 65 Jan 2 06:06 /dev/event1
[WJ2440]# cat /dev/tty1
[WJ2440]# cat /dev/tty1
ls

ls
輸入cat /dev/tty1命令後,順序按下K1,K2,K3則會顯示ls

測試步驟方法二、

[cpp] view plain print?
[WJ2440]# hexmp /dev/event1
0000000 b738 495d 8456 0007 0001 0026 0001 0000
0000010 b738 495d 846f 0007 0000 0000 0000 0000
0000020 b738 495d 2fb8 000a 0001 0026 0000 0000
0000030 b738 495d 2fc7 000a 0000 0000 0000 0000
分析:

hexmp /dev/event1 (open(/dev/event1), read(), )
秒 微秒 類 code value
0000000 0bb2 0000 0e48 000c 0001 0026 0001 0000
0000010 0bb2 0000 0e54 000c 0000 0000 0000 0000
0000020 0bb2 0000 5815 000e 0001 0026 0000 0000
0000030 0bb2 0000 581f 000e 0000 0000 0000 0000

[cpp] view plain print?
struct input_event {
struct timeval time; //時間
__u16 type; //類
__u16 code; //類下事件的值
__s32 value; //0-松開, 1-按下,2-重復
};

struct timeval {
__kernel_time_t tv_sec; //秒
__kernel_suseconds_t tv_usec; //微秒
};

『貳』 用c語言寫二叉樹,源代碼。

二叉樹是採用遞歸定義的,實現起來代碼簡潔(也許並不簡單)。並且它在具體的計算機科學中有很重要的運用,是一種很重要的數據結構,二叉樹有三種遍歷和建立的方式。今天先學習一下它的建立和列印。
以下代碼在Win-Tc1.9.1下編譯通過。

#include <stdio.h>
#define ElemType char
//節點聲明,數據域、左孩子指針、右孩子指針
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序建立二叉樹
BiTree CreateBiTree(){
char ch;
BiTree T;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;//返回根節點
}
//先序遍歷二叉樹
void PreOrderTraverse(BiTree T){
if(T){
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}

//中序遍歷
void InOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
printf("%c",T->data);
PreOrderTraverse(T->rchild);
}
}
//後序遍歷
void PostOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
void main(){
BiTree T;
T = CreateBiTree();//建立
PreOrderTraverse(T);//輸出
getch();
}

『叄』 vb 快速的取得網頁源碼和提取其中內容

如下函數可以實現你要的功能:
Function TestRegExp(ByVal myString$, ByVal myPattern$, Optional myMark$ = "gimt", Optional myRepString$)
If myString = "" Or myPattern = "" Then
TestRegExp = ""
Debug.Print "數據不能為空"
Exit Function
End If
'Create objects.
Dim objRegExp As RegExp
Dim objMatch As Match
Dim colMatches As MatchCollection
Dim RetStr As String

Set objRegExp = New RegExp
' 正則式
objRegExp.Pattern = myPattern
'IIf(InStr(myPattern, "s") <> 0, "", myPattern)

' 是否區分大小寫
objRegExp.IgnoreCase = IIf(InStr(LCase$(myMark), "i") > 0, True, False)

' 是否全局
objRegExp.Global = IIf(InStr(LCase$(myMark), "g") > 0, True, False)

' 是否換行
objRegExp.MultiLine = IIf(InStr(LCase$(myMark), "m") > 0, True, False)
If objRegExp.Test(myString) Then
If InStr(myMark, "r") > 0 Then
Debug.Print "正在替換"
RetStr = objRegExp.Replace(myString, myRepString)
Debug.Print IIf(RetStr <> "", "替換結果" & Left(RetStr, 10), "沒搜索到可替換字元")
Else
Debug.Print "正在搜索"
Set colMatches = objRegExp.Execute(myString) ' Execute search.
'MsgBox colMatches.Count
For Each objMatch In colMatches ' Iterate Matches collection.
'RetStr = RetStr & objMatch.FirstIndex
RetStr = RetStr & objMatch.Value & vbCrLf
Next
Debug.Print IIf(RetStr <> "", "搜索結果" & Left(RetStr, 10), "沒搜索到匹配結果")
End If
Else
RetStr = ""
Debug.Print "沒找到任何匹配結果,請檢查正則式的是否正確"
End If
TestRegExp = RetStr
End Function

閱讀全文

與vrep源碼編譯相關的資料

熱點內容
PDF分析 瀏覽:482
h3c光纖全工半全工設置命令 瀏覽:137
公司法pdf下載 瀏覽:379
linuxmarkdown 瀏覽:347
華為手機怎麼多選文件夾 瀏覽:679
如何取消命令方塊指令 瀏覽:345
風翼app為什麼進不去了 瀏覽:774
im4java壓縮圖片 瀏覽:358
數據查詢網站源碼 瀏覽:146
伊克塞爾文檔怎麼進行加密 瀏覽:886
app轉賬是什麼 瀏覽:159
php的基本語法 瀏覽:792
對外漢語pdf 瀏覽:516
如何用mamp本地web伺服器 瀏覽:869
如何加密自己js代碼 瀏覽:627
排列組合a與c的演算法 瀏覽:534
如何在文件夾中找到同名內容 瀏覽:786
有什麼app文字轉韓文配音 瀏覽:372
循環宏1命令 瀏覽:35
斐波那契數列矩陣演算法 瀏覽:674