当前位置:文档之家› Linux_I2C设备驱动文件操作接口

Linux_I2C设备驱动文件操作接口

Linux_I2C设备驱动文件操作接口
Linux_I2C设备驱动文件操作接口

I2C适配器驱动被作为一个单独的模块被加载进内核,在模块的加载和卸载函数中,只需注册和注销一个platform_driver结构体,如代码清单15.25。

代码清单15.25 S3C2410 I2C总线驱动模块加载与卸载

1 static int __init i2c_adap_s3c_init(void)

2 {

3 int ret;

4

5 ret = platform_driver_register(&s3c2410_i2c_driver);

6 if (ret == 0) {

7 ret = platform_driver_register(&s3c2440_i2c_driver);

8 if (ret)

9 platform_driver_unregister(&s3c2410_i2c_driver);

10 }

11

12 return ret;

13 }

14

15 static void __exit i2c_adap_s3c_exit(void)

16 {

17 platform_driver_unregister(&s3c2410_i2c_driver);

18 platform_driver_unregister(&s3c2440_i2c_driver);

——

19 }

20 module_init(i2c_adap_s3c_init);

21 module_exit(i2c_adap_s3c_exit);

platform_driver结构体包含了具体适配器的probe()函数、remove()函数、resume()函数指针等信息,它需要被定义和赋值,如代码清单15.26。

代码清单15.26 platform_driver结构体

1 static struct platform_driver s3c2410_i2c_driver = {

2 .probe = s3c24xx_i2c_probe,

3 .remove = s3c24xx_i2c_remove,

4 .resume = s3c24xx_i2c_resume,

5 .driver = {

6 .owner = THIS_MODULE,

7 .name = "s3c2410-i2c",

8 },

9 };

当通过Linux内核源代码/drivers/base/platform.c文件中定义platform_driver_unregister()函数注册platform_driver结构体时,其中probe指针指向的s3c24xx_i2c_probe()函数将被调用以初始化适配器硬件,如代码清单15.27。

代码清单15.27 S3C2410 I2C总线驱动中的s3c24xx_i2c_probe函数

1 static int s3c24xx_i2c_probe(struct platform_device *pdev)

——

2 {

3 struct s3c24xx_i2c *i2c = &s3c24xx_i2c;

4 struct resource *res;

5 int ret;

6

7 /* 使能I2C的时钟 */

8 i2c->dev = &pdev->dev;

9 i2c->clk = clk_get(&pdev->dev, "i2c");

10 if (IS_ERR(i2c->clk)) {

11 dev_err(&pdev->dev, "cannot get clock\n");

12 ret = -ENOENT;

13 goto out;

14 }

15 clk_enable(i2c->clk);

16

17 /* 映射寄存器 */

18 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

19 if (res == NULL) {

20 dev_err(&pdev->dev, "cannot find IO resource\n");

21 ret = -ENOENT;

22 goto out;

23 }

24 i2c->ioarea = request_mem_region(res->start,

(res->end-res->start)+1,

25 pdev->name);

26 if (i2c->ioarea == NULL) {

27 dev_err(&pdev->dev, "cannot request IO\n");

28 ret = -ENXIO;

29 goto out;

30 }

31

32 i2c->regs = ioremap(res->start, (res->end-res->start)+1);

33 if (i2c->regs == NULL) {

34 dev_err(&pdev->dev, "cannot map IO\n");

35 ret = -ENXIO;

36 goto out;

37 }

38

39 /* 设置I2C的信息块 */

40 i2c->adap.algo_data = i2c;

41 i2c->adap.dev.parent = &pdev->dev;

42

43 /* 初始化I2C控制器 */

44 ret = s3c24xx_i2c_init(i2c);

45 if (ret != 0)

46 goto out;

47

48 /* 申请中断 */

49 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);

50 if (res == NULL) {

51 ret = -ENOENT;

52 goto out;

53 }

54 ret = request_irq(res->start, s3c24xx_i2c_irq, SA_INTERRUPT,

55 pdev->name, i2c);

56 if (ret != 0) {

57 goto out;

58 }

59 i2c->irq = res;

60

61 ret = i2c_add_adapter(&i2c->adap); /*添加i2c_adapter*/

62 if (ret < 0) {

63 goto out;

64 }

65

66 platform_set_drvdata(pdev, i2c);

67

68 out:

69 if (ret < 0)

70 s3c24xx_i2c_free(i2c);

71 return ret;

72 }

上述代码中的主体工作是使能硬件并申请I2C适配器使用的I/O地址、中断号等,在这些工作都完成无误后,通过I2C核心提供的

i2c_add_adapter()函数添加这个适配器。因为S3C2410内部集成I2C 控制器,可以确定I2C适配器一定存在, s3c24xx_i2c_probe()函数虽然命名“探测”,但实际没有也不必进行任何探测工作,之所以这样命名完全是一种设计习惯。

与s3c24xx_i2c_probe ()函数完成相反功能的函数是

s3c24xx_i2c_remove()函数,它在适配器模块卸载函数调用

platform_driver_unregister()函数时被通过platform_driver的remove指针方式调用。 xxx_i2c_remove()的设计模板见代码清单

15.28。

代码清单15.28 S3C2410 I2C总线驱动中的s3c24xx_i2c_remove函数

1 static int s3c24xx_i2c_remove(struct platform_device *pdev)

2 {

3 struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev);

4

5 if (i2c != NULL) {

6 s3c24xx_i2c_free(i2c);

7 platform_set_drvdata(pdev, NULL);

8 }

9

10 return 0;

11 }

代码清单15.27和15.28中用到的s3c24xx_i2c结构体进行适配器所有信息的封装,类似于私有信息结构体,它与代码清单15.12给出的xxx_i2c结构体模板对应。代码清单15.29给出了s3c24xx_i2c结构体的定义,以及驱动模块定义的一个s3c24xx_i2c结构体全局实例。

代码清单15.29 s3c24xx_i2c结构体

1 struct s3c24xx_i2c {

2 spinlock_t lock;

3 wait_queue_head_t wait;

4 struct i2c_msg *msg;

5 unsigned int msg_num;

6 unsigned int msg_idx;

7 unsigned int msg_ptr;

8 enum s3c24xx_i2c_state state;

9 void __iomem *regs;

10 struct clk *clk;

11 struct device *dev;

12 struct resource *irq;

13 struct resource *ioarea;

14 struct i2c_adapter adap;

15 };

16

17 static struct s3c24xx_i2c s3c24xx_i2c = {

18 .lock = SPIN_LOCK_UNLOCKED, /*自旋锁未锁定*/

19 .wait = __WAIT_QUEUE_HEAD_INITIALIZER(s3c24xx_i2c.wait),/*等待队列初始化*/

20 .adap = {

21 .name = "s3c2410-i2c",

22 .owner = THIS_MODULE,

23 .algo = &s3c24xx_i2c_algorithm,

24 .retries = 2,

25 .class = I2C_CLASS_HWMON,

26 },

27 };

