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

喜羊羊系列【設備 - 驅動器 編譯進內核】

發布者:Mingyue1314最新更新時間:2025-01-07 來源: cnblogs關鍵字:設備  驅動器  編譯  內核 手機看文章 掃描二維碼
隨時隨地手機看文章

*針對不同的平臺。可能放進的不是以下的文件內,僅僅做參考


1、頭文件

放進:linux-3.0.8archarmplat-samsungincludeplat

led.h


#ifndef _HEAD_H

#define _HEAD_H


#define MAGIC 'h'


#define LED_ON _IOW(MAGIC,1,int)

#define LED_OFF _IOW(MAGIC,0,int)


struct led_device{

  dev_t devno;

unsigned int led_major;

struct cdev *led_cdev;

struct class *led_class;

struct device *led_device;

};

#endif



====================================================================================================================================


2、設備文件

方法一:將設備資源直接加進/linux-3.0.8/arch/arm/mach-s5pv210下的mach-smdkv210.c


①                                              

struct platform_device s5pv210_led_device_lhy = {

.name = 's5pv210_led_lhy',

.id = 1,

};


static struct platform_device *smdkv210_devices[] __initdata = {

。。

。。。



。。。


。。。



。。


。。


。。。


。。。


。。。。

}


②將設備信息加入總線

改動arch/arm/mach-s5pv210/mach-smdkv210.c文件

static struct platform_device *smdkv210_devices[] __initdata = {

...

...

/*加入例如以下代碼*/

&s5pv210_led_device_lhy,    //新加入的

}

 方法二:

①將設備文件dev-led.c 放進 linux-3.0.8/arch/arm/plat-samsung


led_dev.c 


#include

#include

#include

#include


struct platform_device s5pv210_led_device_lhy = {

.name = 's5pv210_led_lhy',

.id = 1,

};

 ②向arch/arm/mach-s5pv210/mach-smdkv210.c(跟平臺架構相關文件)加入

static struct platform_device *smdkv210_devices[] __initdata = {

....

&s5pv210_led_device_lhy,     //新加入

};

 ③向linux-3.0.8/arch/arm/plat-samsung/Makefile加入

obj-$(CONFIG_S3C_DEV_LED)       += led_dev.o

 ④向linux-3.0.8/arch/arm/plat-samsung/Kconfig加入

config S3C_DEV_LED

        bool 'S5PV210 LED  driver support'

        help

             s5pv210 led device support

⑤加入外部聲明arch/arm/plat-samsung/include/plat/devs.h

extern struct platform_device s5pv210_led_device_lhy;


====================================================================================================================================

3、平臺驅動

①將led_drv.c 放進linux-3.0.8/drivers/my_led


led_drv.c 




#include //register_chrled

#include //class_create/ledice_create

#include //kmalloc

#include //copy_to_user/copy_from_user

#include //ioremap

#includegpio.h> //gpio_request

#include //s3c_gpio_cfgpin

#include      //cdev_alloc

#include


//下面是移植時須要添加的

#include

#include

#include

#include

#include

#include


static struct led_device *led_drv;


static int led_open(struct inode *inode, struct file *file)

{

printk(KERN_INFO'%s()-%dn', __func__, __LINE__);

s3c_gpio_cfgpin(S5PV210_GPC0(3),S3C_GPIO_OUTPUT);

s3c_gpio_cfgpin(S5PV210_GPC0(4),S3C_GPIO_OUTPUT);


return 0;

}


static ssize_t led_read(struct file *file, char __user *buf, size_t count, loff_t *offset)

{

printk(KERN_INFO'%s()-%dn', __func__, __LINE__);

return count;

}


ssize_t led_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)

{

printk(KERN_INFO'%s()-%dn', __func__, __LINE__);

return 0;

}


static long led_ioctl(struct file *file, unsigned int cmd, unsigned long val)

{

printk(KERN_INFO'%s()-%dn', __func__, __LINE__);

printk(KERN_INFO'cmd=%d arg=%ldn', cmd, val);


switch(cmd)

{

case LED_ON:

gpio_set_value(S5PV210_GPC0(val),1);

break;

case LED_OFF:

gpio_set_value(S5PV210_GPC0(val),0);

break;

default:

break;

}

return 0;

}



//硬件操作方法

static struct file_operations led_fops={

.owner = THIS_MODULE,

.open   = led_open,

.write  = led_write,

.read   = led_read,

.unlocked_ioctl = led_ioctl,

};




