娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

基于S3C2440的linux-3.6.6移植——LED驅(qū)動

發(fā)布者:溫暖夢想最新更新時間:2024-08-09 來源: cnblogs關(guān)鍵字:S3C2440  6  移植  LED驅(qū)動 手機看文章 掃描二維碼
隨時隨地手機看文章

目前的linux版本的許多驅(qū)動都是基于設(shè)備模型,LED也不例外。

 

簡單地說,設(shè)備模型就是系統(tǒng)認(rèn)為所有的設(shè)備都是掛接在總線上的,而要使設(shè)備工作,就需要相應(yīng)的驅(qū)動。設(shè)備模型會產(chǎn)生一個虛擬的文件系統(tǒng)——sysfs,它給用戶提供了一個從用戶空間去訪問內(nèi)核設(shè)備的方法,它在linux里的路徑是/sys。如果要寫程序訪問sysfs,可以像讀寫普通文件一樣來操作/sys目錄下的文件。

 

對于基于s3c2440的開發(fā)板來說,linux-3.6.6自動的LED驅(qū)動只需改變連接LED的IO端口,及高、低電平響應(yīng)即可。我的開發(fā)板的四個LED連接在了B口的5到8引腳上,當(dāng)輸出低電平時被點亮,與linux自帶的LED驅(qū)動一致,因此無需做任何改動。

 

使用menuconfig來配置內(nèi)核,這里要加上對LED模塊的內(nèi)容,即:

Device Drivers--->

       [*]LED Support--->

              <*>LED Class Support

              <*>LED Support for Samsung S3C24xx GPIO LEDs

編譯內(nèi)核,并把編譯好的內(nèi)核下載到開發(fā)板上,運行:

[root@zhaocj /]#ls

bin      etc     lib      proc     sys      usr

dev      home    linuxrc  sbin     temp

[root@zhaocj /]#cd sys

[root@zhaocj /sys]#ls

block     class    devices   fs        module

bus       dev      firmware  kernel    power

進(jìn)入sys目錄下,我們看到該目錄下有一些子目錄。

[root@zhaocj /sys]#cd class

[root@zhaocj class]#ls

backlight     hidraw       leds          rtc          vc

bdi          hwmon         mem           sound        video_output

block         i2c-adapter   misc         spi_master    vtconsole

firmware      i2c-dev       mmc_host     spidev        watchdog

gpio         input         mtd          tty

graphics      lcd          net           udc

進(jìn)入class目錄,我們會看到在該目錄下有一些設(shè)備,其中l(wèi)eds就是本次我們要操作的LED。

[root@zhaocj class]#cd leds

[root@zhaocj leds]#ls

backlight  led1      led2       led3       led4

在leds目錄下,會看到四個LED的目錄,這就是開發(fā)板上的四個LED。另外backlight目錄是關(guān)于LCD的背光,與LED無關(guān)。

[root@zhaocj leds]#cd led1

[root@zhaocj led1]#ls

brightness     max_brightness  subsystem

device         power           uevent

brightness文件就是LED設(shè)備,對其進(jìn)行操作就可完成對LED的控制。

[root@zhaocj led1]#cat brightness

0

可以看出led1當(dāng)前的狀態(tài)是關(guān)閉。(0表示關(guān)閉,1表示打開)

[root@zhaocj led1]#cat >brightness<> 1

> eof

#[root@zhaocj led1]#

向brightness寫1,表示打開LED。這時led1會被點亮。

 

當(dāng)然,我們也可以編寫用戶程序來控制開發(fā)板上的四個LED

/**********************

****leds.c**************

**********************/

#include

#include

#include

#include

#include

#include

#include

 

int main(int argc, char *argv[])

{

  int fd, no;

/*判斷是要控制哪個LED,并打開相應(yīng)的文件*/

 no=(int)argv[1][3]-48;

 switch(no)

   {

    case 1:

     fd = open('/sys/class/leds/led1/brightness', O_RDWR);

  break;

    case 2:

      fd = open('/sys/class/leds/led2/brightness', O_RDWR);

  break;

 case 3:

   fd = open('/sys/class/leds/led3/brightness', O_RDWR);

  break;

 case 4:

   fd = open('/sys/class/leds/led4/brightness', O_RDWR);

  break;

 default:

     return -1;

}

 if(fd<0)

    {

      printf('can not open file.n');

      return -1;

    }

 

/*完成打開或關(guān)閉LED操作*/

 if(!strcmp(argv[2],'on'))   

      write(fd, '1', 1);

 else if(!strcmp(argv[2],'off'))

     write(fd, '0', 1);

 

  close(fd);

  return 0;

}

 

 