15.5.4 S3C2410 I2C总线通信方法

由代码清单15.29第23行可以看出,I2C适配器对应的i2c_algorithm 结构体实例为s3c24xx_i2c_algorithm,代码清单15.30给出了

s3c24xx_i2c_algorithm的定义。

代码清单15.30 S3C2410的i2c_algorithm结构体

1 static struct i2c_algorithm s3c24xx_i2c_algorithm = {

2 .master_xfer = s3c24xx_i2c_xfer,

3 .functionality = s3c24xx_i2c_func,

4 };

上述代码第1行指定了S3C2410 I2C总线通信传输函数

s3c24xx_i2c_xfer(),这个函数是如此的关键,所有I2C总线上对设备的访问最终应该由它来完成,代码清单 15.31给出了这个重要函数以及其依赖的s3c24xx_i2c_doxfer()函数和s3c24xx_i2c_message_start()函数的源代码。

代码清单15.31 S3C2410 I2C总线驱动的master_xfer函数

1 static int s3c24xx_i2c_xfer(struct i2c_adapter *adap,

2 struct i2c_msg *msgs, int num)

3 {

4 struct s3c24xx_i2c *i2c = (struct s3c24xx_i2c *)adap->algo_data;

5 int retry;

6 int ret;

7

8 for (retry = 0; retry < adap->retries; retry++) {

9 ret = s3c24xx_i2c_doxfer(i2c, msgs, num);

10 if (ret != -EAGAIN)

11 return ret;

12 udelay(100);

13 }

14

15 return -EREMOTEIO;

16 }

17

18 static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, struct i2c_msg *msgs, int num)

19 {

20 unsigned long timeout;

21 int ret;

22

23 ret = s3c24xx_i2c_set_master(i2c);

24 if (ret != 0) {

25 ret = -EAGAIN;

26 goto out;

27 }

28

29 spin_lock_irq(&i2c->lock);

30 i2c->msg = msgs;

31 i2c->msg_num = num;

32 i2c->msg_ptr = 0;

33 i2c->msg_idx = 0;

34 i2c->state = STATE_START;

35 s3c24xx_i2c_enable_irq(i2c);

36 s3c24xx_i2c_message_start(i2c, msgs);

37 spin_unlock_irq(&i2c->lock);

38

39 timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5);

40

41 ret = i2c->msg_idx;

42

43 if (timeout == 0)

44 dev_dbg(i2c->dev, "timeout\n");

45 else if (ret != num)

46 dev_dbg(i2c->dev, "incomplete xfer (%d)\n", ret);

47

48 msleep(1);/* 确保停止位已经被传递 */

49

50 out:

51 return ret;

52 }

53

54 static void s3c24xx_i2c_message_start(struct s3c24xx_i2c *i2c,

55 struct i2c_msg *msg)

56 {

57 unsigned int addr = (msg->addr & 0x7f) << 1;

58 unsigned long stat;

59 unsigned long iiccon;

60

61 stat = 0;

62 stat |= S3C2410_IICSTAT_TXRXEN;

63

64 if (msg->flags & I2C_M_RD) {

65 stat |= S3C2410_IICSTAT_MASTER_RX;

66 addr |= 1;

67 } else

68 stat |= S3C2410_IICSTAT_MASTER_TX;

69 if (msg->flags & I2C_M_REV_DIR_ADDR)

70 addr ^= 1;

71

72 s3c24xx_i2c_enable_ack(i2c);/*如果要使能ACK,则使能*/

73

74 iiccon = readl(i2c->regs + S3C2410_IICCON);

75 writel(stat, i2c->regs + S3C2410_IICSTAT);

76 writeb(addr, i2c->regs + S3C2410_IICDS);

77

78 udelay(1);/*在发送新的开始位前延迟1位*/

79 writel(iiccon, i2c->regs + S3C2410_IICCON);

80 stat |= S3C2410_IICSTAT_START;

81 writel(stat, i2c->regs + S3C2410_IICSTAT);

82 }

s3c24xx_i2c_xfer()函数调用s3c24xx_i2c_doxfer()函数传输I2C消息,第8行的循环意味着最多可以重试adap->retries次。

s3c24xx_i2c_doxfer()首先将S3C2410的I2C适配器设置为I2C主设备,其后初始化s3c24xx_i2c结构体,使能I2C中断,并调用

s3c24xx_i2c_message_start()函数启动I2C消息的传输。

s3c24xx_i2c_message_start()函数写S3C2410适配器对应的控制寄存

器向I2C从设备传递开始位和从设备地址。

上述代码只是启动了I2C消息数组的传输周期,并没有完整实现图15.3中给出的algorithm master_xfer流程。这个流程的完整实现需要借助I2C适配器上的中断来步步推进。代码清单15.32给出了S3C2410 I2C适配器中断处理函数以及其依赖的i2s_s3c_irq_nextbyte()函数的源代码。

代码清单15.32 S3C2410 I2C适配器中断处理函数

1 static irqreturn_t s3c24xx_i2c_irq(int irqno, void *dev_id,

2 struct pt_regs *regs)

3 {

4 struct s3c24xx_i2c *i2c = dev_id;

5 unsigned long status;

6 unsigned long tmp;

7

8 status = readl(i2c->regs + S3C2410_IICSTAT);

9 if (status & S3C2410_IICSTAT_ARBITR) {

10 ...

11 }

12

13 if (i2c->state == STATE_IDLE) {

14 tmp = readl(i2c->regs + S3C2410_IICCON);

15 tmp &= ~S3C2410_IICCON_IRQPEND;

16 writel(tmp, i2c->regs + S3C2410_IICCON);

17 goto out;

18 }

19

20 i2s_s3c_irq_nextbyte(i2c, status);/* 把传输工作进一步推进*/

21

22 out:

23 return IRQ_HANDLED;

24 }

25

26 static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)

