second_drv.c驅動源碼:
#include "linux/device.h"
#include "linux/module.h"
#include "linux/kernel.h"
#include "linux/fs.h"
#include "linux/init.h"
#include "linux/delay.h"
#include "asm/uaccess.h"
#include "asm/irq.h"
#include "asm/io.h"
static struct class *seconddrv_class;
volatile unsigned long *gph2con;
volatile unsigned long *gph2dat;
volatile unsigned long *gph3con;
volatile unsigned long *gph3dat;
static int second_drv_open(struct inode *inode, struct file *file)
{
// 配置GPH2_3為輸入引腳
*gph2con &= ~(0xf<<(3*4));
// 配置GPH3_0,GPH3_1,GPH3_2,GPH3_3為輸入引腳
*gph3con &= ~((0xf<<(0*4)) | (0xf<<(1*4)) | (0xf<<(2*4)) | (0xf<<(3*4)));
return 0;
}
ssize_t second_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
{
// 返回5個引腳的電平
unsigned char key_vals[5];
int regval;
if (size != sizeof(key_vals))
return -EINVAL;
// 讀GPH2_3
regval = *gph2dat;
key_vals[0] = (regval & (1<<3)) ? 1 : 0;
// 讀GPH3_0,GPH3_1,GPH3_2,GPH3_3
regval = *gph3dat;
key_vals[1] = (regval & (1<<0)) ? 1 : 0;
key_vals[2] = (regval & (1<<1)) ? 1 : 0;
key_vals[3] = (regval & (1<<2)) ? 1 : 0;
key_vals[4] = (regval & (1<<3)) ? 1 : 0;
copy_to_user(buf, key_vals, sizeof(key_vals));
return sizeof(key_vals);
}
static struct file_operations sencod_drv_fops = {
.owner = THIS_MODULE, // 這是一個宏,推向編譯模塊時自動創建的__this_module變量
.open = second_drv_open,
.read = second_drv_read,
};
int major;
static int second_drv_init(void)
{
major = register_chrdev(0, "second_drv", &sencod_drv_fops);
seconddrv_class = class_create(THIS_MODULE, "second_drv");
device_create(seconddrv_class, NULL, MKDEV(major, 0), NULL, "buttons"); // /dev/buttons
gph2con = (volatile unsigned long *)ioremap(0xe0200c40, 16);
gph2dat = gph2con + 1;
gph3con = (volatile unsigned long *)ioremap(0xE0200C60, 16);
gph3dat = gph3con + 1;
return 0;
}
static void second_drv_exit(void)
{
unregister_chrdev(major, "second_drv");
device_destroy(seconddrv_class, MKDEV(major, 0));
class_destroy(seconddrv_class);
iounmap(gph2con);
iounmap(gph3con);
return 0;
}
module_init(second_drv_init);
module_exit(second_drv_exit);
MODULE_LICENSE("GPL");
====================================================================
seconddrvtest.c測試程序:
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdio.h"
// seconddrvtest
int main(int argc, char **argv)
{
int fd;
unsigned char key_vals[5];
int cnt = 0;
fd = open("/dev/buttons", O_RDWR);
if (fd < 0)
{
printf("can't open!\n");
}
while (1)
{
read(fd, key_vals, sizeof(key_vals));
if (!key_vals[0] || !key_vals[1] || !key_vals[2] || !key_vals[3] || !key_vals[4])
{
printf("d key pressed: %d %d %d %d %d\n", cnt++, key_vals[0],
key_vals[1], key_vals[2],
key_vals[3], key_vals[4]);
}
}
return 0;
}
上一篇:Tiny210驅動之按鍵中斷實驗
下一篇:Tiny210驅動之LED測試
推薦閱讀
史海拾趣
隨著環保意識的日益增強,AEC積極響應國家綠色發展的號召,將環保理念融入企業的日常運營中。公司投入大量資金進行環保技術的研發和應用,推動生產過程的綠色化、低碳化。同時,AEC還積極參與社會公益活動,為保護環境、促進可持續發展貢獻了自己的力量。
千志電子于1986年由董事長陳初志先生在臺灣創立,起初專注于生產各類型插件式電阻。隨著業務的不斷發展,公司意識到拓展更廣闊市場的重要性。1996年,千志電子進軍中國市場,在深圳設立了千志電子(深圳)有限公司,這一舉措標志著公司開始走向國際化。深圳作為中國改革開放的前沿陣地,為千志電子提供了豐富的資源和廣闊的市場空間,為其后續的發展奠定了堅實基礎。
千志電子于1986年由董事長陳初志先生在臺灣創立,起初專注于生產各類型插件式電阻。隨著業務的不斷發展,公司意識到拓展更廣闊市場的重要性。1996年,千志電子進軍中國市場,在深圳設立了千志電子(深圳)有限公司,這一舉措標志著公司開始走向國際化。深圳作為中國改革開放的前沿陣地,為千志電子提供了豐富的資源和廣闊的市場空間,為其后續的發展奠定了堅實基礎。
為了進一步拓展業務版圖,千志電子開始進軍國際市場。2006年,千志電子在香港設立了千志電子(香港)有限公司,將其作為國際服務據點重心之一。這一舉措使千志電子能夠更好地了解國際市場需求和趨勢,加強與國外客戶的聯系和合作。同時,千志電子還積極參加國際展覽和論壇,展示其優質產品和先進技術,提高了品牌知名度和國際影響力。
隨著公司的發展壯大,博流積極尋求與全球知名企業的合作機會。其中,與谷歌的合作尤為引人注目。作為Google Matter EAP合作伙伴,博流與谷歌共同推動Matter協議在智能家居生態系統中的應用,為用戶提供更加便捷、智能的家居體驗。此外,博流還與多家產業鏈上下游企業建立了緊密的合作關系,共同推動物聯網產業的發展。
博流智能科技始創于2016年,由一群來自硅谷頂級芯片公司的創始團隊組成。他們憑借在移動通訊及物聯網技術領域的深厚積累,以及對未來科技趨勢的敏銳洞察,決定投身于新一代物聯網集成電路芯片的研發。初創時期,公司面臨著資金、技術和市場等多重挑戰,但團隊憑借堅定的信念和不懈的努力,逐步克服了困難,為公司的長遠發展奠定了堅實基礎。
隨著超深亞微米工藝的發展, IC設計能力與工藝能力極大提高,采用SoC(System on Chip)將微處理器、IP核、存儲器及各種接口集成在單一芯片上,已成為目前IC設計及嵌入式系統發展的趨勢和主流。為減少設計風險、縮短設計周期、更集中于應用實現,設 ...… 查看全部問答∨ |
|
WINCE5.0能訪問ASP的網站么??如果可以..服務器端應該用SQL SERVER還是SQL CE 5.0?我只是需要CE能訪問PC服務器上面的ASP.提交一些例如修改密碼,之類的請求… 查看全部問答∨ |
|
我用的是arm-linux-gcc-3.3.2 系統fedora 錯誤如下 t not recognized: failed to merge target specific data of file /usr/local/arm/3.3.2/lib/gcc-lib/arm-linux/3.3.2/libgcc.a(_udivdi3.oS) /usr/local/arm/3.3.2/bin/arm-linux ...… 查看全部問答∨ |
做一個手機上的camera全屏預覽的應用程序,要求在全屏預覽的窗口上有幾個圖標來控制拍照和錄像。不知咋整,哪位高手支下招,謝謝! ps:在video render前加一個混合兩者的filter是可以的,比較麻煩。… 查看全部問答∨ |
數字鐘的設計(加急!!!!!)請大牛伸出援手(初學的確需要幫助) 要求用基本邏輯門及74系列中規模芯片實現能顯示時分秒和有校正功能的數字鐘! 1 請給出完整的幾個大模塊及其實現的功能,及所選主要器材(我沒有完整的設計思路,還請大家幫忙) 2 請寫出更為具體的設計方法(至少給點點播也好),初學者真的很不容易. 3 ...… 查看全部問答∨ |
|
哈哈~~~為版主申冤~~~ stm32f的CRC32主流化crc32_mpeg2 多項式: 左移CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1 簡寫:CRCL32_04C11DB7_FFFFFFFF_00000000 最新版V4.08: http://www.hotpower.org/HotAjax/HotPow ...… 查看全部問答∨ |