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

喜羊羊系列之【設(shè)備-驅(qū)動 動態(tài)載入進(jìn)內(nèi)核】

發(fā)布者:快樂家庭最新更新時(shí)間:2025-01-07 來源: cnblogs關(guān)鍵字:動態(tài) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

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

平臺設(shè)備

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,  //開發(fā)模式下,這個(gè)真不能少!
	},
};

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

平臺驅(qū)動

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. 動態(tài)注冊/申請主設(shè)備*/
	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;
	}	
	
	//從設(shè)備號中分離出主設(shè)備號
	led_drv->led_major = MAJOR(led_drv->devno);
	/*為cdev分配空間*/
	led_drv->led_cdev  = cdev_alloc();
	/*注冊硬件操作方法/初始化cdev*/
	cdev_init(led_drv->led_cdev,&led_fops);
	/*注冊字符設(shè)備*/
	cdev_add(led_drv->led_cdev,led_drv->devno,1);


	/*2. 創(chuàng)建設(shè)備類*/
	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. 創(chuàng)建設(shè)備文件*/
	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	點(diǎn)亮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


關(guān)鍵字:動態(tài) 引用地址:喜羊羊系列之【設(shè)備-驅(qū)動 動態(tài)載入進(jìn)內(nèi)核】

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

推薦閱讀最新更新時(shí)間:2025-05-22 12:02

初入android驅(qū)動開發(fā)之字符設(shè)備(四-中斷)
上一篇講到android驅(qū)動開發(fā)中,應(yīng)用是怎樣去操作底層硬件的整個(gè)流程,實(shí)現(xiàn)了按鍵控制led的亮滅。當(dāng)然,這是一個(gè)非常easy的實(shí)例,只是略微演變一下,就能夠得到廣泛的應(yīng)用。 如開發(fā)掃描頭,應(yīng)用透過監(jiān)聽上報(bào)的按鍵的鍵值,監(jiān)聽到,則調(diào)用掃描頭的模塊。成功,則點(diǎn)亮LED燈,并把掃描頭解碼后的條碼信息。通過廣播的形式發(fā)出。又扯到其他地方,這里主要說說中斷。 1. 中斷的一些概念 中斷,是什么? 中斷。能夠看成是cpu對特殊事件的一種處理的機(jī)制,這類特殊事件一般指緊急事件或者說異常事件。非常easy的一個(gè)樣例,你拿你手機(jī)正在看視頻,來了一個(gè)電話。你接完電話,還是停在視頻。本來你的cpu正在運(yùn)行看視頻這一系列的指令處理。但當(dāng)
[單片機(jī)]
電動汽車的輪轂馬達(dá)及驅(qū)動電子設(shè)備
摘要 輪轂馬達(dá) 已經(jīng)開始在 電動汽車 (EV)中得到應(yīng)用,這項(xiàng)技術(shù)的采用可去除差速器(differential)和傳動軸(driveshaft)等裝置,能夠使電動汽車顯著地節(jié)省空間。但是,該方法也帶來了一些技術(shù)挑戰(zhàn),例如增加了簧下重量(unsprung weight)。本文將介紹輪轂馬達(dá)的發(fā)展?fàn)顩r,并討論驅(qū)動電子設(shè)備等一些設(shè)計(jì)集成問題。 輪轂馬達(dá):電動汽車傳動系統(tǒng)的創(chuàng)新方法 汽車技術(shù)發(fā)展歷來就是一個(gè)保守但卻不斷演化的過程,即使在電動汽車發(fā)生了深刻技術(shù)變化的背景下,設(shè)計(jì)人員也會“盡量使其安全”,希望使電動汽車的總體布局、形狀和感覺盡可能與傳統(tǒng)內(nèi)燃機(jī)(ICE)動力汽車相似。由于采用了這種方式,到目前為止,電動汽車的設(shè)計(jì)趨
[汽車電子]
電動汽車的輪轂馬達(dá)及<font color='red'>驅(qū)動</font>電子<font color='red'>設(shè)備</font>
基于IEEEl394b總線雙向數(shù)據(jù)傳輸設(shè)備驅(qū)動程序設(shè)計(jì)
  介紹了基于IEEEl394b總線雙向數(shù)據(jù)傳輸系統(tǒng)PC機(jī)端設(shè)備驅(qū)動程序。結(jié)合IEEEl394b總線規(guī)范,以Windows環(huán)境為例詳細(xì)介紹了利用Fir-eAPI SDK開發(fā)IEEE1394b設(shè)備驅(qū)動程序的設(shè)計(jì)原理、實(shí)現(xiàn)方法。   現(xiàn)有的大部分?jǐn)?shù)據(jù)傳輸接口總線造價(jià)比較高,且難以滿足實(shí)際運(yùn)用中對傳輸速率的要求,成了阻礙整個(gè)系統(tǒng)性能提高的一大屏障。IEEE-1394是現(xiàn)今最高速的串行總線接口之一,IEEE1394lb更是在原有IEEE1394的基礎(chǔ)上速度更快,支持距離更長,在實(shí)時(shí)批量數(shù)據(jù)傳輸方面有廣泛的應(yīng)用前景。   基于1394傳輸系統(tǒng)設(shè)備驅(qū)動文獻(xiàn),大部分都是基于IEEE1394a的,而IEEE1394b以其更高的速度展現(xiàn)出了更大的