27 {

28 unsigned long tmp;

29 unsigned char byte;

30 int ret = 0;

31

32 switch (i2c->state) {

33 case STATE_IDLE:

34 goto out;

35 break;

36 case STATE_STOP:

37 s3c24xx_i2c_disable_irq(i2c);

38 goto out_ack;

39 case STATE_START:

40 /* 我们最近做的一件事是启动一个新I2C消息*/

41 if (iicstat & S3C2410_IICSTAT_LASTBIT &&

42 !(i2c->msg->flags & I2C_M_IGNORE_NAK)) {

43 /* 没有收到ACK */

44 s3c24xx_i2c_stop(i2c, -EREMOTEIO);

45 goto out_ack;

46 }

47

48 if (i2c->msg->flags & I2C_M_RD)

49 i2c->state = STATE_READ;

50 else

51 i2c->state = STATE_WRITE;

52

53 /* 仅一条消息,而且长度为0(主要用于适配器探测),发送停止位*/

54 if (is_lastmsg(i2c) && i2c->msg->len == 0) {

55 s3c24xx_i2c_stop(i2c, 0);

56 goto out_ack;

57 }

58

59 if (i2c->state == STATE_READ)

60 goto prepare_read;

61 /* 进入写状态 */

62 case STATE_WRITE:

63 retry_write:

64 if (!is_msgend(i2c)) {

65 byte = i2c->msg->buf[i2c->msg_ptr++];

66 writeb(byte, i2c->regs + S3C2410_IICDS);

67

68 } else if (!is_lastmsg(i2c)) {

69 /* 推进到下一条消息 */

70 i2c->msg_ptr = 0;

71 i2c->msg_idx ++;

72 i2c->msg++;

73

74 /* 检查是否要为该消息产生开始位 */

75 if (i2c->msg->flags & I2C_M_NOSTART) {

76 if (i2c->msg->flags & I2C_M_RD) {

77 s3c24xx_i2c_stop(i2c, -EINVAL);

78 }

79 goto retry_write;

80 } else {

81 /* 发送新的开始位 */

82 s3c24xx_i2c_message_start(i2c, i2c->msg);

83 i2c->state = STATE_START;

84 }

85 } else {

86 s3c24xx_i2c_stop(i2c, 0);/* send stop */

87 }

——

88 break;

89 case STATE_READ:

90 /* 有一个字节可读,看是否还有消息要处理 */

91 if (!(i2c->msg->flags & I2C_M_IGNORE_NAK) &&

92 !(is_msglast(i2c) && is_lastmsg(i2c))) {

93

94 if (iicstat & S3C2410_IICSTAT_LASTBIT) {

95 dev_dbg(i2c->dev, "READ: No Ack\n");

96

97 s3c24xx_i2c_stop(i2c, -ECONNREFUSED);

98 goto out_ack;

99 }

100 }

101 byte = readb(i2c->regs + S3C2410_IICDS);

102 i2c->msg->buf[i2c->msg_ptr++] = byte;

103

104 prepare_read:

105 if (is_msglast(i2c)) {/* last byte of buffer */

106 if (is_lastmsg(i2c))

107 s3c24xx_i2c_disable_ack(i2c);

108

109 } else if (is_msgend(i2c)) {

110 /* 还有消息要处理吗? */

111 if (is_lastmsg(i2c)) {

112 s3c24xx_i2c_stop(i2c, 0);/* last message, send stop and complete */

113 } else {

114 /* 推进到下一条消息 */

115 i2c->msg_ptr = 0;

116 i2c->msg_idx++;

117 i2c->msg++;

118 }

119 }

120 break;

121 }

122

123 /* irq清除 */

124 out_ack:

125 tmp = readl(i2c->regs + S3C2410_IICCON);

126 tmp &= ~S3C2410_IICCON_IRQPEND;

127 writel(tmp, i2c->regs + S3C2410_IICCON);

128 out:

129 return ret;

130 }

中断处理函数s3c24xx_i2c_irq()主要通过调用

i2s_s3c_irq_nextbyte()函数进行传输工作的进一步推进。

i2s_s3c_irq_nextbyte()函数通过switch(i2c->state)语句分成

i2c->state的不同状态进行处理,在每种状态下,先检查i2c->state 的状态与硬件寄存器应该处于的状态是否一致,如果不一致,则证明有误,直接返回。当I2C处于读状态 STATE_READ或写状态STATE_WRITE 时,通过is_lastmsg()函数判断是否传输的是最后一条I2C消息,如果是,则产生停止位,否则通过i2c->msg_idx++、i2c->msg++推进到下一条消息。

15.6 实例:SAA7113H视频AD芯片I2C设备驱动

15.6.1 SAA7113H视频AD芯片硬件描述

如图15.9,SAA7113H是飞利浦半导体推出的9位视频AD芯片,它可以选择4路视频输入中的1路,并采样为9位的数字信号。

图15.9 SAA7113H输入、输出与I2C接口

对SAA7113H 输入通道的选择以及采样方式的设置都需通过其I2C接口进行,以0x4A地址可读SAA7113H寄存器,以0x4B可写SAA7113H寄存器。 SAA7113H的I2C接口连接在S3C2410的I2C控制器上,作为S3C2410 I2C控制器的从设备。SAA7113H的写时序与图15.7给出的写时序是一致的,但是读时序则需通过2条I2C消息解决,在第1条消息中应该给SAA7113H写入寄存器子地址,如图15.10。

监控软件设备驱动程序的编程与实现

监控软件设备驱动程序的编程与实现 0 前言 在专业监控软件出现以前,自动控制系统集成人员的一个重要任务就是编写专门的系统上位监控程序。但是,在实际工程中我们发现:一方面,由于各编程人员的水平参差不齐,许多软件的功能和可靠性都存在问题;另一方面,由于每个编程人员的编程习惯和编程思路都不同,程序的可读性和功能的扩展性都比较差。因此,功能强大、实用面广的专业监控软件就应运而生。如MCGS监控软件、组态王控软件等。由于现场智能仪表、采集板的多种多样,监控软件自带的设备驱动程序毕竟有限,因此编制设备驱动程序就成了自控系统集成工程师的重要工作之一。 本文以北京昆仑通态公司开发的MCGS为例来说明监控软件设备驱动程序的一般思路。MCGS是基于Windows95和WindowsNT平台,为用户提供了从数据采集到数据处理、报警处理、流程控制、动画显示、报表输出等解决实际工程问题的完整方案和操作工具。MCGS允许用户在VisualBasic中操作MCGS中的对象,提供了一套开放的可扩充接口,用户可根据自己的需要用VB编制特定的功能构件来扩充系统的功能。 1接口原理 许多组态软件提供了设备驱动程序软件开发包,支持用户用VB、VC、Delphi等高级编程语言编制设备驱动程序。MCGS组态软件驱动程序编程原理框图如图1所示: 几乎所有的PLC、智能仪表、采集板卡都提供了驱动软件,有的在说明书中还提供了驱动软件的核心代码、函数或数据结构。而监控软件也提供了开放性的可扩充接口,一般包括属性函数、方法函数、IO端口操作函数和串口操作函数等。在运行模式下,监控软件定时或在事件激发时调用设备驱动程序,而设备驱动程序根据需要,再调用设备核心函数。例如,MCGS在组态模式下按在线帮助按钮就会调用GetDevHelp接口,显示设备构件的在线帮助;按内部属性按钮时就会调用SetDevPage接口,显示设备构件的特定属性页。在运行环境下,MCGS首先调用一次InitDevRun接口对设备进行一些必须的初始化工作。

驱动程序