上面的程序只做簡單測試之用。編譯該文件:

arm-linux-gcc  -o  leds  leds.c

把leds文件下載到temp目錄下,運行:

[root@zhaocj /temp]# ./leds  led2  on

則點亮led2。

[root@zhaocj /temp]# ./leds  led2  off

則關(guān)閉led2。

 

下面我就來簡單分析一下linux自帶的LED子系統(tǒng)。

在mach-zhaocj2440.c文件,創(chuàng)建了LED設(shè)備,如下:

/* LEDS */

 

static struct s3c24xx_led_platdata zhaocj2440_led1_pdata = {

       .name             = 'led1',

       .gpio              = S3C2410_GPB(5),

       .flags             = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

       .def_trigger    = 'heartbeat',

};

 

static struct s3c24xx_led_platdata zhaocj2440_led2_pdata = {

       .name             = 'led2',

       .gpio              = S3C2410_GPB(6),

       .flags             = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

       .def_trigger    = 'nand-disk',

};

 

static struct s3c24xx_led_platdata zhaocj2440_led3_pdata = {

       .name             = 'led3',

       .gpio              = S3C2410_GPB(7),

       .flags             = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

       .def_trigger    = 'mmc0',

};

 

static struct s3c24xx_led_platdata zhaocj2440_led4_pdata = {

       .name             = 'led4',

       .gpio              = S3C2410_GPB(8),

       .flags             = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

       .def_trigger    = '',

};

定義了四個LED數(shù)據(jù),名字分別為led1~led4,這就是我們在leds目錄下看到這四個子目錄。它們所連接的引腳分別為B口的5~8,這是由S3C2410_GPB()宏定義完成的。標(biāo)識S3C24XX_LEDF_ACTLOW表示的是低電平有效,S3C24XX_LEDF_TRISTATE表示的三態(tài)無效。另外def_trigger表示的是觸發(fā)控制,如我們對nand進(jìn)行讀寫操作時,led2會不停的閃,在這里我們沒有用到這個功能,暫時不用理會。

 

static struct platform_device zhaocj2440_led1= {

       .name             = 's3c24xx_led',

       .id          = 1,

       .dev        = {

              .platform_data       = &zhaocj2440_led1_pdata,

       },

};

 

static struct platform_device zhaocj2440_led2= {

       .name             = 's3c24xx_led',

       .id          = 2,

       .dev        = {

              .platform_data       = &zhaocj2440_led2_pdata,

       },

};

 

static struct platform_device zhaocj2440_led3= {

       .name             = 's3c24xx_led',

       .id          = 3,

       .dev        = {

              .platform_data       = &zhaocj2440_led3_pdata,

       },

};

 

static struct platform_device zhaocj2440_led4= {

       .name             = 's3c24xx_led',

       .id          = 4,

       .dev        = {

              .platform_data       = &zhaocj2440_led4_pdata,

       },

};

上面則創(chuàng)建了總線平臺設(shè)備,四個LED的設(shè)備名稱都是s3c24xx_led,子設(shè)備id分別從1到4,設(shè)備數(shù)據(jù)則是上面定義的四個LED數(shù)據(jù)。然后把這四個LED設(shè)備再添加到開發(fā)板的設(shè)備數(shù)組中,即:

static struct platform_device *zhaocj2440_devices[]__initdata = {

……

       &zhaocj2440_led1,

       &zhaocj2440_led2,

       &zhaocj2440_led3,

       &zhaocj2440_led4,

……

};

最后,在開發(fā)板系統(tǒng)初始化過程中,再把設(shè)備數(shù)組中的設(shè)備逐一注冊到系統(tǒng)總線上,即:

static void __init zhaocj2440_init(void)

{

……

platform_add_devices(zhaocj2440_devices,ARRAY_SIZE(zhaocj2440_devices));

……

}

這樣就完成了LED設(shè)備的創(chuàng)建。

 

光有設(shè)備還不能工作,任何一個設(shè)備的運行還需要與之相對應(yīng)的驅(qū)動。對于基于s3c24xx的LED來說,它的驅(qū)動是在drivers/leds目錄下Leds-s3c24xx.c文件內(nèi)創(chuàng)建的,即:

static struct platform_driver s3c24xx_led_driver = {

       .probe            = s3c24xx_led_probe,

       .remove          = s3c24xx_led_remove,

       .driver            = {

[1] [2]
關(guān)鍵字:S3C2440  6  移植  LED驅(qū)動 引用地址:基于S3C2440的linux-3.6.6移植——LED驅(qū)動

上一篇:LCD驅(qū)動移植在在mini2440(linux2.6.29)和FS4412(linux3.14.78)上實現(xiàn)對比(deep dive)
下一篇:Ubuntu 12.04嵌入式交叉編譯環(huán)境arm-linux-gcc搭建過程圖解

推薦閱讀最新更新時間:2025-04-05 14:36

基于s3c2440的madplay移植
在mini2440移植聲卡后,趕緊找了移植madplay的資料,看上去挺簡單的,于是接著移植madplay。 一、 環(huán)境和軟件介紹 1、主機環(huán)境:虛擬機下Fedora9 2、交叉編譯器:arm-linux-gcc-4.3.2 3、軟件包:zlib-1.2.3、libid3tag-0.15.1b.tar.gz、libmad-0.15.1b.tar.gz、madplay-0.15.2b.tar.gz 4、 把以上軟件包解壓到/opt/studyarm/madplay-make目錄下,分別改名為zlib、libid3tag、libmad、madplay。并在madplay-make目錄下新建include和lib目錄用于存放編譯后
[單片機]
將FATFS移植STM32RBT6遇到的掛載不成功和返回值問題
移植fatfs遇到了諸多問題,很是苦惱啊,移植成功思來之不易,特分享一下經(jīng)驗。硬件是STM32F103RBT6內(nèi)存只有20kB,Flash只有128KB,考慮到內(nèi)存有限,就不能支持長文件名了,在原子論壇上下載的所以要改動,在此感謝原子論壇給我?guī)淼膸椭€有安富萊論壇 http://bbs.armfly.com/read.php?tid=3601 給我?guī)淼膯⑹尽A硗庥布€有一個大的相機的SD卡,網(wǎng)上買的模塊當(dāng)然也可以自己焊接一個,采用SPI接口,SPI1和SPI2都行,看圖 移植前做了大量準(zhǔn)備,在網(wǎng)上尤其是原子論壇翻看各種其他人移植的心得,去fatfs的官方網(wǎng)站下載0.10版本的程序,看各種相關(guān)的移植心得,文檔版本眾多,眼花繚
[單片機]
將FATFS<font color='red'>移植</font>STM32RBT<font color='red'>6</font>遇到的掛載不成功和返回值問題
s3c2440裸機-Norflash2-適配訪問時序
前面我們了解了norFlash的特性和原理,那么cpu是如何和nor進(jìn)行通信的呢?下面開始詳細(xì)介紹。 1.內(nèi)存控制器適配norflash 如圖是S3C2440的內(nèi)存控制器的可編程訪問周期讀寫時序,里面的時間參數(shù)要根據(jù)外部norflash的性能進(jìn)行配置,這里先列出時間參數(shù)的含義: Tacs: Address set-up time before nGCSn(表示地址信號A發(fā)出多久后才能發(fā)出nGCS片選) Tcos: Chip selection set-up time before nOE(表示片選信號nGCS發(fā)出多久后才能發(fā)出讀使能信號) Tacc:access cycle(數(shù)據(jù)訪問周期) Tacp:page模式下的訪問
[單片機]
s3c2440裸機-I2c編程-2-i2c控制器
1.I2c主控與從設(shè)備關(guān)系 對于寫操作,主控作為transmitter,從設(shè)備作為receiver 對于讀操作,主控作為receiver, 從設(shè)備作為transmitter 2.I2c控制器 2.1總框圖 Pclk = 50Mhz, 經(jīng)過prescaler分頻,可以得到SCL。 IICSTAT:發(fā)出S(start)信號或者P(stop)信號。 Data Bus可以把數(shù)據(jù)寫入IICDS寄存器,然后會自動產(chǎn)生SCL,并且會將8位數(shù)據(jù)從SDA同步給slave dev, 在數(shù)據(jù)發(fā)送出去后,在第9個SCL時鐘,會受到slave dev的ack應(yīng)答,可以通過查詢IICSTAT來判斷是否有ACK回應(yīng)。 當(dāng)slave dev回應(yīng)ACK
[單片機]
s3c2440 移值u-boot-2016.03 第5篇 支持dm9000 識別
1, 通過查看 /drivers/net/Makefile 發(fā)現(xiàn)想要編譯上,需要添加宏 /include/configs/smdk2440.h 中添加 #define CONFIG_DRIVER_DM9000 #define CONFIG_DM9000_BASE 0x20000000 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE+4) #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 192.168.1.123 #define CONFIG_SERVE
[單片機]
<font color='red'>s3c2440</font> 移值u-boot-2016.03 第5篇 支持dm9000 識別
s3c2440裸機-I2c編程-2.i2c控制器
1.I2c主控與從設(shè)備關(guān)系 對于寫操作,主控作為transmitter,從設(shè)備作為receiver 對于讀操作,主控作為receiver, 從設(shè)備作為transmitter 2.I2c控制器 2.1總框圖 Pclk = 50Mhz, 經(jīng)過prescaler分頻,可以得到SCL。 IICSTAT:發(fā)出S(start)信號或者P(stop)信號。 Data Bus可以把數(shù)據(jù)寫入IICDS寄存器,然后會自動產(chǎn)生SCL,并且會將8位數(shù)據(jù)從SDA同步給slave dev, 在數(shù)據(jù)發(fā)送出去后,在第9個SCL時鐘,會受到slave dev的ack應(yīng)答,可以通過查詢IICSTAT來判斷是否有ACK回應(yīng)。 當(dāng)slave dev回應(yīng)ACK后,
[單片機]
<font color='red'>s3c2440</font>裸機-I2c編程-2.i2c控制器
S3C2440的中斷寄存器的分類及中斷的過程分析
S3C2440一共有60個中斷源,其中有15個子中斷源,它們與SUBSRCPND寄存器中的每一位相對應(yīng),其他45個中斷源與SRCPND中的每一位相對應(yīng)。要注意的是EINT4~7對應(yīng)的是同一位SRCPND,而EINT8~23對應(yīng)的也是SRCPND一位。 1 S3C2440的中斷寄存器 中斷分兩大類:外部中斷和內(nèi)部中斷。 1.1 外部中斷寄存器 24個外部中斷占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用這些腳做中斷輸入,則必須配置引腳為中斷,并且不要上拉。具體可參考datesheet數(shù)據(jù)手冊。 寄存器: EXTINT0-EXTINT2:分別設(shè)置EINT0—EINT7、E
[單片機]
<font color='red'>S3C2440</font>的中斷寄存器的分類及中斷的過程分析
S3C2440裸機實驗(4) -----IIC
花了兩天的時間終于把這個搞定了,其實I2C的原理還是比較簡單的,只是幾個細(xì)節(jié)性的東西還是需要特別的注意,主要是需要注意一下幾點: 1.rIICCON &= ~0x10; 清中斷必須要在rIICDS = slvAddr; 和rIICSTAT = 0xf0; // 主設(shè)備,啟動 之后 2.延時對于寫外部的低速設(shè)備來說非常重要,比如while(flag)之后一定要加延時,還有在寫數(shù)據(jù)時發(fā)現(xiàn)只能寫入基數(shù)地址的數(shù)據(jù),這也是由于延時導(dǎo)致的 3.開始調(diào)試的時候系統(tǒng)總是死在read的函數(shù)中,后來發(fā)現(xiàn)在數(shù)據(jù)手冊的note中說當(dāng)讀取最后一個數(shù)據(jù)的時候一定不能返回ACK信號,而我卻在程序中使用while(flag)來等待ACK引發(fā)中斷,這不
[單片機]
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 湘乡市| 高雄县| 赞皇县| 高阳县| 杂多县| 景德镇市| 自贡市| 广水市| 乌兰察布市| 武乡县| 襄汾县| 方正县| 遂昌县| 新昌县| 博罗县| 澎湖县| 霍林郭勒市| 岳阳县| 北川| 江津市| 林口县| 和平区| 成武县| 右玉县| 通许县| 新和县| 株洲县| 贡嘎县| 津南区| 千阳县| 崇礼县| 高雄县| 皋兰县| 和静县| 辽阳县| 长海县| 常熟市| 濮阳县| 平顺县| 合阳县| 临湘市|