日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

友善之臂 mini2440 linux led 驱动代码,mini2440 led驱动程序

發(fā)布時間:2025/3/20 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 友善之臂 mini2440 linux led 驱动代码,mini2440 led驱动程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這個led驅(qū)動程序只在linux-2.6.32.2內(nèi)核中測試通過,至于其他的內(nèi)核可能頭文件有一些改動就不能?編譯成功了。下面給出源程序:

這是友善之臂提供的源碼:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define DEVICE_NAME "leds"

//設(shè)備名(/dev/leds)

//LED 對應(yīng)的GPIO 端口列表

static unsigned long led_table[] =

{

S3C2410_GPB(5),

S3C2410_GPB(6),

S3C2410_GPB(7),

S3C2410_GPB(8),

};

//LED 對應(yīng)端口將要輸出的狀態(tài)列表

static unsigned int led_cfg_table[] =

{

S3C2410_GPIO_OUTPUT,

S3C2410_GPIO_OUTPUT,

S3C2410_GPIO_OUTPUT,

S3C2410_GPIO_OUTPUT,

};//如果內(nèi)核相差不大,比如是2.6.30的內(nèi)核,很可能照著這個程序?qū)懙臅r候這個地方會報錯,原因是頭文件不同

/*ioctl 函數(shù)的實現(xiàn)

* 在應(yīng)用/用戶層將通過ioctl 函數(shù)向內(nèi)核傳遞參數(shù),以控制LED

的輸出狀態(tài)

*/

static int sbc2440_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;

}

//根據(jù)應(yīng)用/用戶層傳遞來的參數(shù)(取反),通過s3c2410_gpio_setpin

函數(shù)設(shè)置LED 對應(yīng)的端口寄存

//器,

s3c2410_gpio_setpin(led_table[arg],

!cmd);

return 0;

default:

return -EINVAL;

}

}

/*

* 設(shè)備函數(shù)操作集,在此只有ioctl 函數(shù),通常還有read, write,

open, close 等,因為本LED 驅(qū)動在下面已經(jīng)

* 注冊為misc 設(shè)備,因此也可以不用open/close

*/

static struct file_operations dev_fops =

{

.owner = THIS_MODULE,

.ioctl = sbc2440_leds_ioctl,

};

/*

* 把LED 驅(qū)動注冊為MISC 設(shè)備

*/

static struct miscdevice misc =

{

.minor = MISC_DYNAMIC_MINOR,

//動態(tài)設(shè)備號

.name = DEVICE_NAME,

.fops = &dev_fops,

};

/*

* 設(shè)備初始化

*/

static int __init dev_init(void)

{

int ret;

int i;

for (i = 0; i < 4; i++) {

//設(shè)置LED 對應(yīng)的端口寄存器為輸出(OUTPUT)

s3c2410_gpio_cfgpin(led_table[i],

led_cfg_table[i]);

//設(shè)置LED 對應(yīng)的端口寄存器為低電平輸出,在模塊加載結(jié)束后,四個LED

應(yīng)該是全部都是發(fā)光

//狀態(tài)

s3c2410_gpio_setpin(led_table[i],

0);

}

ret = misc_register(&misc);

//注冊設(shè)備

printk (DEVICE_NAME"\tinitialized\n");

//打印初始化信息

return ret;

}

static void __exit

dev_exit(void)

{

misc_deregister(&misc);

}

module_init(dev_init);

//模塊初始化,僅當(dāng)使用insmod/podprobe 命令加載時有用,如果設(shè)備不是通過模塊方式加載,此處將不會被調(diào)用

module_exit(dev_exit);//卸載模塊,當(dāng)該設(shè)備通過模塊方式加載后,可以通過rmmod

命令卸載,將調(diào)用此函數(shù)

MODULE_LICENSE("GPL"); //版權(quán)信息

MODULE_AUTHOR("FriendlyARM Inc.");

//開發(fā)者信息

下面是makefile文件

CROSS=arm-linux-

KERNELDIR =

/root/doc/mini/linux-2.6.32.2//內(nèi)核源碼位置

#定義內(nèi)核源碼的路徑

PWD := $(shell

pwd)

#獲取當(dāng)前路徑

.PHONY: modules

clean

#指明modules、clean為偽目標(biāo)

obj-m +=

mini2440_leds.o

#表示要構(gòu)造的模塊名為s3c24xx_leds.ko

modules:

$(MAKE) -C $(KERNELDIR)

M=$(PWD) modules

#-C:進入$(KERNELDIR)后再執(zhí)行make,讀取那里的Makefile。

#M=$(PWM):然后返回當(dāng)前的位置(驅(qū)動源代碼的位置)繼續(xù)執(zhí)行當(dāng)前的Makefile。

clean:

rm -rf *.o *~ core .depend

.*.cmd ?*.mod.c .tmp_versions

#end

進入目錄后,執(zhí)行make,然后將ko文件通過網(wǎng)絡(luò)或者U

盤傳到板子上,lsmod一下,裝載模塊。

下面的是測試文件leds-test.c:

#include

#include

#include

#include

int main(int argc, char **argv)

{

int on;

int led_no;

int fd;

if (argc != 3 || sscanf(argv[1], "%d",

&led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||

on < 0 || on > 1 || led_no < 0 ||

led_no > 3) {

fprintf(stderr, "Usage: leds led_no

0|1\n");

exit(1);

}

fd = open("/dev/leds0", 0);

if (fd < 0) {

fd = open("/dev/leds", 0);

}

if (fd < 0) {

perror("open device leds");

exit(1);

}

ioctl(fd, on, led_no);

close(fd);

return 0;

}

將生成的.ko模塊文件裝載之后,運行測試文件就可以控制led的變化。

在命令行下執(zhí)行:

#arm-linux-gcc –o leds-test

leds-test.c

將生成可執(zhí)行目標(biāo)文件leds-test,通過網(wǎng)絡(luò)ftp

或者優(yōu)盤把它復(fù)制到開發(fā)板中,比如放在/home/plg 目錄下(注意:開發(fā)板缺省的文件系統(tǒng)已經(jīng)有了led

測試程序,所以我們在此改名為leds-test),在開發(fā)板的命令行終端執(zhí)行:

#/etc/rc.d/init.d/leds stop

該命令將停止led-player 對led

的控制,關(guān)于led-player,可以在用戶手冊中查看詳細的說明。使用leds-test 控制led 方法為:

#leds-test 3 0 ;關(guān)閉LED3

#leds-test 3 1 ;打開LED3

其中第一個參數(shù)為要控制的LED

序號,第二個參數(shù)代表關(guān)閉(0)或者打開(1)對應(yīng)的LED。如圖

總結(jié)

以上是生活随笔為你收集整理的友善之臂 mini2440 linux led 驱动代码,mini2440 led驱动程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。