linux 驱动程序设计实验 一实验目的 1.了解LINUX操作系统中的设备驱动程序的组成 2.编写简单的字符设备驱动程序并进行测试 3.编写简单的块设备驱动程序并进行测试 4.理解LINUX操作系统的设备管理机制 二准备知识 1. LINUX下驱动程序基础知识 Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。在Linux操作系统下有两类主要的设备文件:一类是字符设备,另一类则是块设备。字符设备是以字节为单位逐个进行I/O操作的设备,在对字符设备发出读写请求时,实际的硬件I/O紧接着就发生了,一般来说字符设备中的缓存是可有可无的,而且也不支持随机访问。块设备则是利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用相应的请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,其目的是避免耗费过多的CPU时间来等待操作的完成。一般说来,PCI卡通常都属于字符设备。 我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,这些驱动程序源码可以修改到内核中,也可以把他们编译成模块形势,在需要的时候动态加载. 而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM (高级电源管理)、VFS等驱动程序则编译在内核文件中。有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。当我们加载了设备驱动模块后,应该怎样访问这些设备呢?Linux是一种类Unix系统,Unix的一个基本特点是“一切皆为文件”,它抽象了设备的处理,将所有的硬件设备都像普通文件一样看待,也就是说硬件可以跟普通文件一样来打开、关闭和读写。 系统中的设备都用一个设备特殊文件代表,叫做设备文件,设备文件又分为Block (块)型设备文件、Character(字符)型设备文件和Socket (网络插件)型设备文件。Block设备文件常常指定哪些需要以块(如512字节)的方式写入的设备,比如IDE硬盘、SCSI硬盘、光驱等。而Character型设备文件常指定直接读写,没有缓冲区的设备,比如并口、虚拟控制台等。Socket(网络插件)型设备文件指定的是网络设备访问的BSD socket 接口。 设备文件都放在/dev目录下,比如硬盘就是用/dev/hd*来表示,/dev/hda表示第一个IDE 接口的主设备,/dev/hda1表示第一个硬盘上的第一个分区;而/dev/hdc 表示第二个IDE接口的主设备。对于Block和Character型设备,使用主(Major)和辅(minor)设备编号来描述设备。主设备编号来表示某种驱动程序,同一个设备驱动程序模块所控制的所有设备都有一

Linux设备驱动程序举例

Linux设备驱动程序设计实例2007-03-03 23:09 Linux系统中,设备驱动程序是操作系统内核的重要组成部分,在与硬件设备之间 建立了标准的抽象接口。通过这个接口,用户可以像处理普通文件一样,对硬件设 备进行打开(open)、关闭(close)、读写(read/write)等操作。通过分析和设计设 备驱动程序,可以深入理解Linux系统和进行系统开发。本文通过一个简单的例子 来说明设备驱动程序的设计。 1、程序清单 //MyDev.c 2000年2月7日编写 #ifndef __KERNEL__ #define __KERNEL__//按内核模块编译 #endif #ifndef MODULE #define MODULE//设备驱动程序模块编译 #endif #define DEVICE_NAME "MyDev" #define OPENSPK 1 #define CLOSESPK 2 //必要的头文件 #include //同kernel.h,最基本的内核模块头文件 #include //同module.h,最基本的内核模块头文件 #include //这里包含了进行正确性检查的宏 #include //文件系统所必需的头文件 #include //这里包含了内核空间与用户空间进行数据交换时的函数宏 #include //I/O访问 int my_major=0; //主设备号 static int Device_Open=0; static char Message[]="This is from device driver"; char *Message_Ptr; int my_open(struct inode *inode, struct file *file) {//每当应用程序用open打开设备时,此函数被调用 printk ("\ndevice_open(%p,%p)\n", inode, file); if (Device_Open) return -EBUSY;//同时只能由一个应用程序打开 Device_Open++; MOD_INC_USE_COUNT;//设备打开期间禁止卸载 return 0; } static void my_release(struct inode *inode, struct file *file)

触摸屏接口硬件编写驱动程序

尽管触摸屏正在迅速普及开来,但大多数开发人员以前从来没有开发过触摸屏产品。本文详细介绍了触摸屏产品的设计步骤,指导读者了解使触摸屏首次工作需要的软硬件细节。 触摸屏如今随处可见。工业控制系统、消费电子产品,甚至医疗设备上很多都装备了触摸屏输入装置。我们平时不经意间都会用到触摸屏。在ATM机上取款、签署包裹,办理登机手续或查找电话号码时都可能会用到触摸屏。 本文介绍了二种较新的CPU,它们都内建了对触摸屏输入的支持。本文将介绍如何编写软件驱动程序,从而能够使用这些微处理器配置、校准触摸屏以及对触摸屏输入持续响应。最终将提供可免费下载和使用的工作代码,作为读者进一步设计的基础。 触摸屏作为输入手段的优点和缺点 没有一种输入方式是十全十美的,对某些特定的应用和产品类型来说,触摸屏不是最好的输入手段。为了让读者清楚的了解触摸屏的特性,下面先概括使用触摸屏作为输入手段的优点和缺点。 首先是优点:触摸屏不可否认的具有酷的感觉,立刻就能使产品的使用变得更有乐趣。同时触摸屏也非常直观。当用户想要选择A选项时,他伸出手指碰一下A 选项就可以了。这还不够直观吗?连两岁的婴儿都知道怎样伸手去触摸他(或她)想要的东西。 最后要说的是,触摸屏作为输入装置和系统固定在了一起。如果用户忘记遥控器或鼠标放的位置,就会无法进行输入。而如果具有触摸屏的设备放在用户前面,用户马上就可以用触摸屏进行输入。 再说缺点,触摸屏可能会在不合适的场合下被错误的使用。这里我是指对安全性要求严格的设备,对于这些设备,如果没有适当的预防措施,使用触摸屏会非常危险。下面我将概括一些最明显的潜在的问题,如果读者想作更进一步的了解,可以参考更多的资料。 第一个问题是视差,即屏幕上看到的对象的位置与其在触摸面板上的实际有效位置之间的差异。图1说明了这个问题。我能想到的最佳例子是典型的“免下 车”ATM机。这种ATM机不会根据汽车的高度升高或降低自己的高度,因此如果你坐在较高的SUV或卡车里,那么你就会从抬高的位置俯视显示屏。为了保护昂贵的显示器件免受恶意破坏,ATM机都会在用户和显示屏之间放置几层强化玻璃。 触摸屏是不能这样保护的。如果真这样做的话,用户就无法进行触摸了。因此触摸屏放在表层上,而显示屏放在表层下的几层玻璃后面。这就造成了触摸层和显示层之间的物理隔离。如果用户以某个角度观看屏幕,就意味着用户按压触摸屏进行选择的位置会与用户接口软件预期的输入位置之间存在一定的距离偏差。

电脑接口大全【图解】