static int s5pv210_led_probe(struct platform_device *pdrv){

int ret;

led_drv = kmalloc(sizeof(struct led_device),GFP_KERNEL);

if(led_drv==NULL){

printk(KERN_ERR'no memory malloc for fs210_ledn');

return -ENOMEM;

}


/*1. 動態注冊/申請主設備*/

ret=alloc_chrdev_region(&led_drv->devno,0,1,'dev_module');

if (ret < 0) {

printk(KERN_ERR 'unable to get majorn');

return -EFAULT;

goto out_err_1;

}

//從設備號中分離出主設備號

led_drv->led_major = MAJOR(led_drv->devno);

/*為cdev分配空間*/

led_drv->led_cdev  = cdev_alloc();

/*注冊硬件操作方法/初始化cdev*/

cdev_init(led_drv->led_cdev,&led_fops);

/*注冊字符設備*/

cdev_add(led_drv->led_cdev,led_drv->devno,1);



/*2. 創建設備類*/

led_drv->led_class=class_create(THIS_MODULE,'led_class');

if (IS_ERR(led_drv->led_class)) {

printk(KERN_ERR 'class_create() failed for led_classn');

ret = -ENODATA;

goto out_err_2;

}



/*3. 創建設備文件*/

led_drv->led_device=device_create(led_drv->led_class,NULL,MKDEV(led_drv->led_major,0),NULL,'led'); //   /led/xxx

if (IS_ERR(led_drv->led_device)) {

printk(KERN_ERR 'device_create failed for led_devicen');

ret = -ENODEV;

goto out_err_3;

}


/*申請GPC0_3,4引腳資源*/

gpio_request(S5PV210_GPC0(3),'LED1');

gpio_request(S5PV210_GPC0(4),'LED2');



return 0;

out_err_3:

class_destroy(led_drv->led_class);

out_err_2:

unregister_chrdev(led_drv->led_major,'led_module');

out_err_1:

kfree(led_drv);

return ret;


}

static int s5pv210_led_remove(struct platform_device *pdrv){

unregister_chrdev(led_drv->led_major,'led_module');

device_destroy(led_drv->led_class,MKDEV(led_drv->led_major,0));

class_destroy(led_drv->led_class);

gpio_free(S5PV210_GPC0(3));

gpio_free(S5PV210_GPC0(4));

kfree(led_drv);

return 0;

}



struct platform_device_id led_ids[]={

[0]={

.name = 's5pv210_led_lhy',

.driver_data = 0,

},

};


static struct platform_driver s5pv210_led_driver = {

.probe = s5pv210_led_probe,

.remove = s5pv210_led_remove,

.driver = { .name = 's5pv210_led_lhy',

.owner = THIS_MODULE, },

.id_table = led_ids,

}; 


static int __devinit s5pv210_led_init(void)

{

return platform_driver_register(&s5pv210_led_driver);

}


static void __devexit s5pv210_led_exit(void)

{

platform_driver_unregister(&s5pv210_led_driver);

}


module_init(s5pv210_led_init);

module_exit(s5pv210_led_exit);


MODULE_DESCRIPTION('LED driver for Marvell PM860x');

MODULE_AUTHOR('kiron');

MODULE_LICENSE('GPL');

MODULE_ALIAS('platform:s5pv210-led');

 ②在當前文件夾的Kconfig后加入,沒有就新建

config S5PV210_LED_DRV

    tristate  'led_dev  for fs210 device'

    help

        led driver is for s5pv210, choose y/m/n

 ③在當前文件夾的Makefile后加入,沒有就新建

obj-$(CONFIG_S5PV210_LED_DRV) = led_drv.o


④改動上級文件夾的Makefile和Kconfig


將linux-3.0.8/drivers/Kconfig  加入

source 'drivers/my_led/Kconfig'

將linux-3.0.8/drivers/Makefile 加入

obj-y        += mydriver/

 

最后就是自己make menuconfig里配置選項了。

====================================================================================================================================

4、測試程序編譯測試要使用交叉工具連

arm-none-linux-gnueabi-gcc led_test.c -o led_test

附:

將可運行文件增加到開機啟動,改動根文件系統filesystem

vi  filesystem/etc/init.d/rcS

./star_app/led_test

測試程序


#include

#include

#include

#include

