<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>Somebody to Love ...</title>
	<link>http://nunorock.egloos.com</link>
	<description>Nuno's Photo Blog</description>
	<language>ko</language>
	<pubDate>Sat, 14 Oct 2006 01:09:26 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>Somebody to Love ...</title>
		<url>http://pds2.egloos.com/logo/1/200512/01/86/c0050086.jpg</url>
		<link>http://nunorock.egloos.com</link>
		<width>80</width>
		<height>59</height>
		<description>Nuno's Photo Blog</description>
	</image>
  	<item>
		<title><![CDATA[ cvs에서 binary file import 하기 ]]> </title>
		<link>http://nunorock.egloos.com/2616658</link>
		<guid>http://nunorock.egloos.com/2616658</guid>
		<description>
			<![CDATA[ 
  <div id="contents"> <p>현재 디렉토리밑에 *.doc 와 *.so 파일은 바이너리 파일로 import 하고 싶다면</p>  <p>&nbsp;% cvs import -m "Embedded System Programming on Maso" -I ! -W "*.doc -k 'b'"  -W "*.so -k 'b'" repository vendor branch<br />
</p><br />
------------------------------------------------------------------------------------------<br />
<br />
#  This file affects handling of files based on their names.<br />
#<br />
# The -t/-f  options allow one to treat directories of files<br />
# as a single file, or to  transform a file in other ways on<br />
# its way in and out of CVS.<br />
#<br />
# The  -m option specifies whether CVS attempts to merge files.<br />
#<br />
# The -k option  specifies keyword expansion (e.g. -kb for binary).<br />
#<br />
# Format of wrapper  file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers)<br />
#<br />
#&nbsp; wildcard&nbsp;&nbsp;&nbsp;  [option value][option value]...<br />
#<br />
#&nbsp; where option is one of<br />
#&nbsp; -f&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; from cvs filter&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; value: path to filter<br />
#&nbsp; -t&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; to cvs  filter&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; value: path to filter<br />
#&nbsp; -m&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; update methodology&nbsp;&nbsp;&nbsp; value:  MERGE or COPY<br />
#&nbsp; -k&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; expansion mode&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; value: b, o, kkv,  &amp;c<br />
#<br />
#&nbsp; and value is a single-quote delimited value.<br />
# For  example:<br />
*.AI -k 'b' -m 'COPY'<br />
*.ai -k 'b' -m 'COPY'<br />
*.AIFC -k 'b' -m  'COPY'<br />
*.aifc -k 'b' -m 'COPY'<br />
*.AIFF -k 'b' -m 'COPY'<br />
*.aiff -k 'b' -m  'COPY'<br />
*.au -k 'b' -m 'COPY'<br />
*.AU -k 'b' -m 'COPY'<br />
*.avi -k 'b' -m  'COPY'<br />
*.AVI -k 'b' -m 'COPY'<br />
*.bin -k 'b' -m 'COPY'<br />
*.BMP -k 'b' -m  'COPY'<br />
*.bmp -k 'b' -m 'COPY'<br />
*.bz -k 'b' -m 'COPY'<br />
*.bz2 -k 'b' -m  'COPY'<br />
*.cab -k 'b' -m 'COPY'<br />
*.class -k 'b' -m 'COPY'<br />
*.CLASS -k 'b'  -m 'COPY'<br />
*.des -k 'b' -m 'COPY'<br />
*.DLL -k 'b' -m 'COPY'<br />
*.dll -k 'b' -m  'COPY'<br />
*.doc -k 'b' -m 'COPY'<br />
*.DOC -k 'b' -m 'COPY'<br />
*.dra -k 'b' -m  'COPY'<br />
*.DWG -k 'b' -m 'COPY'<br />
*.dwg -k 'b' -m 'COPY'<br />
*.DXF -k 'b' -m  'COPY'<br />
*.dxf -k 'b' -m 'COPY'<br />
*.ear -k 'b' -m 'COPY'<br />
*.EAR -k 'b' -m  'COPY'<br />
*.EPS -k 'b' -m 'COPY'<br />
*.eps -k 'b' -m 'COPY'<br />
*.EXE -k 'b' -m  'COPY'<br />
*.exe -k 'b' -m 'COPY'<br />
*.FIG -k 'b' -m 'COPY'<br />
*.fig -k 'b' -m  'COPY'<br />
*.FM -k 'b' -m 'COPY'<br />
*.fm -k 'b' -m 'COPY'<br />
*.gif -k 'b' -m  'COPY'<br />
*.GIF -k 'b' -m 'COPY'<br />
*.gz -k 'b' -m 'COPY'<br />
*.GZ -k 'b' -m  'COPY'<br />
*.HQX -k 'b' -m 'COPY'<br />
*.hqx -k 'b' -m 'COPY'<br />
*.ico -k 'b' -m  'COPY'<br />
*.ICO -k 'b' -m 'COPY'<br />
*.ief -k 'b' -m 'COPY'<br />
*.JAR -k 'b' -m  'COPY'<br />
*.jar -k 'b' -m 'COPY'<br />
*.jpe -k 'b' -m 'COPY'<br />
*.JPE -k 'b' -m  'COPY'<br />
*.jpeg -k 'b' -m 'COPY'<br />
<br />
</div>			 ]]> 
		</description>
		<category>BRAIN</category>

		<comments>http://nunorock.egloos.com/2616658#comments</comments>
		<pubDate>Wed, 11 Oct 2006 01:25:52 GMT</pubDate>
		<dc:creator>Nuno</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Linux I2C Drivers ]]> </title>
		<link>http://nunorock.egloos.com/2542985</link>
		<guid>http://nunorock.egloos.com/2542985</guid>
		<description>
			<![CDATA[ 
  <div class="simplesect" lang="en"><p>An I2C chip driver controls the process of talking to an individual I2C device that lives on an I2C bus. I2C chip devices usually monitor a number of different physical devices on a motherboard, such as the different fan speeds, temperature values and voltages.</p><p>The struct i2c_driver structure describes a I2C chip driver. This structure is defined in the include/linux/i2c.h file. Only the following fields are necessary to create a working chip driver:</p><p>&nbsp;&nbsp;&nbsp; * struct module *owner; --set to the value THIS_MODULE that allows the proper module reference counting.<br />
&nbsp;&nbsp;&nbsp; * char name[I2C_NAME_SIZE]; --set to a descriptive name of the I2C chip driver. This value shows up in the sysfs file name created for every I2C chip device.<br />
&nbsp;&nbsp;&nbsp; * unsigned int flags; --set to the value I2C_DF_NOTIFY in order for the chip driver to be notified of any new I2C devices loaded after this driver is loaded. This field probably will go away soon, as almost all drivers set this field.<br />
&nbsp;&nbsp;&nbsp; * int (*attach_adapter)(struct i2c_adapter *); --called whenever a new I2C bus driver is loaded in the system. This function is described in more detail below.<br />
&nbsp;&nbsp;&nbsp; * int (*detach_client)(struct i2c_client *); --called when the i2c_client device is to be removed from the system. More information about this function is provided below. </p><p>The following code is from an example I2C chip driver called tiny_i2c_chip.c., which is available from the Linux Journal FTP site [ftp.ssc.com/pub/lj/listings/issue118/7252.tgz]. It shows how the struct i2c_driver structure is set up:</p><p>static struct i2c_driver chip_driver = {<br />
&nbsp;&nbsp;&nbsp; .owner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = THIS_MODULE,<br />
&nbsp;&nbsp;&nbsp; .name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "tiny_chip",<br />
&nbsp;&nbsp;&nbsp; .flags&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = I2C_DF_NOTIFY,<br />
&nbsp;&nbsp;&nbsp; .attach_adapter = chip_attach_adapter,<br />
&nbsp;&nbsp;&nbsp; .detach_client&nbsp; = chip_detach_client,<br />
};</p><p><br />
Registering a Chip Driver</p><p>To register this I2C chip driver, the function i2c_add_driver should be called with a pointer to the struct i2c_driver:</p><p>static int __init tiny_init(void)<br />
{<br />
&nbsp;&nbsp;&nbsp; return i2c_add_driver(&amp;chip_driver);<br />
}</p><p><br />
To unregister the I2C chip driver, the i2c_del_driver function should be called with the same pointer to the struct i2c_driver:</p><p>static void __exit tiny_exit(void)<br />
{<br />
&nbsp;&nbsp;&nbsp; i2c_del_driver(&amp;chip_driver);<br />
}</p><p><br />
After the I2C chip driver is registered, the attach_adapter function callback is called when an I2C bus driver is loaded. This function checks to see if any I2C devices are on this I2C bus to which the client driver wants to attach. Almost all I2C chip drivers call the core I2C function i2c_detect to determine this. For example, the tiny_i2c_chip.c driver does this:</p><p>static int <br />
chip_attach_adapter(struct i2c_adapter *adapter)<br />
{<br />
&nbsp;&nbsp;&nbsp; return i2c_detect(adapter, &amp;addr_data,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chip_detect);<br />
}</p><p><br />
The i2c_detect function probes the I2C adapter, looking for the different addresses specified in the addr_data structure. If a device is found, the chip_detect function then is called.</p><p>If you look closely at the source code, you cannot find the addr_data structure anywhere. The reason for this is it is created by the SENSORS_INSMOD_1 macro. This macro is defined in the include/linux/i2c-sensor.h file and is quite complicated. It sets up a static variable called addr_data based on the number of different types of chips that this driver supports and the addresses at which these chips typically are present. It then provides the ability to override these values by using module parameters. An I2C chip driver must provide the variables normal_i2c, normal_i2c_range, normal_isa and normal_isa_range. These variables define the i2c smbus and i2c isa addresses this chip driver supports. They are an array of addresses, all terminated by either the special value I2C_CLIENT_END or I2C_CLIENT_ISA_END. Usually a specific type of I2C chip shows up in only a limited range of addresses. The tiny_i2c_client.c driver defines these variables as:</p><p>static unsigned short normal_i2c[] = <br />
&nbsp; { I2C_CLIENT_END };<br />
static unsigned short normal_i2c_range[] = <br />
&nbsp; { 0x00, 0xff, I2C_CLIENT_END };<br />
static unsigned int normal_isa[] = <br />
&nbsp; { I2C_CLIENT_ISA_END };<br />
static unsigned int normal_isa_range[] = <br />
&nbsp; { I2C_CLIENT_ISA_END };</p><p><br />
The normal_i2c_range variable specifies that we can find this chip device at any I2C smbus address. This allows us to test this driver on almost any I2C bus driver.<br />
What to Do When the Chip Is Found</p><p>In the tiny_i2c_chip.c driver, when an I2C chip device is found, the function chip_detect is called by the I2C core. This function is declared with the following parameters:</p><p>static int <br />
chip_detect(struct i2c_adapter *adapter,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int address, int kind);</p><p><br />
The adapter variable is the I2C adapter structure on which this chip is located. The address variable contains the address where the chip was found, and the kind variable indicates what kind of chip was found. The kind variable usually is ignored, but some I2C chip drivers support different kinds of I2C chips, so this variable can be used to determine the type of chip present.</p><p>This function is responsible for creating a struct i2c_client structure that then is registered with the I2C core. The I2C core uses that structure as an individual I2C chip device. To create this structure, the chip_detect function does the following:</p><p>struct i2c_client *new_client = NULL;<br />
struct chip_data *data = NULL;<br />
int err = 0;</p><p>new_client = kmalloc(sizeof(*new_client),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GFP_KERNEL);<br />
if (!new_client) {<br />
&nbsp;&nbsp;&nbsp; err = -ENOMEM;<br />
&nbsp;&nbsp;&nbsp; goto error;<br />
}<br />
memset(new_client, 0x00, sizeof(*new_client));</p><p>data = kmalloc(sizeof(*data), GFP_KERNEL);<br />
if (!data) {<br />
&nbsp;&nbsp;&nbsp; err = -ENOMEM;<br />
&nbsp;&nbsp;&nbsp; goto error;<br />
}<br />
memset(data, 0x00, sizeof(*data));</p><p>i2c_set_clientdata(new_client, data);<br />
new_client-&gt;addr = address;<br />
new_client-&gt;adapter = adapter;<br />
new_client-&gt;driver = &amp;chip_driver;<br />
new_client-&gt;flags = 0;<br />
strncpy(new_client-&gt;name, "tiny_chip",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I2C_NAME_SIZE);</p><p>&nbsp;</p><p>First, the struct i2c_client structure and a separate local data structure (called struct chip_data) are created and initialized to zero. It is important that the i2c_client structure is initialized to zero, as the lower levels of the kernel driver core require this in order to work properly. After the memory is allocated successfully, some fields in the struct i2c_client are set to point to this specific device and this specific driver. Notably, the addr, adapter and driver variables must be initialized. The name of the struct i2c_client also must be set if it is to show up properly in the sysfs tree for this I2C device.</p><p>After the struct i2c_client structure is initialized, it must be registered with the I2C core. This is done with a call to the i2c_attach_client function:</p><p>/* Tell the I2C layer a new client has arrived */<br />
err = i2c_attach_client(new_client);<br />
if (err)<br />
&nbsp;&nbsp;&nbsp; goto error;</p><p><br />
When this function returns, with no errors reported, the I2C chip device is set up properly in the kernel.<br />
I2C and sysfs</p><p>In the 2.0, 2.2 and 2.4 kernels, the I2C code would place the I2C chip devices in the /proc/bus/i2c directory. In the 2.6 kernel, all I2C chip devices and adapters show up in the sysfs filesystem. I2C chip devices can be found at /sys/bus/i2c/devices, listed by their adapter address and chip address. For example, the tiny_i2c_chip driver loaded on a machine might produce the following sysfs tree structure:</p><p><br />
$ tree /sys/bus/i2c/<br />
/sys/bus/i2c/<br />
|-- devices<br />
|&nbsp;&nbsp; |-- 0-0009 -&gt; ../../../devices/pci0000:00/0000:00:06.0/i2c-0/0-0009<br />
|&nbsp;&nbsp; |-- 0-000a -&gt; ../../../devices/pci0000:00/0000:00:06.0/i2c-0/0-000a<br />
|&nbsp;&nbsp; |-- 0-000b -&gt; ../../../devices/pci0000:00/0000:00:06.0/i2c-0/0-000b<br />
|&nbsp;&nbsp; `-- 0-0019 -&gt; ../../../devices/pci0000:00/0000:00:06.0/i2c-0/0-0019<br />
`-- drivers<br />
&nbsp;&nbsp;&nbsp; |-- i2c_adapter<br />
&nbsp;&nbsp;&nbsp; `-- tiny_chip<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-- 0-0009 -&gt; ../../../../devices/pci0000:00/0000:00:06.0/i2c-0/0-0009<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-- 0-000a -&gt; ../../../../devices/pci0000:00/0000:00:06.0/i2c-0/0-000a<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-- 0-000b -&gt; ../../../../devices/pci0000:00/0000:00:06.0/i2c-0/0-000b<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `-- 0-0019 -&gt; ../../../../devices/pci0000:00/0000:00:06.0/i2c-0/0-0019</p><p>This shows four different I2C chip devices, all controlled by the same tiny_chip driver. The controlling driver can be located by looking at the devices in the /sys/bus/i2c/drivers directory or by looking in the directory of the chip device itself and reading the name file:</p><p>$ cat /sys/devices/pci0000:00/0000:00:06.0/i2c-0/0-0009/name <br />
tiny_chip</p><p>All I2C chip drivers export the different sensor values through sysfs files within the I2C chip device directory. These filenames are standardized, along with the units in which the values are expressed, and are documented within the kernel tree in the file Documentation/i2c/sysfs-interface (Table 1).</p><p>Table 1. Sensor Values Exported through sysfs Files<br />
temp_max[1-3]&nbsp;Temperature max value. Fixed point value in form XXXXX and should be divided by 1,000 to get degrees Celsius. Read/Write value.<br />
temp_min[1-3]&nbsp;Temperature min or hysteresis value. Fixed point value in form XXXXX and should be divided by 1,000 to get degrees Celsius. This is preferably a hysteresis value, reported as an absolute temperature, not a delta from the max value. Read/Write value.<br />
temp_input[1-3]&nbsp;Temperature input value. Read-only value.</p><p>As the information in Table 1 shows, there is only one value per file. All files are readable and some can be written to by users with the proper privileges.</p><p>The tiny_i2c_chip.c driver emulates an I2C chip device that can report temperature values. It creates the files, temp_max1, temp_min1 and temp_input1 in sysfs. The values it returns when these files are read from is incremented every time the file is read to show how to access different unique chip values.</p><p>In order to create a file in sysfs, the DEVICE_ATTR macro is used:</p><p>static DEVICE_ATTR(temp_max, S_IWUSR | S_IRUGO,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show_temp_max, set_temp_max);<br />
static DEVICE_ATTR(temp_min, S_IWUSR | S_IRUGO,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show_temp_hyst, set_temp_hyst);<br />
static DEVICE_ATTR(temp_input, S_IRUGO,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show_temp_input, NULL);</p><p><br />
This macro creates a structure that then is passed to the function device_create_file at the end of the chip_detect function:</p><p>/* Register sysfs files */<br />
device_create_file(&amp;new_client-&gt;dev, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;dev_attr_temp_max);<br />
device_create_file(&amp;new_client-&gt;dev,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;dev_attr_temp_min);<br />
device_create_file(&amp;new_client-&gt;dev, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;dev_attr_temp_input);</p><p><br />
That call creates the sysfs files for the device:</p><p>/sys/devices/pci0000:00/0000:00:06.0/i2c-0/0-0009<br />
|-- detach_state<br />
|-- name<br />
|-- power<br />
|&nbsp;&nbsp; `-- state<br />
|-- temp_input<br />
|-- temp_max<br />
`-- temp_min</p><p>The file name is created by the I2C core, and the files detach_state and power/state are created by the driver core.</p><p>But, let's go back to the DEVICE_ATTR macro. That macro wants to know the name of the file to be created, the mode of the file to be created, the name of the function to be called when the file is read from and the name of the function to be called when the file is written to. For the file temp_max, this declaration was:</p><p>static DEVICE_ATTR(temp_max, S_IWUSR | S_IRUGO,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show_temp_max, set_temp_max);</p><p><br />
The function called when the file is read from is show_temp_max. This is defined, as are many sysfs files, with another macro that creates a function:</p><p>#define show(value) <br />
static ssize_t <br />
show_##value(struct device *dev, char *buf)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; struct i2c_client *client = to_i2c_client(dev);<br />
&nbsp;&nbsp;&nbsp; struct chip_data *data =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i2c_get_clientdata(client);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; chip_update_client(client);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return sprintf(buf, "%d
", data-&gt;value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
show(temp_max);<br />
show(temp_hyst);<br />
show(temp_input);</p><p><br />
The reason this function is created with a macro is that it is quite simple to create other sysfs files that do almost the same thing, with different names and that read from different variables, without having to duplicate code. This single macro creates three different functions to read from three different variables from the struct chip_data structure.</p><p>In this function, the struct device * is converted into a struct i2c_client *. Then the private struct chip_data * is obtained from the struct i2c_client *. After that the chip data is updated with a call to chip_update_client. From there, the variable that has been asked for is printed into a buffer and returned to the driver core, which then returns it to the user:</p><p><br />
$ cat /sys/devices/pci0000:00/0000:00:06.0/i2c-0/0-0009/temp_input<br />
1</p><p>The chip_update_client increments all values by one every time it is called:</p><p>static void <br />
chip_update_client(struct i2c_client *client)<br />
{<br />
&nbsp;&nbsp;&nbsp; struct chip_data *data = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i2c_get_clientdata(client);</p><p>&nbsp;&nbsp;&nbsp; down(&amp;data-&gt;update_lock);<br />
&nbsp;&nbsp;&nbsp; dev_dbg(&amp;client-&gt;dev, "%s
", __FUNCTION__);<br />
&nbsp;&nbsp;&nbsp; ++data-&gt;temp_input;<br />
&nbsp;&nbsp;&nbsp; ++data-&gt;temp_max;<br />
&nbsp;&nbsp;&nbsp; ++data-&gt;temp_hyst;<br />
&nbsp;&nbsp;&nbsp; data-&gt;last_updated = jiffies;<br />
&nbsp;&nbsp;&nbsp; data-&gt;valid = 1;<br />
&nbsp;&nbsp;&nbsp; up(&amp;data-&gt;update_lock);<br />
}</p><p><br />
So, all subsequent requests for this value are different:</p><p>$ cat /sys/devices/pci0000:00/0000:00:06.0/i2c-0/0-0009/temp_input<br />
2<br />
$ cat /sys/devices/pci0000:00/0000:00:06.0/i2c-0/0-0009/temp_input<br />
3</p><p>The set_temp_max function also is created from a macro to allow variables to be written to:</p><p>#define set(value, reg)&nbsp;<br />
static ssize_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
set_##value(struct device *dev,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *buf, size_t count)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; struct i2c_client *client = to_i2c_client(dev);<br />
&nbsp;&nbsp;&nbsp; struct chip_data *data =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i2c_get_clientdata(client);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; int temp = simple_strtoul(buf, NULL, 10);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; down(&amp;data-&gt;update_lock);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; data-&gt;value = temp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; up(&amp;data-&gt;update_lock);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return count;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
set(temp_max, REG_TEMP_OS);<br />
set(temp_hyst, REG_TEMP_HYST);</p><p><br />
Just like the show functions, this function converts the struct device * to a struct i2c_client *, and then the private struct chip_data * is found. The data the user provides then is turned into a number with a call to simple_strtoul and is saved into the proper variable:</p><p>$ cat /sys/devices/pci0000:00/0000:00:06.0/i2c-0/0-0009/temp_max<br />
1<br />
$ echo 41 &gt; /sys/devices/pci0000:00/0000:00:06.0/i2c-0/0-0009/temp_max<br />
$ cat /sys/devices/pci0000:00/0000:00:06.0/i2c-0/0-0009/temp_max<br />
42</p><p>Cleaning Up</p><p>When the I2C chip device is removed from the system, either by the I2C bus driver being unloaded or by the I2C chip driver being unloaded, the I2C core calls the detatch_client function specified in the struct i2c_driver structure. This usually is a simple function, as can be seen in the example driver's implementation:</p><p>static int chip_detach_client(struct i2c_client *client)<br />
{<br />
&nbsp;&nbsp;&nbsp; struct chip_data *data = i2c_get_clientdata(client);<br />
&nbsp;&nbsp;&nbsp; int err;</p><p>&nbsp;&nbsp;&nbsp; err = i2c_detach_client(client);<br />
&nbsp;&nbsp;&nbsp; if (err) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dev_err(&amp;client-&gt;dev,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Client deregistration failed, "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "client not detached.
");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return err;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; kfree(client);<br />
&nbsp;&nbsp;&nbsp; kfree(data);<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}</p><p><br />
As the i2c_attach_client function was called to register the struct i2c_client structure with the I2C core, the i2c_detach_client function must be called to unregister it. If that function succeeds, the memory the driver has allocated for the I2C device then needs to be freed before returning from the function.</p><p>This example driver does not specifically remove the sysfs files from the sysfs core. This step is done automatically in the driver core within the i2c_detach_client function. But if the author would like, the file can be removed manually by a call to device_remove_file</p></div><div class="simplesect" lang="en"><p></p></div><br /><br />			 ]]> 
		</description>
		<category>BRAIN</category>

		<comments>http://nunorock.egloos.com/2542985#comments</comments>
		<pubDate>Thu, 21 Sep 2006 05:30:24 GMT</pubDate>
		<dc:creator>Nuno</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 24 HOURS ]]> </title>
		<link>http://nunorock.egloos.com/2371695</link>
		<guid>http://nunorock.egloos.com/2371695</guid>
		<description>
			<![CDATA[ 
  <br />
일산에서 서울어디든간에 출퇴근시간은 꽤 길다.<br />
<br />
왕복 하루 3시간...<br />
<br />
처음에는 출퇴근 시간이 아까워 책을 보거나 영어 공부를 했지만 결국은 주로 부족한 수면을 채우게 되었다.<br />
<br />
그러다가 ZODIAC이 생긴 이후 지금은 다양한 동영상을 보며 출퇴근을 한다.<br />
<br />
처음에는 주로 영어 강좌나 영화를 보았으나 몇달전부터는 외국 드라마의 재미에 푹 빠져있다.<br />
<br />
일본 드라마인 전차남을 계기로 하여 미국 드라마인 LOST , 한국 드라마 닥터깽까지 오히려 출퇴근시간이 더 길었으면 하는 마음까지 든다. <br />
<br />
그리고 지금은 "24시간"을 보고 있는데 감히 정말 내인생의 최고의 외화시리즈라고 말하고 싶다.<br />
<br />
벌써 시즌 3라는 것이 안타까울 정도이다.<br />
<br />
세계적인 제작사인 FOX사에서 제작한 외화 시리즈로 시즌1을 시작으로 현재 시즌&nbsp; 5까지 스토리가 연결되어 계속이어지며&nbsp; 스릴과&nbsp; 서스펜스&nbsp; 꽉찬 스토리&nbsp; 그리고&nbsp; 끝없이 이어지는 반전에 반전을 거듭하며 명실공히 최고의 드라마의 명성을 이어가고 있다. <br />
<br />
이드라마는 특이하게 드라마상의 1시간과 현실세계의 시간이 맞춰 흘러가며 총24편 24시간 동안의 일들이 시즌마다 이어진다. <br />
<br />
방대한 스케일과 세계를 무대로 사건이 벌어지며 손에 땀을 쥐게 한다.<br />
<br />
누구말대로 엄청난 중독성을 일으키며 집중력을 발휘하도록 만드는 외화이다.<br />
<br />
오늘도 가방에 PDA의 SD카드에 시즌3 17편을 저장하고 퇴근길에 오른다.<br />
<br />
<br /><br />			 ]]> 
		</description>
		<category>LiFe~</category>

		<comments>http://nunorock.egloos.com/2371695#comments</comments>
		<pubDate>Fri, 11 Aug 2006 01:41:03 GMT</pubDate>
		<dc:creator>Nuno</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 서현이가 뒤집어진 날...??!!! ]]> </title>
		<link>http://nunorock.egloos.com/2309479</link>
		<guid>http://nunorock.egloos.com/2309479</guid>
		<description>
			<![CDATA[ 
  <div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds2.egloos.com/pds/1/200607/28/86/c0050086_11274822.jpg" width="500" height="346.875" onclick="Control.Modal.openDialog(this, event, 'http://pds2.egloos.com/pds/1/200607/28/86/c0050086_11274822.jpg');" /></div><br />
<br />
이미 아이를 키워 보신 분들은 웃으시겠지만 아이를 키운다는 것이 보통일은 아니다.<br />
사실 어느정도 각오는 했지만 이렇게 힘들고 멋진일일줄은 몰랐다.<br />
알아야 할것도 많고 배워야 할것도 많다.<br />
힘들고 성가실때도 있지만&nbsp;웃는 아이의 얼굴을 볼때면 태어나서 한번도 느껴보지 못한 카타르시스(?)를 느끼며 모든 것을 잊게 해준다.<br />
처음 서현이가 아빠의 안마를 받으며 까르르~ 웃을때 내 눈시울은 촉촉해져 있었다.<br />
모든 부모들이 그러하겠지만 모든 아이의 처음하는 행동들이 모두 감동이다.<br />
<br />
아직 4달지난 서현이지만 태어날때부터의 사진들을 보면 무척많이 자란것이 느껴진다.<br />
처음에 눈에 초점도 없던 사현이가 웃고 울며 감정 표현을 할줄 안다.<br />
아빠가 너무 앞서서 빨리 걸어서 아빠한테 안기는 모습, "아빠~" 하고 나를 부르는 모습을 기대하지만 한편으로는 지금 이 모든 순간순간들을 놓치고 싶지 않다. 절대 지워지지않는 머리속 메모리에 꼭꼭 저장해놓고 원할때마다 꺼내보고 싶다. 혹 이 한국이라는 사회 분위기에서 둘째가 생기지 않는다면 내 평생 마지막으로 밖에 볼수 없는 모습일지도 모른다. 그 인형보다 작은 조그마한 손과 발(상대적으로 머리는 크다. 모든 아기들이 그러하듯이&nbsp;^ ^), 티끌하나 없이 부드러운 피부의 감촉, 안아주었을때의 아기냄새 이 모든것이&nbsp;내 인생에 딱 한번일수도 있다.<br />
그래서 벌써 많이 퇴화된 머리속 메모리때문에라도 사진을 많이 찍어주려고 한다. 하지만 그건 그많은 기억하고픈 오감중에 단한가지만 그것도 부분적으로 저장해놓을수 있는것이며 자칫하면&nbsp;분실의 염려까지 있다. 냄새와 감촉도 저장할수 있는 매체가 있다면 얼마나 좋을까...&nbsp; 하지만 그렇지 못하기때문에 나의 퇴화되가는 메모리에 아주 진하게 그 느낌들을 남기고 싶다. 잊혀지지 않게.<br />
<br />
서론이 길었다. 사실은&nbsp;처음으로 스스로 뒤집어 누운 서현이의 기록을 위해 자판을 두드린것인데~<br />
서현이도 무언가 아빠 생일선물을 해주고 싶었는지 생일에 맞춰 첫 뒤집기(?)를 성공해 냈다.<br />
생각할수록 기특한것.<br />
다음에는 앉기 다음에는 서기 다음은 걷기의 순서로 자라나가겠지...<br />
<br />
세상 모든 아이들에게 축복을 기원하며 건강하게 자라나가기를 빌어본다.<br />
&nbsp; <br /><br />			 ]]> 
		</description>
		<category>瑞晛</category>

		<comments>http://nunorock.egloos.com/2309479#comments</comments>
		<pubDate>Fri, 28 Jul 2006 03:43:42 GMT</pubDate>
		<dc:creator>Nuno</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Thanks... ]]> </title>
		<link>http://nunorock.egloos.com/2298913</link>
		<guid>http://nunorock.egloos.com/2298913</guid>
		<description>
			<![CDATA[ 
  <div align="left"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds2.egloos.com/pds/1/200607/26/86/c0050086_9493960.jpg" width="300" height="442" onclick="Control.Modal.openDialog(this, event, 'http://pds2.egloos.com/pds/1/200607/26/86/c0050086_9493960.jpg');" /></div><br />
3년전&nbsp;아내와 결혼 했을때 가장 기뻤었던 중의 하나가 처가식구들이었다.</div><div align="left">장인어른, 장모님 모두 좋으신 분들이지만 나는 처제와 처남이 참 좋았다.</div><div align="left">처남은 나보다 4살이나 어리지만 장남 장녀인 나와 아내보다 오히려 어른스럽고 믿음직스러웠고</div><div align="left">처제는 차분하고 항상 남을 배려해주면서 똑 소리나는 것이 오히려&nbsp;아내보다 언니나 친구같아 보였다.</div><div align="left">그리고 그 생각은 지금도 변함이 없다.</div><div align="left">&nbsp;</div><div align="left">핑계일지는 모르지만 뭔가 좀 잘해주고 싶은데 딱히 해줄수 있는것이 그다지 많지가 않은것같다.</div><div align="left">뭐 마음은 알테니 금전적으로&nbsp;좀 해주고 싶은데 월급쟁이 가장인 나로서는 </div><div align="left">생일선물 정도이외는 딱히 해줄 능력이 되지 못해 아쉽울때가 많다.</div><div align="left">누구처럼&nbsp;가끔 용돈은 못 줘도 가끔 갖고 싶어하는게 있으면 사줄수도 있고 선물도 좀 폼나는</div><div align="left">비싼 선물도 사주면서 어깨에 힘도 한번&nbsp;주어보고싶기도 한데 말이다.</div><div align="left">&nbsp;</div><div align="left">특히 요즘들어 처제에게는 너무 고마운 마음을 이루 헤아릴수 없다.</div><div align="left">아내가 출산후 산후조리원을 나와 집에서&nbsp;아직 완쾌 되지않은 몸으로 홀로&nbsp;서현이를 보며</div><div align="left">집안일하는것이 힘겨울때&nbsp;자주와서 집안일을 해주었고</div><div align="left">지금도 짬이 나는대로&nbsp;가정방문(?)(^ ^)을 해주고는 한다.</div><div align="left">가정방문시에는 빈 손으로 오는 법이 없다. 항상 내가 좋아하는 빵과 과일을 사온다.</div><div align="left">냉장고에 과일이 그득하면 아내에게 물어본다. </div><div align="left">&nbsp;</div><div align="left">"오늘 처제 왔다 갔어?"</div><div align="left">"응, 어떻게 알았어?"</div><div align="left">&nbsp;</div><div align="left">나는 한번&nbsp;씨익 웃는다.</div><div align="left">&nbsp;</div><div align="left">그리고 반성을 한다. 나는 처가집에 갈때 거의 빈손이었던것 같다.</div><div align="left">물론 장모님께서 많이 있으니 굳이 사오지말라고는 하셨지만 그래도 그게 아닌데...</div><div align="left">앞으로는&nbsp;아버님 드실 삼겹살이라도 한근 사가지고 가야지 그동안 생각이 모자랐다는 느낌이 든다.</div><div align="left">&nbsp;</div><div align="left">&nbsp;</div><div align="left">처제는&nbsp;우리 서현이를 너무 이뻐해준다.</div><div align="left">물론 이모니까 그러지 않겠냐고 하면 할말은 없지만 </div><div align="left">처제처럼&nbsp;같이 놀아주고 사진 찍어주는 이모를 나는 아직 본 적이 없다.</div><div align="left">누구라도 여가가 생기면 집에서 쉬고 싶은것이 당연지사일텐데 말이다.</div><div align="left">이 역시 처제가 결혼하고 아기가 생겼다면 나 혹은 아내가 그렇게 해주었을까 반성을 해본다.</div><div align="left">&nbsp;</div><div align="left">이런 처제가 오는 시월이면 결혼을 한다.</div><div align="left">&nbsp;무언가 특별한걸 해주고 싶은데 흠 무얼 해주면 좋을까...</div><div align="left">좀 무리해서라도 좋은 축하선물을 해주고 싶은데</div><div align="left">&nbsp;</div><div align="left">&nbsp;</div><div align="left">&nbsp;처제! </div><div align="left">&nbsp;</div><div align="left">&nbsp;이번생일에 사준 AfterShave도 고마워.</div><div align="left">&nbsp;</div><div align="left">그렇지않아도 필요했는데 어떻게 알고... ㅋㅋ</div><div align="left">&nbsp;</div><div align="left">이번에 처제가 인터넷홈쇼핑 시작하면 많이 도와줄께.</div><div align="left">&nbsp;</div><div align="left">&nbsp;내가 말은 않지만 항상 처제한테 고마워하고 있다는거 알쥐? ^ ^</div><div align="left">&nbsp;</div><br /><br />			 ]]> 
		</description>
		<category>LiFe~</category>

		<comments>http://nunorock.egloos.com/2298913#comments</comments>
		<pubDate>Wed, 26 Jul 2006 01:06:09 GMT</pubDate>
		<dc:creator>Nuno</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 아내에게 생일 선물을 받다... ]]> </title>
		<link>http://nunorock.egloos.com/2293524</link>
		<guid>http://nunorock.egloos.com/2293524</guid>
		<description>
			<![CDATA[ 
  <div align="left"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds1.egloos.com/pds/1/200607/25/86/c0050086_9201526.jpg" width="500" height="280.909090909" onclick="Control.Modal.openDialog(this, event, 'http://pds1.egloos.com/pds/1/200607/25/86/c0050086_9201526.jpg');" /></div><br />
<br />
생일이라고 아내가 미리 선물을 준다.<br />
이니셜 팔찌.<br />
두사람의 끝자 영문자가 새겨져 있다.<br />
내 팔찌에는 아내의 이니셜이 먼저, 아내의 팔찌에는 나의 이니셜이 먼저 시작한다.<br />
나름 나는 서로를 먼저 생각하고 배려해주자는 의미로 받아 들인다.<br />
<br />
벌써 결혼한지도 3년이 넘어가고 올해에는 귀여운 공주님도 생겼다.<br />
복덩이 우리 공주님 덕분에 카메라도 장만하게 되고 또 이렇게 늦은 시각까지 블로깅을 하고 있다.<br />
하루하루가 한달한달이 정말 빨리 흘러가는것 같다.<br />
<br />
바쁜 삶속에도 잊지 말아야 할것들이 있겠지.<br />
<br />
<span style="COLOR: #ff0000">사랑한다 ~</span><br />
<br />
<br />
<br />
<a href="http://garden.egloos.com/10001324">이글루스 가든 - 하루에 한장. 사진 일기를 쓰자!</a> </div><br /><br />			 ]]> 
		</description>
		<category>LiFe~</category>

		<comments>http://nunorock.egloos.com/2293524#comments</comments>
		<pubDate>Mon, 24 Jul 2006 18:34:30 GMT</pubDate>
		<dc:creator>Nuno</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 오늘도... ]]> </title>
		<link>http://nunorock.egloos.com/2271394</link>
		<guid>http://nunorock.egloos.com/2271394</guid>
		<description>
			<![CDATA[ 
  <div align="center"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds1.egloos.com/pds/1/200607/20/86/c0050086_917944.jpg" width="426" height="303" onclick="Control.Modal.openDialog(this, event, 'http://pds1.egloos.com/pds/1/200607/20/86/c0050086_917944.jpg');" /></div><br />
매일밤 퇴근길에 집앞에서 항상 만나는 과일노점상... </div><div align="center">&nbsp;</div><div align="center">일산에 살면서 부터 언제부터인가&nbsp;그리 흔히 볼수 있지는 않은 광경이 되어버렸다.</div><div align="center">일산에서만 벌써 세번째 주거지를 옮겼지만 집 바로앞에</div><div align="center">(정확히는 아파트 입구 앞이라는 말이 맞겠지만)&nbsp;</div><div align="center">노점상이 있는 아파트는 이곳이 처음이다.</div><div align="center">항상 신선하고 에누리의 수고를 덜어주며 깔금하고 저렴하게 장을 볼수 있는&nbsp;</div><div align="center">대형 마트를 처음 접했을때&nbsp;그 또 하나의 새로운&nbsp;문명의 이기에 경탄을 금치 못했으나 </div><div align="center">이미 생활화된 지금에는&nbsp;오히려 이런 노점상들을 보면&nbsp;아련한 향수가 일어난다.</div><div align="center">&nbsp;</div><div align="center">가끔 농익은 과일을 팔때도 있고 대형마트보다 싸지도 않지만 </div><div align="center">에누리도 하고 덤으로 하나더 받는 그런 사람냄새가 좋다.</div><br /><br />			 ]]> 
		</description>
		<category>LiFe~</category>

		<comments>http://nunorock.egloos.com/2271394#comments</comments>
		<pubDate>Thu, 20 Jul 2006 00:18:06 GMT</pubDate>
		<dc:creator>Nuno</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 세로그립 공구 ]]> </title>
		<link>http://nunorock.egloos.com/2267551</link>
		<guid>http://nunorock.egloos.com/2267551</guid>
		<description>
			<![CDATA[ 
  그동안 캐논 정품 세로그립을 구입할지 홍콩산 호환을 구입할지 망설이고 있었는데 마침 350D클럽에서 공구를 한다길래&nbsp;과감히 공구 신청.<br />
같은 가격에 호환배터리에 전용LCD후드 까지 이겨내기 힘든 뽐뿌였다.<br />
게다가 전용 후드는 아직 어디서도 파는곳을 보지 못했다.<br />
워낙 헝그리 유저라 돈드는 지름은 망설이고 있었는데 결국 ...<br />
삼각대도 필요하지만 지금 당장 필요치 않다고 자위하며 꿋꿋이 이겨내고 있다.<br />
렌즈 뽐뿌이겨내고 있는 것만해도 대단치 않은가.<br />
<br />
사실 렌즈는 더 많은 내공 증진후 구입할 생각인데 이러다 영원히 못사는게 아닌지...<br />
&nbsp;<br /><br />			 ]]> 
		</description>
		<category>DEVICE</category>

		<comments>http://nunorock.egloos.com/2267551#comments</comments>
		<pubDate>Wed, 19 Jul 2006 05:37:30 GMT</pubDate>
		<dc:creator>Nuno</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 후~ 벌써 덥다. ]]> </title>
		<link>http://nunorock.egloos.com/2246293</link>
		<guid>http://nunorock.egloos.com/2246293</guid>
		<description>
			<![CDATA[ 
  <!--//포토로그 시작//--><div class="photo_photolog" style="margin: 10px 0pt 0pt; width: 100%; text-align: center;"><div class="photo_thumbnail" style="margin: 0pt auto;"><div style="text-align: left;">점심을 먹고 카메라를 들고 회사앞에 나간다.<br />
<br />
날씨는 무척 덥고 습했지만 출퇴근하면서 눈여겨 보던 대나무에 무작정 렌즈를 <br />
들이댄다.<br />
<br />
도심한가운데 심어놓은 대나무라서 그런지 영 구도가 안나온다.<br />
<br />
쯧~ 쯧~ 부족한 실력은 탓할 생각 안하고 또 핑계다.<br />
<br />
이렇게 부족한 내 실력을 탓하고 있을때 문득 눈에 띄는 것이 있다.<br />
<br />
좀 이른듯 하긴 하지만 <span style="color: rgb(51, 51, 255);">잠자리</span> 녀석이 마실을 나와있는것이 아닌가.<br />
<br />
이때다 하고 렌즈를 들이 밀고 연신 셔터를 눌러댄다.<br />
<br />
고마운 놈... 바람이 꽤 불며 가지를 흔들지만 도망가지 않고 계속 포즈를 취해준다. <br />
<br />
<font style="font-weight: bold; color: rgb(255, 0, 0);" size="4">복 받을거다...<br />
<br />
<!--//포토로그 시작//--><div class="photo_photolog" style="margin: 10px 0pt 0pt; width: 100%; text-align: center;"><div class="photo_thumbnail" style="margin: 0pt auto;"><font><a href="http://nunorock.egloos.com/photo/album/13469/204245" title=""><img src="http://pds2.egloos.com/pmf/200607/14/86/c0050086_19581482_t.jpg" alt="" border="0" height="70" width="70" /></a> <a href="http://nunorock.egloos.com/photo/album/13469/204079" title=""><img src="http://pds2.egloos.com/pmf/200607/14/86/c0050086_1825235_t.jpg" alt="" border="0" height="70" width="70" /></a> </font></div><div class="photo_title" style="margin: 0pt auto; font-size: 11px; font-weight: bold;"><font><a href="http://nunorock.egloos.com/photo/13469" title="Insects">+ Insects</a></font></div></div><!--//포토로그 끝//--><br />
</font><br />
<br />
</div>&nbsp; </div></div><br />
<br /><br />			 ]]> 
		</description>
		<category>LiFe~</category>

		<comments>http://nunorock.egloos.com/2246293#comments</comments>
		<pubDate>Fri, 14 Jul 2006 11:21:17 GMT</pubDate>
		<dc:creator>Nuno</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Rain Eater ]]> </title>
		<link>http://nunorock.egloos.com/2239003</link>
		<guid>http://nunorock.egloos.com/2239003</guid>
		<description>
			<![CDATA[ 
  <div align="left"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds1.egloos.com/pds/1/200607/13/86/c0050086_14415738.jpg" width="500" height="326" onclick="Control.Modal.openDialog(this, event, 'http://pds1.egloos.com/pds/1/200607/13/86/c0050086_14415738.jpg');" /></div><br />
</div><div align="center"><br />
비가 도시의 오물들을 모두 씻어 주었다면 오물을 씻어내느라 망신창이가 된 </div><div align="center">비를 모두 삼켜줄 이도 필요하지 않겠는가?</div><div align="center"><br />
이들이 존재치 않는다면 이 빗물도 또한 도시의 다른 오물이 될터이니...</div><div align="center"><br />
그러나 사람들에게는 비만큼이나 존재가치를 인정받지 못하는 것은 </div><div align="center">태생이 비보다 못하여 그러하리라... </div><br /><br />			 ]]> 
		</description>
		<category>LiFe~</category>

		<comments>http://nunorock.egloos.com/2239003#comments</comments>
		<pubDate>Thu, 13 Jul 2006 01:30:28 GMT</pubDate>
		<dc:creator>Nuno</dc:creator>
	</item>
</channel>
</rss>