左边是带颜色标示的PS/2接口,右边的没有颜色标示 PS/2是一种古老的接口,广泛用于键盘和鼠标的连接。现在的PS/2接口一般都带有颜色标示,紫色用于连接键盘,绿色用于连接鼠标。 有些主板上的PS/2接口可能没有颜色标示,别担心,插错接口并不会损坏设备,但此时鼠标键盘将无法工作,电脑也可能无法启动,很简单,将鼠标键盘对调一下接口肯定就对了。 前面提到的USB - PS/2转接器 VGA显示接口 显卡上的VGA显示接口 显示器使用一种15针Mini-D-Sub(又称HD15)接口通过标准模拟界面连接到PC上。通过合适的转接器,你也可以将一台模拟显示器连接到DVI-I界面上。VGA接口传输红、绿、蓝色值信号(RGB)以及水平同步(H-Sync)和垂直同步(V-Sync)信号。 显示信号线上的VGA接头电脑 新款显卡一般都提供2个DVI接口,可使用一种DVI-VGA转接器来在两种接口之间转换。

术语表:VGA = Video Graphics Array 视频图像阵列 DVI显示接口 DVI是一种主要针对数字信号的显示界面,这种界面无需将显卡产生的数字信号转换成有损模拟信号,然后再在数字显示设备上进行相反的操作。数字TDMS信号的优点还包括允许显示设备负责图像定位以及信号同步工作。 一块具备两个DVI端口的显卡,可同时连接两个(数字)显示器 因为数字显示取代模拟显示的进程还比较缓慢,目前这两种技术还处于并存阶段,现在的显卡通常可以支持双显示器。广泛使用的DVI-I接口可以同时支持模拟和现实信号。而少见的多的DVI-D接口只能输出数字信号,无法输出任何模拟信号。许多显卡以及部分显示器都提供了DVI-I - VGA转接器,这样那些只提供15针D-Sub-VGA接头的老显示器也可以在DVI-I接口上继续工作。 DVI接口类型及其阵脚分布(显卡上最经常使用的是DVI-I) 术语表:DVI = Digital Visual Interface 数字视觉接口硬 RJ45,用于LAN和ISDN: 有线网络主要使用我们都很熟悉的双绞线进行互连。现在,千兆以太网正在逐步

开发接口文档-API文档模板

XXX项目接口文档版本控制信息 获取所有字段 获取所有字段 请求地址:/session/field/findAll 请求参数 响应

请求例子:响应例子:{"code":"10000","exception":null,"isSuccess":true,"message":"成功,系统处理正常! ","page":0,"pageSize":0,"returnObject":null,"returnValue":{"types":null,"villages":null,"companys":[{"iconColour":"","iconSize":0,"ico nStyle":"","id":4,"name":"XX"},{"iconColour":"","iconSize":0,"iconStyle":"","id":5,"name":"XX"},{"iconColour":"","iconSize":0,"iconSty le":"","id":7,"name":"XX"}]},"totals":0} 文件上传 文件上传(ajax) 请求地址:/session/file/upload 请求参数 响应 请求例子:var formData = new FormData(); ("file", [0]); $.ajax({ url : routePath + "/session/file/upload", type : 'POST', data : formData,

processData : false, contentType : false, success : function(result) { result = (result); if == "10000"){ ('上传成功!'); $("#editHeadPortrait").val } } }); 响应例子:returnValue里包含了 fileName和filePath 字段管理-所属类型 新增所属类型 请求地址:/session/fieldType/save 请求参数 响应 请求例子:响应例子:{"code":"10000","exception":null,"isSuccess":true,"message":"成功,系统处理正常!","page":0,"pageSize":0,"returnListSize":0,"returnObject":null,"returnValue":null,"totals":0}

一个简单的演示用的Linux字符设备驱动程序.

