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

喜羊羊系列之【設備-驅動 動態載入進內核】

發布者:快樂家庭最新更新時間:2025-01-07 來源: cnblogs關鍵字:動態 手機看文章 掃描二維碼
隨時隨地手機看文章

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

平臺設備

dev_led.c


#include <linux/init.h>
#include 
#include 
#include 'led.h'

static void led_release(struct device *dev){
	
}

static struct platform_device s5pv210_led_device_lhy = {
	.name			= 	's5pv210_led_lhy',
	.id				= 	1,

	.dev			=	{
			.release 	= led_release,  //開發模式下,這個真不能少!
	},
};

static int __init dev_led_init(void){
	platform_device_register(&s5pv210_led_device_lhy);
	return 0;
}

static void __exit dev_led_exit(void){
	platform_device_unregister(&s5pv210_led_device_lhy);
}

module_init(dev_led_init);
module_exit(dev_led_exit);
MODULE_LICENSE('GPL');

平臺驅動

led_drv.c


#include
#include
#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'led.h'

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 __init led_init(void)
{
	platform_driver_register(&s5pv210_led_driver);
	return 0;
}

static void __exit led_exit(void)
{
	platform_driver_unregister(&s5pv210_led_driver);

}


module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE('GPL');

測試程序



#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 'led.h'

/*
** ./led_test on	num	點亮LED1/2
** ./led_test off	num	熄滅LED1/2
*/
int main(int argc, char *argv[])
{
	if (argc != 3)
			printf('input:< %s on led_num >or< %s off led_num>n',argv[0],argv[0]);

	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);
	}

	if(strcmp(argv[1],'on')==0){
		cmd=LED_ON;
	}else if(strcmp(argv[1],'off')==0){
		cmd=LED_OFF;
	}else{
		printf('err input!n');
	}

	val = atoi(argv[2]);

	if(ioctl(fd,cmd,val)<0){
		perror('ioctl failed!n');
		exit(1);
	}

	close(fd);
	return 0;
}


Makefile


ifeq ($(KERNELRELEASE),)
	KERNELDIR =/home/farsight/work/kernel/linux-3.0.8
	PWD =$(shell pwd)
modules:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
	arm-none-linux-gnueabi-gcc led_test.c -o led_test
	cp led_drv.ko dev_led.ko led_test /opt/filesystem/s5pv210
modules_install:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
	rm -rf *.so *.o *.ko *test  .tmp_versions *.mod.c *.order *.symvers 
else
	obj-m :=led_drv.o dev_led.o
endif


關鍵字:動態 引用地址:喜羊羊系列之【設備-驅動 動態載入進內核】

上一篇:linux驅動(七)gpiolib庫詳解
下一篇:tiny210裸機第1課(啟動原理)

推薦閱讀最新更新時間:2025-04-19 16:07