#include

#include

#include

#include

#include


#define MAGIC 'h'

#define LED_ON _IOW(MAGIC,1,int)

#define LED_OFF _IOW(MAGIC,0,int)


static void my_sleep(int n){

int j;

for(j=0; j<10000000*n; j++);

}


int main(void)

{

printf('-------------------------------n'

'||   start:一閃一閃亮晶晶    ||n'

'-------------------------------n');

my_sleep(1);


int fd;

unsigned int cmd=0;

unsigned long val=0;

fd=open('/dev/led', O_RDWR);

if(fd<0){

perror('open failed!n');

exit(1);

}


int i;

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

if(i%2==0)

cmd=LED_OFF;

else

cmd=LED_ON;

val=3;            //亮 led3

if(ioctl(fd,cmd,val)<0){

perror('ioctl failed!n');

exit(1);

}

val=4;            //亮 led4

if(ioctl(fd,cmd,val)<0){

perror('ioctl failed!n');

exit(1);

}

my_sleep(1);

}

close(fd);

return 0;

}

關鍵字:設備  驅動器  編譯  內核 引用地址:喜羊羊系列【設備 - 驅動器 編譯進內核】

上一篇:gpiolib庫詳解
下一篇:Linux下簡易蜂鳴器驅動代碼及測試實例

推薦閱讀最新更新時間:2025-06-29 18:35