实现如下的功能: --字符设备驱动程序的结构及驱动程序需要实现的系统调用 --可以使用cat命令或者自编的readtest命令读出"设备"里的内容 --以8139网卡为例,演示了I/O端口和I/O内存的使用 本文中的大部分内容在Linux Device Driver这本书中都可以找到, 这本书是Linux驱动开发者的唯一圣经。 ================================================== ===== 先来看看整个驱动程序的入口,是char8139_init(这个函数 如果不指定MODULE_LICENSE("GPL", 在模块插入内核的 时候会出错,因为将非"GPL"的模块插入内核就沾污了内核的 "GPL"属性。 module_init(char8139_init; module_exit(char8139_exit; MODULE_LICENSE("GPL"; MODULE_AUTHOR("ypixunil"; MODULE_DESCRIPTION("Wierd char device driver for Realtek 8139 NIC"; 接着往下看char8139_init( static int __init char8139_init(void {

int result; PDBG("hello. init.\n"; /* register our char device */ result=register_chrdev(char8139_major, "char8139", &char8139_fops; if(result<0 { PDBG("Cannot allocate major device number!\n"; return result; } /* register_chrdev( will assign a major device number and return if it called * with "major" parameter set to 0 */ if(char8139_major == 0 char8139_major=result; /* allocate some kernel memory we need */ buffer=(unsigned char*(kmalloc(CHAR8139_BUFFER_SIZE, GFP_KERNEL; if(!buffer { PDBG("Cannot allocate memory!\n"; result= -ENOMEM;

驱动程序的接口设计

驱动程序的接口设计 WinCE下的驱动皆以动态链接库的形式存在。驱动实现中可以调用所有的标准API。WinCE的两种驱动模型——本机驱动模型和流接口驱动模型——其中本机驱动模型用于低级、内置设备,实现一组特定的接口函数;而流接口驱动模型是基本的驱动类型,提供一组通用设备接口,适用于多种设备。本设计采用的ADC驱动为数据采集驱动,是整个数据采集系统的核心。首先介绍几个流接口驱动的接口函数: (1)ADC_Init: 函数原型:DWORD ADC_Init(LPCTSTR Identifier) 功能描述:软件资源初始化,硬件地址空间映射,硬件初始化,中断注册。 参数描述:Identifier为字符串指针,指向本驱动在注册表标识符路径键值。 实现要点:本函数的关键部分在于对硬件地址空间的映射,通Virtualalloc,Viirtualcopy将I/O寄存器、中断寄存器、PWM寄存器和存储器地址空间映射到系统内存空中去;此外还要对硬件进行系统启动后的第一次初始化,包括中断硬件初始化和注册、fifo的清零和采集的禁止等。注意为保证系统的稳定和低功耗,在本函数运行后,数据采集器处于禁止中断和电源关闭状态。 具体使用:ADC_Init会把设备内容指针传递给ADC_Open。 (2)ADC_Deinit: 函数原型:BOOL ADC_Deinit(PADC_Info pContext) 功能描述:软件资源释放,硬件反初始化,中断屏蔽。 参数描述:pContext是驱动软件结构体指针。 实现要点:本函数为ADC_Init的逆向操作。 具体使用:释放了ADC_Init中分配的资源。 (3)ADC_Open: 函数原型:DWORD ADC_Open(DWORD pContext,DWORD AccessCode,DWORD ShareMode) 功能描述:打开设备,AD上电,禁止中断,禁止触发,清除FIFO,数据缓冲区初始化。 参数描述:pContext是驱动软件结构体指针;AccessCode为读写访问权限。 制模式码:ShareMode为共享访问权限控制模式码。 应用接口:CreateFile 实现要点:本函数主要功能是开启设备电源,并确保其初始化状态可靠,因此其中部分操作与系统初始化阶段类似。注意在本操作结束后,采集器仍处于禁

USB驱动程序安装说明

USB编程电缆驱动程序安装说明 概述 USB编程电缆或USB接口产品是通过将电脑的USB接口模拟成传统的串行口(通常为COM3),从而使用现有的编程软件或通信软件,通过编程电缆与PLC 等设备的传统接口进行通信。 功能 ●支持的操作系统Windows2000/Windows XP ●完全兼容USB 2.0规范 ●USB总线供电(非隔离产品)、或USB总线供电与PLC的编程口同时供 电(隔离型产品) ●波特率:300bps~1Mbps自动适应 ●每台PC只支持一个USB接口转换产品(如一台电脑需使用多个USB 接口产品,需为各个USB接口产品设置不同的序列号,请咨询生产厂家 索取序列号设置工具软件) 系统要求 请在使用USB编程电缆之前确认你的电脑是IBM PC兼容型并具备以下最低系统要求: ●Intel兼容586DX4-100MHz中央处理器或更高 ●一个标准的USB接口(4-pin A型插座) ●运行操作系统为Windows2000或Windows XP 驱动程序的安装 驱动程序的安装非常简单,只需按提示进行即可,以Windows XP为例,按以下步骤进行: 1、打开将要连接USB编程电缆或USB接口产品的电脑电源,并确认电脑 的USB口已经启动并正常工作。 2、将USB编程电缆或USB接口产品插入电脑的USB接口,Windows将检 测到设备并运行添加新硬件向导帮助你设置新设备,插入驱动程序光盘 并单击下一步继续。 如果Windows没有提示找到新硬件,那么在设备管理器的硬件列表中, 展开“通用串行总线控制器”,选择带问号的USB设备,单击鼠标右键 并运行更新驱动程序。

最全的电脑各种接口接法讲解

https://www.doczj.com/doc/9715180944.html, USB接法 一、概述 因为每个USB接口能够向外设提供+5V500MA的电流,当我们在连接板载USB接口时,一定要严格按照主板的使用说明书进行安装。绝对不能出错,否则将烧毁主板或者外设。相信有不少朋友在连接前置USB插线时也发生过类似的“冒烟事件”,因此到现在我都怕一不小心把自己的U盘在别人的机器上被烧了,所以在使用U盘拷文件时,一直都使用键盘口附近后置的USB接口,因为主板集成的接口安全,不会有电源接反的可能。 今天客户打电话投诉说自己的电脑等了半个多月才修好,可把自己的移动硬盘 往上面一接,屏幕上闪了一下发现新硬件,然后移动硬盘就没有动静了,再把移动硬盘接到办公室的电脑里也不能用了。当时我一听头就嗡的一下,马上派人上门检查,结果当用我自己做的测试线接到后置的USB接口,指示灯亮,但接到前置就根本不亮。拆机一看,果真接反了。后面的事就不用说了...。 由此前置USB数据线接反的严重性大家应该都知道了,但是如何防止类似的情况发生呢,这就需要我们能够准确判别前置USB线的排列顺序,可以正确连接前置USB接线。新机器倒还可以,有使用手册,翻一翻就可以了。但是旧主板呢,拿去修理的机器呢?没有主板手册怎么办?到网上下载主板的使用手册,太浪费时间了,更何况也不一定能够找到该型号主板的接线图。不过,如果我们晓得USB接口的基本布线结构,那问题不是就迎刃而解了吗。 二、USB接口实物图 主机端: 接线图: VCC Data- Data+ GND 实物图: 设备端: 接线图: VCC GND Data-

三、市面上常见的USB接口的布线结构 这两年市面上销售的主板,板载的前置USB接口,使用的都是标准的九针USB接口,第九针是空的,比较容易判断。但是多数品牌电脑使用的都是厂家定制的主板,我们维修的时候根本没有使用说明书;还有像以前的815主板,440BX,440VX主板等,前置USB的接法非常混乱,没有一个统一的标准。当我们维修此类机器时,如何判断其接法呢? 现在,我把市面上的比较常见的主板前置USB接法进行汇总,供大家参考。(说明:■代表有插针,□代表有针位但无插针。) 1、六针双排 这种接口不常用,这种类型的USB插针排列方式见于 精英 P6STP-FL(REV:1.1)主板,用于海尔小超人766主机。其电源正和电源负为两个前置USB接口共用,因此前置的两个USB接口需要6根线与主板连接,布线如下表所示。 ■DATA1+ ■DATA1- ■VCC ■DATA2- ■DATA2+ ■GND 2、八针双排 这种接口最常见,实际上占用了十针的位置,只不过有两个针的位置是空着的,如精英的P4VXMS(REV:1.0)主板等。该主板还提供了标准的九针接法,这种作是为了方便DIY在组装电脑时连接容易。 ■VCC ■DATA- ■DATA+ □NUL ■GND ■GND □NUL ■DATA+ ■DATA- ■VCC 微星 MS-5156

项目接口文档

接口使用说明书 2016年9月

版本控制文档信息 文档变更记录

目录 1.接口概述 (4) 1.1. 概述 (4) 1.2. 基本规则 (4) 1.2.1. 域名 (4) 1.2.2. 通用接口调用参数说明 (4) 2.接口定义 (6) 2.1. 登录注册 (6) 2.1.1. 登录接口 (6) 2.1.1.1. 账号密码登录 (6) 2.1.1.2. 微信登录............................................................................. 错误!未定义书签。 2.1.2. 注册和修改接口..................................................................... 错误!未定义书签。 2.1.2.1. 完善个人信息接口............................................................. 错误!未定义书签。 2.1.2.2. 获取个人资料..................................................................... 错误!未定义书签。 2.1.2. 3. 上传/修改企业信息 ........................................................... 错误!未定义书签。 2.1.2.4. 上传/修改工作经历 ........................................................... 错误!未定义书签。 2.1.2.5. 设置/修改提现密码 ........................................................... 错误!未定义书签。 2.1. 3. 短信部分接口......................................................................... 错误!未定义书签。 2.1. 3.1. 发送短信验证码接口......................................................... 错误!未定义书签。 2.1.4. 服务部分接口......................................................................... 错误!未定义书签。 2.1.4.1. 上传/修改个人服务信息 ................................................... 错误!未定义书签。 2.1.4.2. 获取服务列表..................................................................... 错误!未定义书签。 2.1.4. 3. 获取服务详情..................................................................... 错误!未定义书签。 2.1.4.4. 评价列表(全部服务或单个服务) ...................................... 错误!未定义书签。 2.1.4.5. 预约..................................................................................... 错误!未定义书签。 2.1.4.6. 服务评价............................................................................. 错误!未定义书签。 2.1.5. 我的账户................................................................................. 错误!未定义书签。 2.1.5.1. 获取用户收入/支出记录 ................................................... 错误!未定义书签。 2.1.5.2. 分页获取收入/支出记录 ................................................... 错误!未定义书签。 2.1.5. 3. 添加收入/支出记录 ........................................................... 错误!未定义书签。 2.1.6. 红包部分接口......................................................................... 错误!未定义书签。 2.1.6.1. 领取红包............................................................................. 错误!未定义书签。 2.1.6.2. 发放红包............................................................................. 错误!未定义书签。 2.1.7. 精英汇部分接口..................................................................... 错误!未定义书签。 2.1.7.1. 获取精英列表..................................................................... 错误!未定义书签。 2.1.7.2. 精英详情............................................................................. 错误!未定义书签。 2.1.8. 任务接口................................................................................. 错误!未定义书签。 2.1.9. 其他接口................................................................................. 错误!未定义书签。 2.1.9.1. 消息..................................................................................... 错误!未定义书签。 2.1.9.2. 省市区获取......................................................................... 错误!未定义书签。 2.1.9. 3. 行业类型获取..................................................................... 错误!未定义书签。 2.1.9.4. 上传多媒体资源................................................................. 错误!未定义书签。

嵌入式系统接口设计与Linux驱动程序开发

嵌入式系统接口设计和Linux驱动程序开发 书名:嵌入式系统接口设计和Linux驱动程序开发 作者:刘淼 出版社:北京航天航空大学出版社 ISBN:9787810778619 定价:39.00 元 出版日 2006-5-1 期: 编辑推荐 Linux是源码开放的操作系统,它发展迅速,爱好者众多,同时也是主流的嵌入式操作系统之一。以ARM 为核心的处理器使用广泛,成本低廉,软件支持好,也是当今市场占有率最高的32位嵌入式处理器。本书Linux和ARM处理器平台为例,结合两大主流软件和硬件,讲述嵌入系统开发的相关知识,是对深入学习嵌入式系统很有借鉴意义的书。 内容简介 本书针对ARM处理器为核心的主流嵌入式系统平台,主要讲述嵌入式Linux驱动程序的设计和开发过程。内容同时涵盖嵌入式系统的软硬件两个方面:一方面是嵌入式系统常用的硬件接口时序、电气特性等内容的分析;另一方面讲述对应硬件的Linux驱动程序实现方法。本书共分为16章。第1、2章介绍嵌入式系统和Linux驱动程序的基础性知识。从第3章开始,详细讲述硬件平台及其对应的Linux驱动程序。硬件包括I/O口、CAN总线、触摸屏、I2CPS/2、异步串口、音频、显示、IDE、PCMCIA、USB、以太网以及Flash 的使用等内容。软件涉及针对上述硬件的各种驱动程序在Linux下的体系结构,Linux的字符设备、块设备和网络设备驱动程序,ARM Linux的中断处理,BootLoader和内核的启动过程等。 本书可作为机器人技术、机电控制系统、信息家电、工业控制、手持设备、智能玩具、医疗仪器等方面嵌入式系统开发和使用的参考书,也可作为高等院校有关嵌入式系统教学的本科生或研究生的教材。 作者简介 刘焱,吉林省吉林市人。2000年开始从事嵌入式系统方面的研发工作,参加过多项国家863、自然基金研究项目,熟练掌握ARM等RISC微处理器系统的硬件设计及LinuxWinCEVxWorks等操作系统的软件设计.尤其擅长硬件接口和驱动程序等系统底层架构设计。先后主持过基于S3C4480、S3C2410、PXA270等多款嵌入式教学实验平台及基于HMS30C7202.AT91 RM9200的工业测控系统的开发工作,作为主要研究人员完成的嵌入式数控系统已在企业成功使用。曾担任过清华大学软件学院、北京航空航天大学软件学院嵌入式系统课程的实验教学工作及南开大学软件学院的嵌入式系统专业课程教学工作。现任中国电子学会嵌入式系统培训中心ESTC认证讲师。 目录 第1章典型的嵌入式系统体系结构 1.1嵌入式系统概述1 1.2嵌入式系统的组成1 1.2.1嵌入式平台的硬件架构2 1.2.2板级支持包和嵌入式系统2 1.2.3嵌入式系统上的使用程序3 1.3嵌入式系统的开发流程和优势3 1.4嵌入式系统的方案选择5

USB适配器驱动程序安装说明

USB适配器驱动程序安装说明 概述 USB适配器是通过将电脑的USB接口模拟成传统的串行口(通常为COM3或COM4),从而使之能使用现有的编程软件或通信软件,通过适配器与PLC、MMI等设备的传统接口进行通信。 功能 ●支持的操作系统Windows2000/Windows XP ●完全兼容USB V1.1、USB2.0、USB CDC V1.1和USB CDC V2.0规范 ●USB总线供电(非隔离型)、或USB总线供电与PLC的编程口同时供电 (隔离型) ●波特率:300bps~1Mbps自动适应 系统要求 请在使用USB适配器之前确认你的电脑是IBM PC兼容型并具备以下最低 系统要求: ●Intel兼容586DX4-100MHz中央处理器或更高 ●一个标准的USB接口(4-pin A型插座) ●运行操作系统为Windows2000或Windows XP 驱动程序的安装 驱动程序的安装非常简单,只需按提示进行即可,以Windows XP为例,按以下步骤进行: 1、启动所需连入的主机,进入系统。 2、将USB适配器连入主机的USB埠,系统将检测到设备并运行添加新硬 件向导帮助你设置新设备,插入驱动程序光盘并单击下一步继续。 如果Windows没有提示找到新硬件,那么在设备管理器的硬件列表中, 展开“通用串行总线控制器”,选择带问号的USB设备,单击鼠标右键 并运行更新驱动程序。 3、Windows将检测到安装信息,显示“USB-Serial Controller”设备,

4、选中安装驱动文件的路径,让Windows拷贝驱动程序文件到你的硬盘。 5、Windows XP 系统时,有可能提示下图要求认证,此时点击进入下 一步即可

(完整版)电脑接口大全【图解】

每台电脑,无论台式机还是笔记本,里里外外都有许多接口和插槽,你全都认识吗?也许你已经对USB、PS/2、VGA等常用接口非常熟悉,但是你知道SCAR、T HDM,I 抑或USB接口分为Type A、Type B 等类型吗?总之这是一篇主要面对电脑初学者的文章,但那些有经验的用户也许也能从本文学到一些新知识 第一部分外部接口:用于连接各种PC外设 USB USB(Universal Serial Bus 通用串行总线)用于将鼠标、键盘、移动硬盘、数码相机、VoIP 电话(Skype)或打印机等外设等连接到PC。理论上单个USBh ost 控制器可以连接最多127 个设备。

3 X1 H8 g) q6 [5 y# `3 W0 L 硬件技术、网络技术、病毒安全、休闲娱乐, 软

件下载USB目前有两个版本,USB1.1 的最高数据传输率为12Mbps,USB2.0则提高到480Mbps。注意:二者的物理接口完全一致,数据传输率上的差别完全由PC 的USBh ost 控制器以及USB设备决定。USB 可以通过连接线为设备提供最高5V,500mA的电力。 接口有 3 种类型:- Type A :一般用于PC Mini-一般用于数码相机、数码摄像机、测量仪器以及 左边接头为Type A(连接PC),右为Type B(连接设备) USB Mini USB延长线,一般不应长于 5 米

请认准接头上的USB标志 USB分离线,每个端口各可以得到5V 500mA的电力。移动硬盘等用电大户可以使用这种线来从第二个USB端口获得额外电源 ( 500+500=1000m)A 你见过吗:USB接口的电池充电器

实时数据库与驱动程序开发接口-解析

实时数据库与驱动程序开发接口 V1.0 2006/12/29发布 1引言 根据整个组态的结构描述,在驱动程序与实时数据库之间交换的内容包括采集的实时数据及由实时数据库向驱动发送的控制命令串,驱动程序要求实时数据库或其他驱动支持的功能。 2实现方式 具体的实现方式是能过共享内存的方式进行数据传送。系统驱动所使用的共享内存全部编号使用,编号从0开始顺序递增,不同的驱动使用不同的共享内存编号,一般一个驱动使用一个共享内存,特殊情况下一个驱动可以使用一个以上的共享内存号。系统提供若干函数对共享内存的创建及使用进行支持。并且提供完整的温巡驱动程序,使用纯C语言编写。二次开发人员可以阅读,参照完成其他驱动的编写工作。另外对每一个驱动的开发需要在drive目录下建立一个单独的文件存储驱动的应用程序与设置文件.以omron为例,需在drive下建立omron 目录.对每一个驱动程序写一个readme.txt文件和一个config.txt文件来描述开发的目的及驱动的用法及驱动程序的参数设置. 系统占用的共享享内存编号有如下几个, 其他程序请不要占用. 100 声音驱动使用 102 短信程序使用 103 电话语音报警使用 80web驱动使用 3驱动程序编写说明

3.1 数据区 驱动程序采集的量一般分为两种形式一种是实时数据量如遥信,遥测与遥脉等. 另一种类型是结构量,如SOE, 保护动作记录等。 实时数据量采用0 - 1999进行编号, 驱动程序开发人员可自行安排其中的某一段为遥信,遥测或遥脉, 例如0 - 100 为遥信, 101-200 为遥脉, 201 - 300 为遥测.对于遥信多的,将更多的编号分配给遥信,对于遥测多的将更多的编号分配给遥测。采集上来的量在组态的参数配置中按驱动编写的情况进行配置. 3.2 上传结构变量 结构型变量采用如下方法进行传送,系统提供若干个结构串位置,当将指定形式的若干个结构串放入结构串中时,同时将串个数告诉实时数据库。则实时数据库程序读入所有的串,并根据指定的格式进行存盘操作或命令操作。结构串的格式一般为一个特征码附加若干有效字串参数。 3.3 命令区 驱动程序从实时数据库中接收的内容一般是命令串,命令串中包括命令特征码及命令附带的数据,当收到退出命令时驱动程序应自动安全地退出. 退出命令是命令字符串"EXIT"。 3.4 下行结构变量 下传结构变量一般是由实时数据库传送到驱动程序的下行结构变量。接收下行结构变量的程序一般有声音报警,电话报警,及调度程序等。 4类接口说明 4.1 支持函数文件列表 1)ramdrive.h 2)ramdrive.c 4.2 使用步骤 1)使用方法bool CreateRam( int ramid ); 完成共享内存的建立,参数为数据共享区的编号. 2)设置实时数据 void SetValue( int id, int iValue ) id 编号iValue 实时值

电脑组装各接口以及主机内部各种线的连接方法图解

电脑组装各接口以及主机内部各种线的连接方 法图解 Coca-cola standardization office【ZZ5AB-ZZSYT-ZZ2C-ZZ682T-ZZT18】

电脑组装各接口以及主机内部各种线的连接方法图解 有时候我们在组装一台电脑回家,总会遇到一些小问题需要我们自已来解决,然而主板上面的众多连接线我们如何来区分它,怎么认识主机箱内的所有硬件设备呢,及连接线呢主机内各线的连接方法图解 主机外连线 主机外的连线虽然简单,但我们要一一弄清楚哪个接口插什么配件、作用是什么。对于这些接口,最简单的连接方法就是对准针脚,向接口方向平直地插进去并固定好。 电源接口(黑色):负责给整个主机电源供电,有的电源提供了开关,笔者建议在不使用电脑的时候关闭这个电源开关(图1)。 PS/2接口(蓝绿色):PS/2接口有二组,分别为下方(靠主板PCB方向)紫色的键盘接口和上方绿色的鼠标接口(图2),两组接口不能插反,否则将找不到相应硬件;在使用中也不能进行热拔插, 否则会损坏相关芯片或电路。 USB接口(黑色):接口外形呈扁平状,是家用电脑外部接口中唯一支持热拔插的接口,可连接所有采用USB接口的外设,具有防呆设计,反向将不能插入。 LPT接口(朱红色):该接口为针角最多的接口,共25针。可用来连接打印机,在连接好后应扭紧接口两边的旋转螺丝(其他类似配件设备的固定方法相同)。 COM接口(深蓝色):平均分布于并行接口下方,该接口有9个针脚,也称之为串口1和串口2。可连接游戏手柄或手写板等配件。 Line Out接口(淡绿色):靠近COM接口,通过音频线用来连接音箱的Line接口,输出经过电脑处理的各种音频信号(图3)。 Line in接口(淡蓝色):位于Line Out和Mic中间的那个接口,意为音频输入接口,需和其他音频专业设备相连,家庭用户一般闲置无用。 Mic接口(粉红色):粉红色是MM喜欢的颜色,而聊天也是MM喜欢的。MIC接口可让二者兼得。MIC接口与麦克风连接,用于聊天或者录音。 显卡接口(蓝色):蓝色的15针D-Sub接口是一种模拟信号输出接口(图4),用来双向传输视频信号到显示器。该接口用来连接显示器上的15针视频线,需插稳并拧好两端的固定螺丝,以让插针与 接口保持良好接触。 MIDI/游戏接口(黄色):该接口和显卡接口一样有15个针脚,可连接游戏摇杆、方向盘、二合一的双人游戏手柄以及专业的MIDI键盘和电子琴。 网卡接口:该接口一般位于网卡的挡板上(目前很多主板都集成了网卡,网卡接口常位于USB接口上端)。将网线的水晶头插入,正常情况下网卡上红色的链路灯会亮起,传输数据时则亮起绿色的数 据灯。 ·主机内连线 主机内连线

相关主题
文本预览
相关文档 最新文档