羅德與施瓦茨推出CMX500 AI腳本助手,AI驅動自動化助力移動設備測試
羅德與施瓦茨(以下簡稱“R&S”)推出CMX500 AI腳本助手,這是一款革新移動設備測試的全新解決方案。 這款基于人工智能的工具專為CMX500 5G一體化信令測試儀設計,旨在幫助測試工程師簡化復雜的腳本生成流程,大幅提升工作效率。 該助手為用戶提供了一種量身定制且高效的自動化方案,適用于5G NR協議研發測試、應用測試及儀器自動化等多個領域。 圖:CMX500 5G一體化信令測試儀現已支持AI驅動的自動化測試腳本生成 R&S推出創新技術,通過全新的CMX500 AI腳本助手實現測試腳本生成和功能測試的自動化。該工具結合了生成式AI和自然語言處理技術,旨在幫助測試工程師優化工作流程,降低錯誤風險,并加速產品的上市
[測試測量]
羅德與施瓦茨推出CMX500 AI腳本助手,AI<font color='red'>驅動</font>自動化助力移動<font color='red'>設備</font>測試
linux設備樹-按鍵中斷驅動
---------------------------------------------------------------------------------------------------------------------------- 內核版本:linux 5.2.8 根文件系統:busybox 1.25.0 u-boot:2016.05 ---------------------------------------------------------------------------------------------------------------------------- 回到頂部 一、修改設備樹
[單片機]
移植嵌入式Linux到ARM處理器S3C2410:設備驅動
設備驅動程序是操作系統內核和機器硬件之間的接口,它為應用程序屏蔽硬件的細節,一般來說,Linux的設備驅動程序需要完成如下功能:   ·設備初始化、釋放;   ·提供各類設備服務;   ·負責內核和設備之間的數據交換;   ·檢測和處理設備工作過程中出現的錯誤。   Linux下的設備驅動程序被組織為一組完成不同任務的函數的集合,通過這些函數使得Windows的設備操作猶如文件一般。在應用程序看來,硬件設備只是一個設備文件,應用程序可以象操作普通文件一樣對硬件設備進行操作,如open ()、close ()、read ()、write () 等。   Linux主要將設備分為二類:字符設備和塊設備。字符設備是指設備發送和接收數據以
[單片機]
移植嵌入式Linux到ARM處理器S3C2410:<font color='red'>設備</font><font color='red'>驅動</font>
東芝推出支持高電流和高電壓的工業設備直流有刷電機驅動器集成電路
行業首款單片集成電路可支持10A輸出電流和50V電壓。 東京—(東芝公司TOKYO:6502)2014年3月24日宣布推出用于工業設備的單通道直流有刷電機驅動器集成電路“TB67H303HG”。該產品是行業首款1可以支持10A輸出電流和50V電壓的單片2集成電路。即日起開始批量生產出貨。 工業設備電機驅動器電路需要高輸出電流和電壓。這使得設計包含單驅動器集成電路的電路較為困難,因為高電流會產生熱量。為了減少每個組件生成的熱量,通常會使用多個獨立的半導體。 “TB67H303HG”采用最新的高電壓模擬工藝,使導通電阻降至其先前版本3的80%(0.2Ω或更低)。這款新集成電路有助于減少獨立的半導體設備數量,
[工業控制]
東芝推出支持高電流和高電壓的工業<font color='red'>設備</font>直流有刷電機<font color='red'>驅動</font>器集成電路
在開關設備應用中有效驅動螺線管線圈
作者:Sanjay Pithadia,德州儀器 (TI) 高級模擬應用工程師 引言 所有電源系統的主要目的都是維持高水平的持續供電能力,并在出現不可承受狀態時,最小化其影響范圍和斷電時間。功率損耗、電壓下降、過電流和過壓總會出現,因為我們無法避免自然事件、物理事故、設備故障或者人為誤操作。組合使用一些器件,用于保護電氣設備免受這些事件的損害,也即“接電裝置”。螺線管和繼電器是所有接電裝置中不可或缺的組成部分。它們通過線圈通電和接觸,連接/斷開受保護設備的電源。本文為您介紹繼電器、電流接觸器和閥門中常見的螺線管線圈的一些特性。另外,文章還介紹了一些驅動它們的方法,并說明有效驅動的發展趨勢。本文還列舉了一些接電裝置應用電路的例子。
[模擬電子]
在開關<font color='red'>設備</font>應用中有效<font color='red'>驅動</font>螺線管線圈
破解SiC、GaN柵極動態測試難題的魔法棒 — 光隔離探頭
SiC、GaN 作為最新一代功率半導體器件具有遠優于傳統 Si 器件的特性,能夠使得功率變換器獲得更高的效率、更高的功率密度和更低的系統成本。但同時,SiC、GaN極快的開關速度也給工程師帶來了使用和測量的挑戰,稍有不慎就無法獲得正確的波形,從而嚴重影響到器件評估的準確、電路設計的性能和安全、項目完成的速度。 SiC、GaN動態特性測量中,最難的部分就是對半橋電路中上橋臂器件驅動電壓VGS的測量, 包括兩個部分: 開關過程和Crosstalk 。此時是無法使用無源探頭進行測量的,這會導致設備和人員危險,同時還會由于跳變的共模電壓而無法獲得準確的結果。通常情況下,我們會選擇高壓差分探頭來進行測量。 我們來使用測試界的魔法棒—
[測試測量]
破解SiC、GaN柵極<font color='red'>動態</font>測試難題的魔法棒 — 光隔離探頭
是德科技發布功率半導體模塊動態參數分析儀——PD1550A
是德科技公司近日宣布,發布具有增強功能的下一代雙脈沖測試儀(DPT)—— 功率動態參數分析儀PD1550A ,使客戶能夠比以往更快、更簡單地測試功率模塊。是德科技提供先進的設計和驗證解決方案,旨在加速創新,創造一個安全互聯的世界。 由于設計簡單、高能量密度和可靠性的特點,功率模塊被廣泛應用于各種行業,如電動汽車(EV)、太陽能光伏、火車、家用電器和飛機。研發人員基于寬禁帶(WBG)器件的特點,將快速切換開關,減小電力電子模塊尺寸,并確保效率的優勢延續至功率模塊。然而,這也為測試寬禁帶半導體功率模塊帶來了挑戰,我們需要新的解決方案來正確評價這些產品,同時解決模塊設計問題并縮短開發周期。 Keysight 的 PD155
[測試測量]
是德科技發布功率半導體模塊<font color='red'>動態</font>參數分析儀——PD1550A
使用LabVIEW和CompactRIO設計并實現了動態輸出反饋控制器
  麻省理工學院(MIT)的反饋控制系統課程專注于使用經典的控制和狀態空間技術設計和分析控制系統。 此門課程向本科生和研究生開放,每年秋季大約招收20名學生。 課程的一部分內容要求學生設計并實現一系列實驗室模塊中物理系統的翻轉、俯沖和偏航控制器。 學生使用根軌跡、Bode圖和其他技術來設計經典的控制器,采用線性二次調節器(LQR)、線性二次型高斯(LQG)和動態輸出反饋(DOFB)設計開發狀態空間控制器。 學生使用LabVIEW控制設計與仿真模塊 和LabVIEW MathScript RT模塊實現狀態反饋、狀態估計和動態控制定律設計。 學生通過模擬驗證他們的控制器之后,使用CompactRIO、LabVIEW FPGA和LabV
[測試測量]
使用LabVIEW和CompactRIO設計并實現了<font color='red'>動態</font>輸出反饋控制器
小廣播
設計資源 培訓 開發板 精華推薦

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

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

隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 来凤县| 年辖:市辖区| 安陆市| 宝坻区| 托里县| 石城县| 霍州市| 邮箱| 怀化市| 绥中县| 三都| 邓州市| 东乡| 祁阳县| 且末县| 竹溪县| 澜沧| 襄樊市| 乐山市| 江达县| 金门县| 丹凤县| 鄂尔多斯市| 德钦县| 响水县| 洪江市| 新化县| 邵阳市| 施秉县| SHOW| 林甸县| 永新县| 资兴市| 富锦市| 集安市| 永年县| 保定市| 阜康市| 宜宾市| 宁陕县| 丹凤县|