把驅動編譯內核
驅動程序的安裝---有兩種方法: (1)模塊插入方式; (2)直接編譯進內核; 本章我們來詳細講解---直接編譯進內核這種方法 我們把LED的驅動程序編譯進內核為例: 一.首先準備好LED的驅動程序內核模塊mini2440_leds.c如下: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #inclu
[單片機]
基于RISC-V內核的車規MCU芯片研發及產業化丨芯車無限確認申報2024金輯獎
申請技術丨基于RISC-V內核的車規MCU芯片研發及產業化 申報領域丨車規級芯片 獨特優勢: 上海芯車無限半導體科技有限公司,技術來源于清華大學集成電路學院,由上海清華國際創新中心孵化,是一家產學研結合的國產自主可控的車規芯片研發公司。公司技術團隊以清華畢業生為主,來自各芯片大廠,具有車規芯片完全自主研發能力,已完成千萬級天使輪融資。是一家以自研RISC-V內核為基礎,以自主可控車規級MCU研發、設計、銷售為主營業務的專業化集成電路設計企業。致力于成為國內領先的RISC-V 內核車規級 MCU 提供商,為國內汽車電子產業自主可控作出貢獻。在自研內核層面,公司自研支持 RISC-V 指令集標準的 32 位處理
[汽車電子]
基于RISC-V<font color='red'>內核</font>的車規MCU芯片研發及產業化丨芯車無限確認申報2024金輯獎
Ubuntu 24.04 LTS默認采用Linux6.8內核,實驗性版本可通過PPA獲得
Ubuntu 23.04“Lunar Lobster”在去年 4 月發布,這是一個“短期支持版本”,擁有 9 個月支持周期,目前該發行版的官方支持已經正式結束。 此前許多人在討論 Ubuntu 24.04 LTS 會采用哪個內核版本,大部分人都認為會是 6.6~6.7。現在 Canonical 工程師 Andrea Righi 宣布將在 Ubuntu 24.04 中采用 Linux 6.8 作為默認內核。 根據 Canonical 公布的更新計劃:下一個長期支持 Ubuntu 桌面 / 服務器發行版將采用 Linux 6.8 作為默認內核,預計將于 4 月 25 日發布。 據介紹,新版 Ubuntu Noble 內核的實驗版本
[嵌入式]
全自主IP KungFu內核:實現從單核到多核的統一處理器架構
2022年11月14日,由蓋世汽車主辦,上海虹橋國際中央商務區管委會、上海閔行區人民政府指導,上海南虹橋投資開發(集團)有限公司協辦的2022第二屆智能汽車域控制器創新峰會上,芯旺微電子FAE總監盧恒洋提出,作為向上集成和擴展計算的設備,域控制器是實現軟件定義汽車的第一步。基于對域控制器的理解,芯旺微電子認為,IO與計算的分離是接下來汽車電子電氣架構發展的主要方向,且區域控制器作為作為實現電源管理、數據連接和功能集成的核心,將快速部署在電子電氣架構中,形成關鍵的電子架構系統。 芯旺微電子是一家定位于汽車電子、工業控制等市場的芯片設計公司,擁有自主知識產權的嵌入式處理器內核--KungFu和全棧的開發工具系統。目前, KungF
[汽車電子]
全自主IP KungFu<font color='red'>內核</font>:實現從單核到多核的統一處理器架構
OK6410A 開發板 (八) 69 linux-5.11 OK6410A linux 內核同步機制 禁中斷/中斷屏蔽的實現
解決的問題是什么 中斷 搶占 1.實現原理 1/ 禁止 irq與fiq 2/ 禁止 中斷源 // 與 vic/gic 等 中斷控制器 相關 適用于 某個中斷源 中斷處理過程中,不能接受 來自該中斷源的中斷 2.1 禁止 irq與fiq local_irq_enable arch/arm/include/asm/irqflags.h 36 #define arch_local_irq_enable arch_local_irq_enable 37 static inline void arch_local_irq_enable(void) 38
[單片機]
基于MCS-51內核的匯編操作符筆記
數據傳送類指令: MOV 訪問內部數據儲存器 MOVX 訪問外部數據儲存器 MOVC 訪問ROM儲存器 XCH 整字節交換 XCHD 半字節交換(低四位) PUSH 設置堆棧指針寄存器SP所指向的內容(把字壓入堆棧) POP 把字彈出堆棧; SWAP 高低字節交換指令; 數據傳送指令不影響標志,只有一有堆棧操作可以直接修改程序狀態字PSW,這樣可以是某些標志位發生變化; 格式:MOV 操作數 目標操作數 操作數:A,Rn,direct(直接地址),@Ri(間接地址),#data; 源操作數:A,Rn,direct(直接地址),@Ri(間接地址); 提醒:MOV @DPTR,#data; 將16位的數據存入數據指針寄存器DPTR所指
[單片機]
邊緣AI芯片商ArchiTek宣布獲得SiFive的RISC-V內核許可
ArchiTek宣布從SiFive獲得RISC-V 內核許可,以完成其AiOnIc人工智能處理器的概念驗證。 “ SiFive E3系列核心IP使我們能夠實現性能,功率和面積的最佳表現,而SiFive內核設計者和SiFive合作伙伴DTS-Insight幫助縮短了我們的開發時間。” ArchiTek首席執行官兼首席技術官高田修一(Shuichi Takada)表示。 AiOnIc的架構稱為“aIPE”,旨在用于無風扇邊緣AI應用程序。總部位于大阪的ArchiTek宣稱:“ aIPE架構將同步定位和映射(SLAM)的處理時間減少到了通用CPU的1/20,并提高了使用OpenPose進行人類感知計算的操作速度,相對于GPU而言
[嵌入式]
邊緣AI芯片商ArchiTek宣布獲得SiFive的RISC-V<font color='red'>內核</font>許可
小米A1公布內核源碼 可以愉快的解鎖手機全部特性了
2017年,小米和谷歌合作了一款Android One產品A1,其實就是小米5X的海外版。   不過,這款產品確實小米第一款沒有預裝MIUI的產品,而是按照谷歌的要求集成了原生系統。由此,其系統迭代的速度也是十分迅速。   在兩次撤回并第三次推送安卓8.0更新的同時,小米也宣布了一個十分給力的決定,那就是放出內核源碼。   有了源碼,民間開發者就可以愉快地解鎖手機的全部硬件特性以及制作各類ROM了。   配置方面,小米A1采用了5.5英寸1080P顯示屏,搭載高通驍龍625處理器,配備4GB內存+64GB存儲,擁有后置1200萬廣角+1200萬長焦鏡頭,前置攝像頭為800萬像素,電池容量為3080mAh。
[手機便攜]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 达日县| 古交市| 荣昌县| 焦作市| 中西区| 钟山县| 淅川县| 贵定县| 九江县| 克什克腾旗| 霍邱县| 北川| 毕节市| 利辛县| 舞钢市| 库尔勒市| 湘潭市| 家居| 胶州市| 潼南县| 安龙县| 抚顺县| 项城市| 祥云县| 阜城县| 中牟县| 黔江区| 华阴市| 梁山县| 陆良县| 石嘴山市| 辽宁省| 定边县| 江川县| 兖州市| 永仁县| 东莞市| 梁河县| 靖西县| 如东县| 福清市|