[嵌入式]
手持通信設(shè)備的光源驅(qū)動設(shè)計(jì)
通信手持設(shè)備光源的應(yīng)用主要體現(xiàn)在鍵盤燈、液晶屏幕背光和特殊照明三個(gè)方面,主要的發(fā)光器件是半導(dǎo)體發(fā)光二極管(LED),驅(qū)動芯片設(shè)計(jì)技術(shù)有低壓差(LDO)穩(wěn)壓器、可調(diào)節(jié)(Regulator)穩(wěn)壓電源、電荷泵(Charge Pump)電源和超級電容(Super Capacitor)電源等不同形式。 半導(dǎo)體發(fā)光二極管(LED)是具有體積小、省電、長壽命和可靠性高的特點(diǎn),被廣泛應(yīng)用在通信手持設(shè)備中的屏幕顯示和信息傳遞提示。目前,LED正向高亮度、全彩色化、高性能、低成本的方面發(fā)展。 在手持設(shè)備光源的三大模塊中,鍵盤燈的應(yīng)用方式相對固定,通常會使用4~10個(gè)LED,均用串聯(lián)電阻的方式來限流,總體耗電相對較少。隨著工作電壓的不同,LED在顏色方
[電源管理]
通用串行總線(USB)設(shè)備驅(qū)動
??? 摘要: 從問題的由來、類驅(qū)動程序、通信協(xié)議、描述符、驅(qū)動開發(fā)等對USB的驅(qū)動進(jìn)行分析和討論,提出USB設(shè)備使用操作系統(tǒng)嵌入的通用類驅(qū)動程序成為趨勢。 ??? 關(guān)鍵詞: USB 類驅(qū)動程序 人工接口設(shè)備(HID) Windows驅(qū)動程序模型(WDM) 最初設(shè)計(jì)USB(Universal Serial Bus)這種外設(shè)總線的目的之一就是為了便于使用,這是計(jì)算機(jī)發(fā)展的產(chǎn)物。外設(shè)總線最重要的就是操作系統(tǒng)對外設(shè)的自動識別、配置,實(shí)現(xiàn)熱插拔,即插即用。本文試圖以人工接口設(shè)備(Human interface device,簡稱HID)為主,從問題的由來、類驅(qū)動程序、通信協(xié)議、描述符、驅(qū)動開發(fā)等幾個(gè)方面來探
[應(yīng)用]
LT1764替代已量產(chǎn)上市,共模半導(dǎo)體推出快速動態(tài)響應(yīng)低噪聲3A LDO穩(wěn)壓器GM1204
『共模半導(dǎo)體』 推出快速動態(tài)響應(yīng)低噪聲3A LDO穩(wěn)壓器GM1204,GM1204是一款低壓差穩(wěn)壓器,專為快速瞬態(tài)響應(yīng)而優(yōu)化 。GM1204該裝置能夠提供3A的輸出電流,典型壓降為325mV。工作靜態(tài)電流為1mA,關(guān)機(jī)時(shí)降至1μA以下。壓差模式下靜態(tài)電流控制良好;除了快速動態(tài)響應(yīng)外,GM1204還具有非常低的輸出電壓噪聲,這使得該器件非常適合比較敏感的射頻電源和醫(yī)學(xué)影像應(yīng)用。 GM1204系列產(chǎn)品介紹 該款芯片輸出電壓范圍為 1.21V 至 20V。GM1204 穩(wěn)壓器穩(wěn)定,輸出電容低至 10μF。內(nèi)部保護(hù)電路包括電流限制和熱限制。該器件有 1.5V、1.8V、2.5V、3.3V、5V 的固定輸出電壓,以及1.21V
[電源管理]
LT1764替代已量產(chǎn)上市,共模半導(dǎo)體推出快速<font color='red'>動態(tài)</font>響應(yīng)低噪聲3A LDO穩(wěn)壓器GM1204
助力中國半導(dǎo)體,泰克、忱芯科技向三安半導(dǎo)體交付SiC動態(tài)測試系統(tǒng)
中國北京2022年8月12日 — 日前, 泰克攜手方案合作伙伴忱芯科技向湖南三安半導(dǎo)體有限公司(三安半導(dǎo)體)交付了一臺Edison系列SiC功率模塊動態(tài)測試系統(tǒng) ,此為向國內(nèi)第三代半導(dǎo)體行業(yè)領(lǐng)先者三安半導(dǎo)體交付的多臺/套設(shè)備的首臺,這是泰克和忱芯科技圍繞寬禁帶半導(dǎo)體測試領(lǐng)域的合作進(jìn)一步深入,也是雙方為中國半導(dǎo)體行業(yè)在SiC應(yīng)用領(lǐng)域長期發(fā)展貢獻(xiàn)的一份力量,為三安半導(dǎo)體追趕和超越世界一流的道路提供極大助力。 泰克提供優(yōu)異的硬件設(shè)備及測試技術(shù),忱芯科技整合泰克的設(shè)備及自己的第三代半導(dǎo)體的技術(shù)儲備,開發(fā)Edison系列測試系統(tǒng),圍繞著寬禁帶半導(dǎo)體測試領(lǐng)域開展全產(chǎn)業(yè)的SiC功率模塊動態(tài)測試系統(tǒng)合作,共同推進(jìn)第三代半導(dǎo)體SiC技術(shù)的發(fā)展
[測試測量]
助力中國半導(dǎo)體,泰克、忱芯科技向三安半導(dǎo)體交付SiC<font color='red'>動態(tài)</font>測試系統(tǒng)
STM32非對稱PWM模式實(shí)現(xiàn)動態(tài)移相(Asymmetric PWM mode的用法)
MCU:STM32F334C8T6 STM32有多種PWM模式,實(shí)現(xiàn)各種不同的強(qiáng)大功能,本文使用非對稱PWM模式,實(shí)現(xiàn)可動態(tài)改變移相相位的全橋PWM驅(qū)動波形 首先什么是非對稱PWM模式? Asymmetric mode allows two center-aligned PWM signals to be generated with a programmable phase shift. 那什么是center-aligned PWM?個(gè)人比較淺顯的理解為計(jì)數(shù)器采用中心計(jì)數(shù)模式時(shí)的PWM,如下圖所示(截自ST官方參考手冊),所以這里和之前講的PWM中最大的不同之一就是計(jì)數(shù)器模式的選擇,一定是選擇中心計(jì)數(shù)模式,可根據(jù)中斷的需
[單片機(jī)]
STM32非對稱PWM模式實(shí)現(xiàn)<font color='red'>動態(tài)</font>移相(Asymmetric PWM mode的用法)
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(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
主站蜘蛛池模板: 北海市| 长寿区| 前郭尔| 仁寿县| 东丽区| 大渡口区| 修武县| 广德县| 大余县| 防城港市| 托克逊县| 雅江县| 葵青区| 商都县| 泰兴市| 铜陵市| 日照市| 上高县| 修武县| 筠连县| 武隆县| 海南省| 双鸭山市| 宿州市| 镇原县| 轮台县| 邛崃市| 卢湾区| 都匀市| 邓州市| 甘孜| 通渭县| 夏津县| 岱山县| 依兰县| 冀州市| 云林县| 方山县| 彭阳县| 原阳县| 武邑县|