forked from duxing2007/ldd3-examples-3.x
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
add9ea3
commit b4a194b
Showing
97 changed files
with
13,114 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
|
||
|
||
Unless otherwise stated, the source code distributed with this book | ||
can be redistributed in source or binary form so long as an | ||
acknowledgment appears in derived source files. The citation should | ||
list that the code comes from BOOK by AUTHOR, published by O'Reilly & | ||
Associates. This code is under copyright and cannot be included in | ||
any other book, publication, or educational product without permission | ||
from O'Reilly & Associates. No warranty is attached; we cannot take | ||
responsibility for errors or fitness for use. | ||
|
||
|
||
There are a few exception to this licence, however: a few sources | ||
herein are distributed according to the GNU General Public License, | ||
version 2. You'll find a copy of the license in | ||
/usr/src/linux/COPYING, and in other places in your filesystem. The | ||
affected source files are: | ||
|
||
pci/pci_skel.c | ||
tty/tiny_serial.c | ||
tty/tiny_tty.c | ||
usb/usb-skeleton.c | ||
|
||
The files in ./pci ./tty and ./usb inherit the GPL from the kernel | ||
sources, as most of their code comes straight from the kernel | ||
(usb-skeleton.c being part of the kernel source tree directly.) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
|
||
SUBDIRS = misc-progs misc-modules \ | ||
skull scull scullc sculld scullp scullv sbull snull\ | ||
short shortprint pci simple usb tty lddbus | ||
|
||
all: subdirs | ||
|
||
subdirs: | ||
for n in $(SUBDIRS); do $(MAKE) -C $$n || exit 1; done | ||
|
||
clean: | ||
for n in $(SUBDIRS); do $(MAKE) -C $$n clean; done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
/* | ||
* Definitions for the virtual LDD bus. | ||
* | ||
* $Id: lddbus.h,v 1.4 2004/08/20 18:49:44 corbet Exp $ | ||
*/ | ||
|
||
//extern struct device ldd_bus; | ||
extern struct bus_type ldd_bus_type; | ||
|
||
|
||
/* | ||
* The LDD driver type. | ||
*/ | ||
|
||
struct ldd_driver { | ||
char *version; | ||
struct module *module; | ||
struct device_driver driver; | ||
struct driver_attribute version_attr; | ||
}; | ||
|
||
#define to_ldd_driver(drv) container_of(drv, struct ldd_driver, driver); | ||
|
||
/* | ||
* A device type for things "plugged" into the LDD bus. | ||
*/ | ||
|
||
struct ldd_device { | ||
char *name; | ||
struct ldd_driver *driver; | ||
struct device dev; | ||
}; | ||
|
||
#define to_ldd_device(dev) container_of(dev, struct ldd_device, dev); | ||
|
||
extern int register_ldd_device(struct ldd_device *); | ||
extern void unregister_ldd_device(struct ldd_device *); | ||
extern int register_ldd_driver(struct ldd_driver *); | ||
extern void unregister_ldd_driver(struct ldd_driver *); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
# Comment/uncomment the following line to disable/enable debugging | ||
#DEBUG = y | ||
|
||
# Add your debugging flag (or not) to CFLAGS | ||
ifeq ($(DEBUG),y) | ||
DEBFLAGS = -O -g # "-O" is needed to expand inlines | ||
else | ||
DEBFLAGS = -O2 | ||
endif | ||
CFLAGS += $(DEBFLAGS) -I$(LDDINCDIR) | ||
|
||
|
||
ifneq ($(KERNELRELEASE),) | ||
# call from kernel build system | ||
|
||
obj-m := lddbus.o | ||
|
||
else | ||
|
||
KERNELDIR ?= /lib/modules/$(shell uname -r)/build | ||
PWD := $(shell pwd) | ||
|
||
default: | ||
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) LDDINCDIR=$(PWD)/../include modules | ||
|
||
endif | ||
|
||
|
||
|
||
clean: | ||
rm -rf *.o *.ko *~ core .depend *.mod.c .*.cmd .tmp_versions .*.o.d | ||
|
||
depend .depend dep: | ||
$(CC) $(CFLAGS) -M *.c > .depend | ||
|
||
|
||
ifeq (.depend,$(wildcard .depend)) | ||
include .depend | ||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,177 @@ | ||
/* | ||
* A virtual bus for LDD sample code devices to plug into. This | ||
* code is heavily borrowed from drivers/base/sys.c | ||
* | ||
* Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet | ||
* Copyright (C) 2001 O'Reilly & Associates | ||
* | ||
* The source code in this file can be freely used, adapted, | ||
* and redistributed in source or binary form, so long as an | ||
* acknowledgment appears in derived source files. The citation | ||
* should list that the code comes from the book "Linux Device | ||
* Drivers" by Alessandro Rubini and Jonathan Corbet, published | ||
* by O'Reilly & Associates. No warranty is attached; | ||
* we cannot take responsibility for errors or fitness for use. | ||
* | ||
*/ | ||
/* $Id: lddbus.c,v 1.9 2004/09/26 08:12:27 gregkh Exp $ */ | ||
|
||
#include <linux/device.h> | ||
#include <linux/module.h> | ||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
#include <linux/string.h> | ||
#include "lddbus.h" | ||
|
||
MODULE_AUTHOR("Jonathan Corbet"); | ||
MODULE_LICENSE("Dual BSD/GPL"); | ||
static char *Version = "$Revision: 1.9 $"; | ||
|
||
/* | ||
* Respond to hotplug events. | ||
*/ | ||
static int ldd_hotplug(struct device *dev, char **envp, int num_envp, | ||
char *buffer, int buffer_size) | ||
{ | ||
envp[0] = buffer; | ||
if (snprintf(buffer, buffer_size, "LDDBUS_VERSION=%s", | ||
Version) >= buffer_size) | ||
return -ENOMEM; | ||
envp[1] = NULL; | ||
return 0; | ||
} | ||
|
||
/* | ||
* Match LDD devices to drivers. Just do a simple name test. | ||
*/ | ||
static int ldd_match(struct device *dev, struct device_driver *driver) | ||
{ | ||
return !strncmp(dev->bus_id, driver->name, strlen(driver->name)); | ||
} | ||
|
||
|
||
/* | ||
* The LDD bus device. | ||
*/ | ||
static void ldd_bus_release(struct device *dev) | ||
{ | ||
printk(KERN_DEBUG "lddbus release\n"); | ||
} | ||
|
||
struct device ldd_bus = { | ||
.bus_id = "ldd0", | ||
.release = ldd_bus_release | ||
}; | ||
|
||
|
||
/* | ||
* And the bus type. | ||
*/ | ||
struct bus_type ldd_bus_type = { | ||
.name = "ldd", | ||
.match = ldd_match, | ||
.hotplug = ldd_hotplug, | ||
}; | ||
|
||
/* | ||
* Export a simple attribute. | ||
*/ | ||
static ssize_t show_bus_version(struct bus_type *bus, char *buf) | ||
{ | ||
return snprintf(buf, PAGE_SIZE, "%s\n", Version); | ||
} | ||
|
||
static BUS_ATTR(version, S_IRUGO, show_bus_version, NULL); | ||
|
||
|
||
|
||
/* | ||
* LDD devices. | ||
*/ | ||
|
||
/* | ||
* For now, no references to LDDbus devices go out which are not | ||
* tracked via the module reference count, so we use a no-op | ||
* release function. | ||
*/ | ||
static void ldd_dev_release(struct device *dev) | ||
{ } | ||
|
||
int register_ldd_device(struct ldd_device *ldddev) | ||
{ | ||
ldddev->dev.bus = &ldd_bus_type; | ||
ldddev->dev.parent = &ldd_bus; | ||
ldddev->dev.release = ldd_dev_release; | ||
strncpy(ldddev->dev.bus_id, ldddev->name, BUS_ID_SIZE); | ||
return device_register(&ldddev->dev); | ||
} | ||
EXPORT_SYMBOL(register_ldd_device); | ||
|
||
void unregister_ldd_device(struct ldd_device *ldddev) | ||
{ | ||
device_unregister(&ldddev->dev); | ||
} | ||
EXPORT_SYMBOL(unregister_ldd_device); | ||
|
||
/* | ||
* Crude driver interface. | ||
*/ | ||
|
||
|
||
static ssize_t show_version(struct device_driver *driver, char *buf) | ||
{ | ||
struct ldd_driver *ldriver = to_ldd_driver(driver); | ||
|
||
sprintf(buf, "%s\n", ldriver->version); | ||
return strlen(buf); | ||
} | ||
|
||
|
||
int register_ldd_driver(struct ldd_driver *driver) | ||
{ | ||
int ret; | ||
|
||
driver->driver.bus = &ldd_bus_type; | ||
ret = driver_register(&driver->driver); | ||
if (ret) | ||
return ret; | ||
driver->version_attr.attr.name = "version"; | ||
driver->version_attr.attr.owner = driver->module; | ||
driver->version_attr.attr.mode = S_IRUGO; | ||
driver->version_attr.show = show_version; | ||
driver->version_attr.store = NULL; | ||
return driver_create_file(&driver->driver, &driver->version_attr); | ||
} | ||
|
||
void unregister_ldd_driver(struct ldd_driver *driver) | ||
{ | ||
driver_unregister(&driver->driver); | ||
} | ||
EXPORT_SYMBOL(register_ldd_driver); | ||
EXPORT_SYMBOL(unregister_ldd_driver); | ||
|
||
|
||
|
||
static int __init ldd_bus_init(void) | ||
{ | ||
int ret; | ||
|
||
ret = bus_register(&ldd_bus_type); | ||
if (ret) | ||
return ret; | ||
if (bus_create_file(&ldd_bus_type, &bus_attr_version)) | ||
printk(KERN_NOTICE "Unable to create version attribute\n"); | ||
ret = device_register(&ldd_bus); | ||
if (ret) | ||
printk(KERN_NOTICE "Unable to register ldd0\n"); | ||
return ret; | ||
} | ||
|
||
static void ldd_bus_exit(void) | ||
{ | ||
device_unregister(&ldd_bus); | ||
bus_unregister(&ldd_bus_type); | ||
} | ||
|
||
module_init(ldd_bus_init); | ||
module_exit(ldd_bus_exit); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
|
||
# To build modules outside of the kernel tree, we run "make" | ||
# in the kernel source tree; the Makefile these then includes this | ||
# Makefile once again. | ||
# This conditional selects whether we are being included from the | ||
# kernel Makefile or not. | ||
ifeq ($(KERNELRELEASE),) | ||
|
||
# Assume the source tree is where the running kernel was built | ||
# You should set KERNELDIR in the environment if it's elsewhere | ||
KERNELDIR ?= /lib/modules/$(shell uname -r)/build | ||
# The current directory is passed to sub-makes as argument | ||
PWD := $(shell pwd) | ||
|
||
modules: | ||
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules | ||
|
||
modules_install: | ||
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install | ||
|
||
clean: | ||
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions | ||
|
||
.PHONY: modules modules_install clean | ||
|
||
else | ||
# called from kernel build system: just declare what our modules are | ||
obj-m := hello.o hellop.o seq.o jit.o jiq.o sleepy.o complete.o \ | ||
silly.o faulty.o kdatasize.o kdataalign.o | ||
endif | ||
|
||
|
Oops, something went wrong.