日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

i2c--insmod

發布時間:2024/4/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 i2c--insmod 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

micro2440裝備的是at24c08
配置內核的i2c主機控制器驅動
Device Drivers? ---><*> I2C support? --->?I2C Hardware Bus support? ---><M> S3C2410 I2C Driver 。
這里把它配置成模塊形式,并重新編譯燒寫內核。
查看該項目的help:symbol: I2C_S3C2410 [=m],然后再根據Kconfig和Makefile可知對應的原文件是i2c-s3c2410.c。
編譯出的模塊文件是? i2c-s3c2410.ko,將其下載到板子上insmod時出現如下信息:
[root@FriendlyARM plg]# insmod i2c-s3c2410.ko s3c-i2c s3c2440-i2c: slave address 0x10 s3c-i2c s3c2440-i2c: bus frequency set to 98 KHz s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter并生成設備節點/dev/i2c/0....查看i2c-s3c2410.c并沒有發現注冊字符設備(或創建設備節點)的代碼。。。
是在驅動里面使用class_create和device_create然后借助用戶空間mudev自動創建設備節點的。
如下
1.
micro2440的i2c驅動的最外層是platform平臺。在板子設備集合中加入了平臺設備s3c_device_i2c0,它會在板子啟動時注冊。如下
/opt/FriendlyArm/mini2440/linux-2.6.32.2/arch/arm/mach-s3c2440/mach-mini2440.c
static struct platform_device *mini2440_devices[] __initdata = {&s3c_device_usb,&s3c_device_rtc,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c0,//&s3c_device_iis,&mini2440_device_eth,&s3c24xx_uda134x,&s3c_device_nand,&s3c_device_sdi,&s3c_device_usbgadget, };
s3c_device_i2c0如下
arch/arm/plat-s3c/dev-i2c0.c
static struct resource s3c_i2c_resource[] = {[0] = {.start = S3C_PA_IIC,.end = S3C_PA_IIC + SZ_4K - 1,.flags = IORESOURCE_MEM,},[1] = {.start = IRQ_IIC,.end = IRQ_IIC,.flags = IORESOURCE_IRQ,}, };struct platform_device s3c_device_i2c0 = {.name = "s3c2410-i2c", #ifdef CONFIG_S3C_DEV_I2C1.id = 0, #else.id = -1, #endif.num_resources = ARRAY_SIZE(s3c_i2c_resource),.resource = s3c_i2c_resource, };static struct s3c2410_platform_i2c default_i2c_data0 __initdata = {.flags = 0,.slave_addr = 0x10,.frequency = 100*1000,.sda_delay = 100, };
2.平臺驅動s3c24xx_i2c_driver寫在
drivers/i2c/buses/i2c-s3c2410.c
static struct platform_device_id s3c24xx_driver_ids[] = {{.name = "s3c2410-i2c",.driver_data = TYPE_S3C2410,}, {.name = "s3c2440-i2c",.driver_data = TYPE_S3C2440,}, { }, }; MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids);static struct platform_driver s3c24xx_i2c_driver = {.probe = s3c24xx_i2c_probe,.remove = s3c24xx_i2c_remove,.id_table = s3c24xx_driver_ids,.driver = {.owner = THIS_MODULE,.name = "s3c-i2c",.pm = S3C24XX_DEV_PM_OPS,}, };static int __init i2c_adap_s3c_init(void) {return platform_driver_register(&s3c24xx_i2c_driver); }
3.在insmod? i2c-s3c2410.ko 時,platform核心會根據已注冊的設備找到驅動-----名字都是s3c2410-i2c(platform_driver如果有id_table,用id_table里的name;否則用platform_driver里的name,看源碼可知),執行驅動的s3c24xx_i2c_probe,在s3c24xx_i2c_probe函數里面調用i2c_add_numbered_adapter,如下
drivers/i2c/buses/i2c-s3c2410.c
ret = i2c_add_numbered_adapter(&i2c->adap);if (ret < 0) {dev_err(&pdev->dev, "failed to add bus to i2c core\n");goto err_cpufreq;} i2c_add_numbered_adapter是i2c內核的而一個函數,此函數又執行如下動作即注冊adapter
ret = i2c_add_numbered_adapter(&i2c->adap);----->return i2c_register_adapter(adapter);暫停,然后從另一個線索跟進,如下。


i2c-dev.c是一個被編譯進內核的文件--實現用戶空間的接口,設備即外設驅動,如下
Device Drivers? ---><*> I2C support? --->?<*>?? I2C device interface?
static struct i2c_driver i2cdev_driver = {.driver = {.name = "dev_driver",},.attach_adapter = i2cdev_attach_adapter,.detach_adapter = i2cdev_detach_adapter, };static int __init i2c_dev_init(void) {int res;printk(KERN_INFO "i2c /dev entries driver\n");res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops);if (res)goto out;i2c_dev_class = class_create(THIS_MODULE, "i2c-dev");if (IS_ERR(i2c_dev_class)) {res = PTR_ERR(i2c_dev_class);goto out_unreg_chrdev;}res = i2c_add_driver(&i2cdev_driver);if (res)goto out_unreg_class;return 0;out_unreg_class:class_destroy(i2c_dev_class); out_unreg_chrdev:unregister_chrdev(I2C_MAJOR, "i2c"); out:printk(KERN_ERR "%s: Driver Initialisation failed\n", __FILE__);return res; } i2c_dev_init函數里面創建了字符設備,register_chrdev
并且class_create:i2c_dev_class = class_create(THIS_MODULE, "i2c-dev");

當有新的adapter注冊比如i2c_add_numbered_adapter() 時,就會執行?i2cdev_attach_adapter,?
函數實現如下
? ? .attach_adapter?? ?= i2cdev_attach_adapter,
static struct class *i2c_dev_class;static int i2cdev_attach_adapter(struct i2c_adapter *adap) {struct i2c_dev *i2c_dev;int res;i2c_dev = get_free_i2c_dev(adap);if (IS_ERR(i2c_dev))return PTR_ERR(i2c_dev);/* register this i2c device with the driver core */i2c_dev->dev = device_create(i2c_dev_class, &adap->dev,MKDEV(I2C_MAJOR, adap->nr), NULL,"i2c-%d", adap->nr);if (IS_ERR(i2c_dev->dev)) {res = PTR_ERR(i2c_dev->dev);goto error;}res = device_create_file(i2c_dev->dev, &dev_attr_name);if (res)goto error_destroy;pr_debug("i2c-dev: adapter [%s] registered as minor %d\n",adap->name, adap->nr);return 0; error_destroy:device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); error:return_i2c_dev(i2c_dev);return res; } 可看到
?? device_create(i2c_dev_class, &adap->dev,MKDEV(I2C_MAJOR, adap->nr), NULL,"i2c-%d", adap->nr);
從這里可得知借助mdev會創建如/dev/i2c-0設備文件
但是實際上創建的是/dev/i2c/0文件。查看mdev的規則文件可以解答這個問題:
[root@FriendlyARM /]# vi /etc/mdev.conf ... # i2c devices i2c-0 0:0 0666 =i2c/0 i2c-1 0:0 0666 =i2c/1 ... 所以自動創建的設備節點是 /dev/i2c/0
所以如果把上面的一行 i2c-0?????????? 0:0???? 0666??? =i2c/0 注釋掉,那么創建的則是/dev/i2c-0
所以可以得知,只要有adapter注冊,i2c-dev.c都會創建一個設備文件/dev/i2c-xx

轉載于:https://www.cnblogs.com/-song/archive/2011/12/02/3331912.html

總結

以上是生活随笔為你收集整理的i2c--insmod的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。